// Copyright 2016 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package io.v.syncbase;

import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.rules.TemporaryFolder;

import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;

import io.v.syncbase.DatabaseHandle.CollectionOptions;
import io.v.syncbase.exception.SyncbaseException;

import static io.v.syncbase.TestUtil.setUpDatabase;

public class CollectionTest {
    @Rule
    public final TemporaryFolder folder = new TemporaryFolder();
    @Rule
    public ExpectedException thrown = ExpectedException.none();

    private static final Executor sameThreadExecutor = new Executor() {
        public void execute(Runnable runnable) {
            runnable.run();
        }
    };

    @Before
    public void setUp() throws IOException, InterruptedException, ExecutionException,
            SyncbaseException {
        setUpDatabase(folder.newFolder());
    }

    @After
    public void tearDown() {
        Syncbase.shutdown();
    }

    @Test
    public void badName() throws SyncbaseException,
            ExecutionException, InterruptedException {
        thrown.expect(IllegalArgumentException.class);
        thrown.expectMessage("invalid name");

        // Create with invalid name
        Syncbase.database().createNamedCollection("name with spaces", new CollectionOptions());
    }

    @Test
    public void attemptGetSyncgroupWithinBatch() throws SyncbaseException,
            ExecutionException, InterruptedException {
        BatchDatabase batch = Syncbase.database().beginBatch(new Database.BatchOptions());

        // Create collection without a syncgroup
        Collection collection = batch.createCollection(
                new CollectionOptions().setWithoutSyncgroup(true));

        thrown.expect(IllegalArgumentException.class);
        thrown.expectMessage("Must not call getSyncgroup within batch");
        collection.getSyncgroup();
    }
}
