public IEnumerator TestImport()
        {
            UnityThread.Initialize();
            var store = new DummyStore();

            yield return(InitStore(store));

            var listeners = new List <TaskListener <DummyIndex> >()
            {
                new TaskListener <DummyIndex>(),
                new TaskListener <DummyIndex>(),
                new TaskListener <DummyIndex>()
            };

            for (int i = 0; i < listeners.Count; i++)
            {
                yield return(WaitImport(store, i, listeners[i]));

                var value = listeners[i].Value;
                Assert.IsNotNull(value);
                Assert.AreEqual($"00000000-0000-0000-0000-00000000000{i}", value.Id.ToString());
                Assert.AreEqual($"Name{i}", value.Name);
                Assert.AreEqual(i, value.Age);
                Assert.AreEqual(i % 2 == 1, value.IsVerified);
            }
            Assert.AreEqual(3, store.Count);
        }
        public IEnumerator TestInitialize()
        {
            UnityThread.Initialize();
            var store = new DummyStore();

            yield return(InitStore(store));
        }
        private IEnumerator InitStore(DummyStore store, int expectedCount = 0)
        {
            var listener = new TaskListener();

            store.Reload(listener).Wait();
            yield return(null);

            Assert.AreEqual(1f, listener.Progress, 0.00001f);
            Assert.AreEqual(expectedCount, store.Count);
        }
        public IEnumerator TestDelete()
        {
            UnityThread.Initialize();
            var store = new DummyStore();

            yield return(InitStore(store));

            var listeners = new List <TaskListener <DummyIndex> >()
            {
                new TaskListener <DummyIndex>(),
                new TaskListener <DummyIndex>(),
                new TaskListener <DummyIndex>()
            };

            for (int i = 0; i < listeners.Count; i++)
            {
                yield return(WaitImport(store, i, listeners[i]));

                var value = listeners[i].Value;
                Assert.IsNotNull(value);
                Assert.AreEqual($"00000000-0000-0000-0000-00000000000{i}", value.Id.ToString());
                Assert.AreEqual($"Name{i}", value.Name);
                Assert.AreEqual(i, value.Age);
                Assert.AreEqual(i % 2 == 1, value.IsVerified);
            }
            Assert.AreEqual(3, store.Count);

            var removeList = new List <DummyIndex>();

            store.OnRemoveData += (removed) => removeList.Add(removed);

            store.Delete(listeners[2].Value);
            Assert.AreEqual(2, store.Count);
            Assert.IsNotNull(removeList[0]);
            Assert.AreEqual($"00000000-0000-0000-0000-000000000002", removeList[0].Id.ToString());
            Assert.AreEqual($"Name2", removeList[0].Name);
            Assert.AreEqual(2, removeList[0].Age);
            Assert.AreEqual(false, removeList[0].IsVerified);

            store.DeleteAll();
            Assert.AreEqual(1, removeList.Count);
            Assert.AreEqual(0, store.Count);
            for (int i = 0; i < 3; i++)
            {
                Assert.IsFalse(GetDataDirectory(i).Exists);
            }
        }
        public IEnumerator TestReload()
        {
            UnityThread.Initialize();
            var store = new DummyStore();

            yield return(InitStore(store));

            var listeners = new List <TaskListener <DummyIndex> >()
            {
                new TaskListener <DummyIndex>(),
                new TaskListener <DummyIndex>(),
                new TaskListener <DummyIndex>()
            };

            for (int i = 0; i < listeners.Count; i++)
            {
                yield return(WaitImport(store, i, listeners[i]));

                var value = listeners[i].Value;
                Assert.IsNotNull(value);
                Assert.AreEqual(GetDataDirectory(i).FullName, value.Directory.FullName);
                Assert.AreEqual($"00000000-0000-0000-0000-00000000000{i}", value.Id.ToString());
                Assert.AreEqual($"Name{i}", value.Name);
                Assert.AreEqual(i, value.Age);
                Assert.AreEqual(i % 2 == 1, value.IsVerified);
            }
            Assert.AreEqual(3, store.Count);

            store = new DummyStore(false);
            yield return(InitStore(store, 3));

            Assert.AreEqual(3, store.Count);
            int count = 0;

            foreach (var value in store.GetAll())
            {
                Assert.IsNotNull(value);
                Assert.AreEqual(GetDataDirectory(count).FullName, value.Directory.FullName);
                Assert.AreEqual($"00000000-0000-0000-0000-00000000000{count}", value.Id.ToString());
                Assert.AreEqual($"Name{count}", value.Name);
                Assert.AreEqual(count, value.Age);
                Assert.AreEqual(count % 2 == 1, value.IsVerified);
                count++;
            }
        }
        public IEnumerator TestGet()
        {
            UnityThread.Initialize();
            var store = new DummyStore();

            yield return(InitStore(store));

            var listeners = new List <TaskListener <DummyIndex> >()
            {
                new TaskListener <DummyIndex>(),
                new TaskListener <DummyIndex>(),
                new TaskListener <DummyIndex>()
            };

            for (int i = 0; i < listeners.Count; i++)
            {
                yield return(WaitImport(store, i, listeners[i]));

                var value = listeners[i].Value;
                Assert.IsNotNull(value);
                Assert.AreEqual($"00000000-0000-0000-0000-00000000000{i}", value.Id.ToString());
                Assert.AreEqual($"Name{i}", value.Name);
                Assert.AreEqual(i, value.Age);
                Assert.AreEqual(i % 2 == 1, value.IsVerified);
            }
            Assert.AreEqual(3, store.Count);

            int index = 1;

            foreach (var data in store.Get(query => query.WhereNonIndexed(d => d["Age"].Value <int>() > 0)))
            {
                Assert.IsNotNull(data);
                Assert.AreEqual($"00000000-0000-0000-0000-00000000000{index}", data.Id.ToString());
                Assert.AreEqual($"Name{index}", data.Name);
                Assert.AreEqual(index, data.Age);
                Assert.AreEqual(index % 2 == 1, data.IsVerified);
                index++;
            }
        }
        private IEnumerator WaitImport(DummyStore store, int index, TaskListener <DummyIndex> listener)
        {
            // New data callback
            DummyIndex          loadedData = null;
            Action <DummyIndex> onNewData  = d => loadedData = d;

            // Load completion callback
            bool loaded = false;

            listener.OnFinished += delegate { loaded = true; };

            // Start importing
            store.OnNewData += onNewData;
            store.Import(GetDataFile(index), false, listener);
            while (!loaded)
            {
                yield return(null);
            }
            store.OnNewData -= onNewData;

            // Checking
            Assert.AreEqual(1f, listener.Progress, 0.0000001f);
            Assert.AreEqual(loadedData, listener.Value);
        }