Ejemplo n.º 1
0
        public void AddBeforeAndAfterSerializationAndDeserialization()
        {
            var storage = new InMemoryStorageEngine();
            var os      = ObjectStore.New(storage);

            var l = new CAppendOnlyList <int> {
                1
            };

            l.ToArray()[0].ShouldBe(1);

            os.Entangle(l);
            os.Persist();

            os = ObjectStore.Load(storage, true);
            l  = os.Resolve <CAppendOnlyList <int> >();

            l.ToArray().Length.ShouldBe(1);
            l.ToArray()[0].ShouldBe(1);

            l.Add(2);

            l.ToArray().Length.ShouldBe(2);
            l.ToArray()[0].ShouldBe(1);
            l.ToArray()[1].ShouldBe(2);

            os.Persist();
            os = ObjectStore.Load(storage, true);
            l  = os.Resolve <CAppendOnlyList <int> >();

            l.ToArray().Length.ShouldBe(2);
            l.ToArray()[0].ShouldBe(1);
            l.ToArray()[1].ShouldBe(2);
        }
Ejemplo n.º 2
0
        public void DependentOperatorsAreNotDeserializedForEphemeralOperator()
        {
            var storage = new InMemoryStorageEngine();
            var os      = ObjectStore.New(storage);

            var source      = new Source <int>();
            var valueHolder = new ValueHolder <int>();

            source.Ephemeral().CallOnEvent(valueHolder.SetValue);

            source.Emit(10);
            valueHolder.Value.ShouldBe(10);

            os.Entangle(source);
            os.Entangle(valueHolder);

            os.Persist();

            os          = ObjectStore.Load(storage, true);
            source      = os.Resolve <Source <int> >();
            valueHolder = os.Resolve <ValueHolder <int> >();

            source.Emit(20);
            valueHolder.Value.ShouldBe(10);
        }
Ejemplo n.º 3
0
        public void SerializeAndDeserializeStateWorksDetectsCircularDependencyOnDeserialization()
        {
            var storageEngine       = new InMemoryStorageEngine();
            var roots               = new Roots2();
            var serializerFactories = SerializerFactories.Default;
            var mps = new MapAndSerializers(serializerFactories);

            mps.GetOrCreateSerializerFor(roots);

            var p1 = new Person {
                Name = "Peter"
            };
            var p2 = new Person {
                Name = "Ole"
            };

            p1.Sibling = p2;
            p2.Sibling = p1;

            roots.Entangle(p1);

            var persister = new Persister2(storageEngine, mps);

            persister.DetectAndPersistChanges();

            try
            {
                Deserializer2.Load(storageEngine, new Ephemerals(), serializerFactories);
            }
            catch (CircularDependencyException2 e)
            {
                e.CircularPath.Count().ShouldBe(3);
            }
        }
Ejemplo n.º 4
0
        public void SerializeAndDeserializePersonWithParent()
        {
            var storageEngine = new InMemoryStorageEngine();
            var os            = ObjectStore.New(storageEngine);

            var parent = new Person()
            {
                Name = "Oldy", Parent = null
            };
            var child = new Person()
            {
                Name = "Childy", Parent = parent
            };

            os.Entangle(child);
            os.Persist();

            os = ObjectStore.Load(storageEngine);
            var pChild  = os.Resolve <Person>();
            var pParent = pChild.Parent;

            pChild.Name.ShouldBe("Childy");
            pParent.Name.ShouldBe("Oldy");
            pParent.Parent.ShouldBeNull();

            pChild.Parent = null;
            os.Persist();

            os     = ObjectStore.Load(storageEngine);
            pChild = os.Resolve <Person>();
            pChild.Parent.ShouldBeNull();
        }
Ejemplo n.º 5
0
        public void ChangeTrackerWithAddedElementsRemovedOverSeveralSynchronizations()
        {
            var storage = new InMemoryStorageEngine();
            var os      = ObjectStore2.New(storage);

            var ctw = new ChangeTrackerWrapper();

            os.Roots.Entangle(ctw);

            ctw.ChangeTracker.Append(1);
            ctw.ChangeTracker.Append(2);
            ctw.ChangeTracker.Append(3);
            ctw.ChangeTracker.Prepend(0);

            os.Persist();

            os  = ObjectStore2.Load(storage);
            ctw = os.Roots.Find <ChangeTrackerWrapper>();

            ctw.ValuesFromHead().SequenceEqual(new[] { 0, 1, 2, 3 }).ShouldBeTrue();
            ctw.ValuesFromTail().SequenceEqual(new[] { 3, 2, 1, 0 }).ShouldBeTrue();

            ctw.ChangeTracker.Head.Next.Remove();

            os.Persist();

            os  = ObjectStore2.Load(storage);
            ctw = os.Roots.Find <ChangeTrackerWrapper>();

            ctw.ValuesFromHead().SequenceEqual(new[] { 0, 2, 3 }).ShouldBeTrue();
            ctw.ValuesFromTail().SequenceEqual(new[] { 3, 2, 0 }).ShouldBeTrue();
        }
Ejemplo n.º 6
0
        public void CreatedOperatorSurvivesRestart()
        {
            var storage = new InMemoryStorageEngine();
            var source  = new Source <int>();
            var holder  = new ValueHolder();
            var emitter = new ValueEmitter(source.Scan(0, (akk, i) => akk + i), holder);
            var store   = ObjectStore.New(storage);

            source.Emit(1);
            source.Emit(2);

            holder.Value.ShouldBe(3);

            store.Entangle(source);
            store.Entangle(holder);

            store.Persist();

            store  = ObjectStore.Load(storage, true, new MockScheduler());
            source = store.Resolve <Source <int> >();
            holder = store.Resolve <ValueHolder>();
            holder.Value.ShouldBe(3);

            source.Emit(1);
            holder.Value.ShouldBe(4);
        }
Ejemplo n.º 7
0
        public void UntilWorksTest()
        {
            var storage         = new InMemoryStorageEngine();
            var executionEngine = ExecutionEngineFactory.StartNew(storage);

            executionEngine.Schedule(() =>
            {
                var holder = new UntilTestHolder();
                var task   = holder.Start();
                Roots.Entangle(holder);
                Roots.Entangle(task);
                return(Sync.Next());
            }).Wait();

            executionEngine.Dispose();

            executionEngine = ExecutionEngineFactory.Continue(storage);

            executionEngine.Schedule(() =>
            {
                var holder  = Roots.Resolve <UntilTestHolder>();
                holder.Stop = true;
                return(Roots.Resolve <CTask>());
            }).Wait();

            var completed = executionEngine.Schedule(() => Roots.Resolve <UntilTestHolder>().Completed).Result;

            completed.ShouldBe(true);
        }
Ejemplo n.º 8
0
        public void CountOperatorTest()
        {
            var storage = new InMemoryStorageEngine();
            var os      = ObjectStore.New(storage);

            var source      = new Source <int>();
            var valueHolder = new ValueHolder <int>();

            source.Count().CallOnEvent(valueHolder.SetValue);

            source.Emit(0);
            valueHolder.Value.ShouldBe(1);

            source.Emit(0);
            valueHolder.Value.ShouldBe(2);

            os.Entangle(source);
            os.Entangle(valueHolder);

            os.Persist();

            os          = ObjectStore.Load(storage);
            source      = os.Resolve <Source <int> >();
            valueHolder = os.Resolve <ValueHolder <int> >();

            source.Emit(0);
            valueHolder.Value.ShouldBe(3);
        }
        public void StreamOperatorsAreGarbageCollectedOnSingleSubscriptionDisposal()
        {
            var storage = new InMemoryStorageEngine();
            var source  = new Source <int>();
            var staticNonPersistable = new StaticAndNonStaticValue();

            staticNonPersistable.SetUpSubscription(source);

            source.Emit(25);
            staticNonPersistable.Value.ShouldBe(25);
            StaticAndNonStaticValue.StaticValue.ShouldBe(25);

            var store = ObjectStore.New(storage);

            store.Entangle(source);
            store.Entangle(staticNonPersistable);
            store.Persist();

            store  = ObjectStore.Load(storage, true, new MockScheduler());
            source = store.Resolve <Source <int> >();
            staticNonPersistable = store.Resolve <StaticAndNonStaticValue>();

            source.Emit(50);
            staticNonPersistable.Value.ShouldBe(50);
            StaticAndNonStaticValue.StaticValue.ShouldBe(50);
            staticNonPersistable.Subscription1.Dispose();

            source.Emit(100);
            staticNonPersistable.Value.ShouldBe(50);
            StaticAndNonStaticValue.StaticValue.ShouldBe(50);
        }
Ejemplo n.º 10
0
        public void SerializeAndDeserializeStateWorksDetectsNonCircularDependencyOnDeserialization()
        {
            var storageEngine       = new InMemoryStorageEngine();
            var roots               = new Roots2();
            var serializerFactories = SerializerFactories.Default;
            var mps = new MapAndSerializers(serializerFactories);

            mps.GetOrCreateSerializerFor(roots);

            var p1 = new Person {
                Name = "Peter"
            };
            var p2 = new Person {
                Name = "Ole"
            };

            p1.Sibling = p2;

            roots.Entangle(p1);

            var persister = new Persister2(storageEngine, mps);

            persister.DetectAndPersistChanges();

            var(r, _) = Deserializer2.Load(storageEngine, new Ephemerals(), serializerFactories);
            var p = r.Find <Person>();

            p.Name.ShouldBe("Peter");
            p.Sibling.Name.ShouldBe("Ole");
        }
        public void AddAndRemoveNonReferencingElementsFromCList()
        {
            var storage = new InMemoryStorageEngine();
            var os      = ObjectStore2.New(storage);

            var cList = new CList <string>();

            cList.Add("hello");
            cList.Add("world");
            cList.Add("from here");

            os.Roots.Entangle(cList);
            os.Persist();

            os    = ObjectStore2.Load(storage);
            cList = os.Roots.Find <CList <string> >();
            cList.Count.ShouldBe(3);
            cList[0].ShouldBe("hello");
            cList[1].ShouldBe("world");
            cList[2].ShouldBe("from here");

            cList.Remove(0);

            os.Persist();

            os    = ObjectStore2.Load(storage);
            cList = os.Roots.Find <CList <string> >();
            cList.Count.ShouldBe(2);
            cList[0].ShouldBe("world");
            cList[1].ShouldBe("from here");
            cList.Remove(1);

            os.Persist();

            os    = ObjectStore2.Load(storage);
            cList = os.Roots.Find <CList <string> >();
            cList.Count.ShouldBe(1);
            cList[0].ShouldBe("world");
            cList.Add("hello");

            os.Persist();

            os    = ObjectStore2.Load(storage);
            cList = os.Roots.Find <CList <string> >();
            cList.Count.ShouldBe(2);
            cList[0].ShouldBe("world");
            cList[1].ShouldBe("hello");

            cList.Remove(0);
            cList.Remove(0);

            os.Persist();

            os    = ObjectStore2.Load(storage);
            cList = os.Roots.Find <CList <string> >();
            cList.Count.ShouldBe(0);
        }
        public void AddAndRemovedEntriesFromDictionary()
        {
            var storage = new InMemoryStorageEngine();
            var os      = ObjectStore2.New(storage);
            var s       = new CSet <Person>();

            os.Roots.Entangle(s);

            var peter = new Person {
                Name = "Peter"
            };
            var ole = new Person {
                Name = "Ole", Relationship = peter
            };

            s.Add(peter);
            s.Add(ole);

            os.Persist();

            os = ObjectStore2.Load(storage);
            s  = os.Roots.Find <CSet <Person> >();

            s.Count.ShouldBe(2);
            peter = s.Single(p => p.Name == "Peter");
            ole   = s.Single(p => p.Name == "Ole");

            ole.Relationship.ShouldBe(peter);

            s.Remove(ole);
            os.Persist();

            os = ObjectStore2.Load(storage);
            s  = os.Roots.Find <CSet <Person> >();

            s.Count.ShouldBe(1);
            peter = s.Single(p => p.Name == "Peter");
            s.Add(peter);

            s.Count.ShouldBe(1);

            os.Persist();
            os = ObjectStore2.Load(storage);
            s  = os.Roots.Find <CSet <Person> >();

            s.Count.ShouldBe(1);
            peter = s.Single(p => p.Name == "Peter");
            s.Remove(peter);

            os.Persist();

            os = ObjectStore2.Load(storage);
            s  = os.Roots.Find <CSet <Person> >();
            s.Count.ShouldBe(0);
        }
Ejemplo n.º 13
0
        public void AddAndRemovedEntriesFromDictionary()
        {
            var storage = new InMemoryStorageEngine();
            var os      = ObjectStore2.New(storage);
            var d       = new CDictionary <string, Person>();

            os.Roots.Entangle(d);

            d["101020"] = new Person {
                Name = "Peter"
            };
            d["311209"] = new Person {
                Name = "Ole", Relationship = d["101020"]
            };

            os.Persist();

            os = ObjectStore2.Load(storage);
            d  = os.Roots.Find <CDictionary <string, Person> >();

            d.Count.ShouldBe(2);
            d["101020"].Name.ShouldBe("Peter");
            d["101020"].Relationship.ShouldBeNull();

            d["311209"].Name.ShouldBe("Ole");
            d["311209"].Relationship.Name.ShouldBe("Peter");

            d.Remove("311209");

            os.Persist();
            os = ObjectStore2.Load(storage);
            d  = os.Roots.Find <CDictionary <string, Person> >();

            d.Count.ShouldBe(1);
            d["101020"].Name.ShouldBe("Peter");
            d["101020"].Relationship.ShouldBeNull();
            d["311209"] = d["101020"];

            os.Persist();
            os = ObjectStore2.Load(storage);
            d  = os.Roots.Find <CDictionary <string, Person> >();

            d.Count.ShouldBe(2);
            d["101020"].ShouldBe(d["311209"]);

            d.Remove("101020");
            d.Remove("311209");

            os.Persist();
            os = ObjectStore2.Load(storage);
            d  = os.Roots.Find <CDictionary <string, Person> >();

            d.Count.ShouldBe(0);
        }
Ejemplo n.º 14
0
        public void SchedulerContinuesDespiteExecutingMethodDoesNotCatchingThrownException()
        {
            var storage   = new InMemoryStorageEngine();
            var scheduler = ExecutionEngine.ExecutionEngineFactory.StartNew(storage);

            scheduler.Schedule(() => throw new NotImplementedException());

            var task = scheduler.Schedule(() => 1);

            task.Result.ShouldBe(1);

            scheduler.Dispose();
        }
        //[TestMethod]
        public void SentMessageIsProcessed()
        {
            var       hostname = "127.0.0.1";
            const int port     = 10_000;

            var storage    = new InMemoryStorageEngine();
            var scheduler1 = ExecutionEngineFactory.StartNew(storage);

            scheduler1.Schedule(() =>
            {
                var msgHandler         = new MessageHandler();
                var connectionListener = new ConnectionServer(hostname, port, msgHandler.Handle);

                Roots.Entangle(msgHandler);
                Roots.Entangle(connectionListener);
            });

            var senderId  = Guid.Empty;
            var msgSender = new TestMessageSender(hostname, port, senderId);

            msgSender.Connect();
            msgSender.SendMessage("HELLO".GetUtf8Bytes(), 0);
            Thread.Sleep(1000);

            var messageHandler = scheduler1.Resolve <MessageHandler>().Result;
            var messages       = messageHandler.GetMessages();

            messages.Count.ShouldBe(1);
            messages[0].ShouldBe("HELLO");

            scheduler1.Do <ConnectionServer>(c => c.Shutdown());

            Thread.Sleep(1000);

            scheduler1.Dispose();
            scheduler1     = ExecutionEngineFactory.Continue(storage);
            messageHandler = scheduler1.Resolve <MessageHandler>().Result;
            Console.WriteLine(messageHandler);

            msgSender = new TestMessageSender(hostname, port, senderId);
            msgSender.Connect();
            msgSender.SendMessage("HELLO2".GetUtf8Bytes(), 1);
            Thread.Sleep(1000);

            messages = messageHandler.GetMessages();
            messages.Count.ShouldBe(2);
            messages[0].ShouldBe("HELLO");
            messages[1].ShouldBe("HELLO2");

            scheduler1.Dispose();
        }
Ejemplo n.º 16
0
        public void EnqueueAndDequeueFromCQueue()
        {
            var storage = new InMemoryStorageEngine();
            var os      = ObjectStore2.New(storage);

            var cQueue = new CQueue <string>();

            cQueue.Enqueue("hello");
            cQueue.Enqueue("world");
            cQueue.Enqueue("from here");

            os.Roots.Entangle(cQueue);

            os.Persist();
            os     = ObjectStore2.Load(storage);
            cQueue = os.Roots.Find <CQueue <string> >();

            cQueue.Count.ShouldBe(3);

            var dequeued = cQueue.Dequeue();

            dequeued.ShouldBe("hello");

            os.Persist();


            os     = ObjectStore2.Load(storage);
            cQueue = os.Roots.Find <CQueue <string> >();

            cQueue.Count.ShouldBe(2);

            cQueue.Dequeue().ShouldBe("world");
            cQueue.Dequeue().ShouldBe("from here");

            cQueue.Enqueue("hello");

            os.Persist();

            os     = ObjectStore2.Load(storage);
            cQueue = os.Roots.Find <CQueue <string> >();

            cQueue.Count.ShouldBe(1);
            cQueue.Dequeue().ShouldBe("hello");

            os.Persist();

            os     = ObjectStore2.Load(storage);
            cQueue = os.Roots.Find <CQueue <string> >();
            cQueue.Count.ShouldBe(0);
        }
        public void PinnedOperatorsAreNotGarbageCollected()
        {
            var storage = new InMemoryStorageEngine();

            var source      = new Source <int>();
            var valueHolder = new ValueHolder();

            var stream             = source.Do(valueHolder.SetValue).Pin();
            var subscriptionHolder = new SubscriptionHolder(stream);

            source.Emit(25);

            valueHolder.Value.ShouldBe(25);
            subscriptionHolder.Value.ShouldBe(25);

            var store = ObjectStore.New(storage);

            store.Entangle(source);
            store.Entangle(valueHolder);
            store.Entangle(subscriptionHolder);
            store.Persist();

            store              = ObjectStore.Load(storage, true, new MockScheduler());
            source             = store.Resolve <Source <int> >();
            valueHolder        = store.Resolve <ValueHolder>();
            subscriptionHolder = store.Resolve <SubscriptionHolder>();
            source.Emit(100);

            valueHolder.Value.ShouldBe(100);
            subscriptionHolder.Value.ShouldBe(100);

            subscriptionHolder.Subscription.Dispose();

            source.Emit(200);

            valueHolder.Value.ShouldBe(200);
            subscriptionHolder.Value.ShouldBe(100);

            store.Persist();

            store              = ObjectStore.Load(storage, true, new MockScheduler());
            source             = store.Resolve <Source <int> >();
            valueHolder        = store.Resolve <ValueHolder>();
            subscriptionHolder = store.Resolve <SubscriptionHolder>();
            source.Emit(300);

            valueHolder.Value.ShouldBe(300);
            subscriptionHolder.Value.ShouldBe(100);
        }
Ejemplo n.º 18
0
        public void SerializeAndDeserializeEmptyList()
        {
            var storage = new InMemoryStorageEngine();
            var os      = ObjectStore.New(storage);

            var l = new CAppendOnlyList <int>();

            l.ToArray().Length.ShouldBe(0);

            os.Entangle(l);
            os.Persist();

            os = ObjectStore.Load(storage, true);
            l  = os.Resolve <CAppendOnlyList <int> >();

            l.ToArray().Length.ShouldBe(0);
        }
Ejemplo n.º 19
0
        public static void Do()
        {
            var storageEngine   = new InMemoryStorageEngine();
            var executionEngine = ExecutionEngineFactory.StartNew(storageEngine);

            executionEngine.Schedule(() =>
            {
                var network = new Network();
                var source  = new Source <object>();
                Roots.Entangle(source);

                var proposer = new PaxosProposer(source, network);
                _            = proposer.StartRound("hello", 0);

                _ = OutsideFlow(source, network);
            });
        }
Ejemplo n.º 20
0
        public void ChangeTrackerWithNoChangesCanBePersistedAndLoadedAgain()
        {
            var storage = new InMemoryStorageEngine();
            var os      = ObjectStore2.New(storage);

            var ctw = new ChangeTrackerWrapper();

            os.Roots.Entangle(ctw);

            os.Persist();

            os  = ObjectStore2.Load(storage);
            ctw = os.Roots.Find <ChangeTrackerWrapper>();

            ctw.ValuesFromHead().Count().ShouldBe(0);
            ctw.ValuesFromTail().Count().ShouldBe(0);
        }
        public void AsyncVoidMethodCanBeSerialized()
        {
            var storage = new InMemoryStorageEngine();
            var os      = ObjectStore.New(storage);

            var a1    = new CAwaitable();
            var a2    = new CAwaitable();
            var tuple = new PTuple <CAwaitable, CAwaitable>(a1, a2);
            var value = new PValue <int>();

            AsyncMethodTest(a1, a2, value);

            os.Entangle(tuple);
            os.Entangle(value);
            os.Persist();

            os    = ObjectStore.Load(storage, true);
            tuple = os.Resolve <PTuple <CAwaitable, CAwaitable> >();
            value = os.Resolve <PValue <int> >();

            value.Value.ShouldBe(-1);

            tuple.First.SignalCompletion();
            value.Value.ShouldBe(1);

            os.Persist();

            os    = ObjectStore.Load(storage, true);
            tuple = os.Resolve <PTuple <CAwaitable, CAwaitable> >();
            value = os.Resolve <PValue <int> >();

            value.Value.ShouldBe(1);

            tuple.Second.SignalCompletion();

            value.Value.ShouldBe(2);

            os.Persist();

            os    = ObjectStore.Load(storage, true);
            tuple = os.Resolve <PTuple <CAwaitable, CAwaitable> >();
            value = os.Resolve <PValue <int> >();

            value.Value.ShouldBe(2);
        }
Ejemplo n.º 22
0
        public static void Do()
        {
            var storageEngine = new InMemoryStorageEngine();
            var engine        = Start(storageEngine);

            while (true)
            {
                Console.WriteLine("Press enter to stop");
                Console.ReadLine();

                engine.Dispose();

                Console.WriteLine("Press enter to start");
                Console.ReadLine();

                engine = Continue(storageEngine);
            }
        }
Ejemplo n.º 23
0
        public void SerializeAndDeserializeSimpleDisplayClass()
        {
            var storageEngine = new InMemoryStorageEngine();
            var os            = ObjectStore2.New(storageEngine);

            var wrapper = new Wrapper()
            {
                Text = "World"
            };
            var greeter = wrapper.Greeter("Hello");

            os.Roots.Entangle(greeter);
            os.Persist();

            os      = ObjectStore2.Load(storageEngine);
            greeter = os.Roots.Find <Func <string> >();
            greeter().ShouldBe("Hello World");
        }
Ejemplo n.º 24
0
        public void EmptyMessageQueueCanBeSerializeAndDeserialized()
        {
            var storage = new InMemoryStorageEngine();
            var c       = ExecutionEngineFactory.StartNew(storage);

            c.Schedule(() =>
            {
                var q = new MessageQueue();
                Roots.Entangle(q);
            });

            c.Sync().Wait();

            c.Dispose();

            c = ExecutionEngineFactory.Continue(storage);
            c.Schedule(Roots.Resolve <MessageQueue>);
            c.Sync().Wait();
        }
Ejemplo n.º 25
0
        public void SubscriptionIsDisposedAfterAwaitableCompletes()
        {
            var storage = new InMemoryStorageEngine();
            var os      = ObjectStore.New(storage);

            var source      = new Source <int>();
            var awaitable   = new CAwaitable();
            var valueHolder = new ValueHolder <int>();

            source.DisposeOn(awaitable).CallOnEvent(valueHolder.SetValue);

            source.Emit(1);
            valueHolder.Value.ShouldBe(1);

            os.Entangle(source);
            os.Entangle(awaitable);
            os.Entangle(valueHolder);

            os.Persist();

            os          = ObjectStore.Load(storage, true);
            source      = os.Resolve <Source <int> >();
            awaitable   = os.Resolve <CAwaitable>();
            valueHolder = os.Resolve <ValueHolder <int> >();

            source.Emit(2);
            valueHolder.Value.ShouldBe(2);

            awaitable.SignalCompletion();

            source.Emit(3);
            valueHolder.Value.ShouldBe(2);

            os.Persist();

            os          = ObjectStore.Load(storage, true);
            source      = os.Resolve <Source <int> >();
            awaitable   = os.Resolve <CAwaitable>();
            valueHolder = os.Resolve <ValueHolder <int> >();

            source.Emit(4);
            valueHolder.Value.ShouldBe(2);
        }
Ejemplo n.º 26
0
        public void StreamObserversAreDeserialized()
        {
            var storage     = new InMemoryStorageEngine();
            var source      = new Source <int>();
            var valueHolder = new ValueHolder();

            source.Select(_ => _).CallOnEvent(valueHolder.SetValue);
            var store = ObjectStore.New(storage);

            store.Entangle(source);
            store.Entangle(valueHolder);
            store.Persist();

            store       = ObjectStore.Load(storage, true, (IScheduler) new MockScheduler());
            source      = store.Resolve <Source <int> >();
            valueHolder = store.Resolve <ValueHolder>();
            source.Emit(123);
            valueHolder.Value.ShouldBe(123);
        }
        public void AddAndRemoveElementsFromList()
        {
            var storage = new InMemoryStorageEngine();
            var os      = ObjectStore2.New(storage);
            var wrapper = new Wrapper();

            os.Roots.Entangle(wrapper);

            os.Persist();
            os      = ObjectStore2.Load(storage);
            wrapper = os.Roots.Find <Wrapper>();

            wrapper.List.Count.ShouldBe(0);

            wrapper.List.Add("hello");
            wrapper.List.Add("world");

            os.Persist();
            os      = ObjectStore2.Load(storage);
            wrapper = os.Roots.Find <Wrapper>();

            wrapper.List.Count.ShouldBe(2);
            wrapper.List[0].ShouldBe("hello");
            wrapper.List[1].ShouldBe("world");

            wrapper.List.RemoveAt(0);

            os.Persist();
            os      = ObjectStore2.Load(storage);
            wrapper = os.Roots.Find <Wrapper>();

            wrapper.List.Count.ShouldBe(1);
            wrapper.List[0].ShouldBe("world");

            wrapper.List.Clear();

            os.Persist();
            os      = ObjectStore2.Load(storage);
            wrapper = os.Roots.Find <Wrapper>();

            wrapper.List.Count.ShouldBe(0);
        }
Ejemplo n.º 28
0
        public void SerializeAndDeserializeExceptions()
        {
            var storageEngine = new InMemoryStorageEngine();
            var os            = ObjectStore2.New(storageEngine);

            var innerException = new InvalidCastException("cast was not possible");
            var outerException = new ArgumentException("argument was wrong", innerException);

            os.Roots.Entangle(outerException);

            os.Persist();

            os = ObjectStore2.Load(storageEngine);
            var e = os.Roots.Find <ArgumentException>();

            e.Message.ShouldBe("argument was wrong");
            var ei = (InvalidCastException)e.InnerException;

            ei.Message.ShouldBe("cast was not possible");
        }
Ejemplo n.º 29
0
        public void CanSerializeAndDeserializeActionWithOneParameters()
        {
            _messages = new List <string>();

            Action <string> a = Say;

            var storageEngine = new InMemoryStorageEngine();
            var os            = ObjectStore2.New(storageEngine);

            os.Roots.Entangle(a);

            os.Persist();

            os = ObjectStore2.Load(storageEngine);
            a  = os.Roots.Find <Action <string> >();
            a("hello world");

            _messages.Count.ShouldBe(1);
            _messages[0].ShouldBe("hello world");
        }
Ejemplo n.º 30
0
        public void ChangeTrackerWithNodeChangedAndRemovedBeforePersisted()
        {
            var storage = new InMemoryStorageEngine();
            var os      = ObjectStore2.New(storage);

            var ctw = new ChangeTrackerWrapper();

            os.Roots.Entangle(ctw);

            ctw.ChangeTracker.Append(1);
            ctw.ChangeTracker.Append(2);
            ctw.ChangeTracker.Head.Remove();

            os.Persist();

            os  = ObjectStore2.Load(storage);
            ctw = os.Roots.Find <ChangeTrackerWrapper>();
            ctw.ChangeTracker.Head.Value.ShouldBe(2);
            ctw.ChangeTracker.Tail.Value.ShouldBe(2);
        }