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);
        }
示例#2
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);
        }
示例#3
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 ValueEmitter(ValueHolder valueHolder) => _valueHolder = valueHolder;
 public ValueEmitter(Stream <int> s, ValueHolder valueHolder)
 {
     _valueHolder = valueHolder;
     s.CallOnEvent(AddValue);
 }