/// <summary> /// Start the RuntimeClock. /// Clock will continue to run and handle events until it has been disposed. /// </summary> public void Run() { SubscribeHandlers(); _handlers.OnNext(new RuntimeStart(_timer.CurrentTime)); _handlers.OnNext(new StartTime(_timer.CurrentTime)); while (true) { lock (_schedule) { if (IsIdle()) { _handlers.OnNext(new IdleClock(_timer.CurrentTime)); } // Blocks and releases lock until it receives the next event Time alarm = GetNextEvent(); ProcessEvent(alarm); if (alarm is StopTime) { break; } } } _handlers.OnNext(new RuntimeStop(_timer.CurrentTime)); }
public void TestPubSubSubjectMultipleThreads() { int sum = 0; PubSubSubject <int> subject = new PubSubSubject <int>(); subject.Subscribe(Observer.Create <int>(x => sum += x)); Thread[] threads = new Thread[10]; for (int i = 0; i < threads.Length; i++) { threads[i] = new Thread(() => { for (int j = 0; j < 10000; j++) { subject.OnNext(1); } }); threads[i].Start(); } foreach (Thread thread in threads) { thread.Join(); } Assert.Equal(sum, 100000); }
public void TestPubSubSubjectMultipleThreads() { int sum = 0; PubSubSubject<int> subject = new PubSubSubject<int>(); subject.Subscribe(Observer.Create<int>(x => sum += x)); Thread[] threads = new Thread[10]; for (int i = 0; i < threads.Length; i++) { threads[i] = new Thread(() => { for (int j = 0; j < 10000; j++) { subject.OnNext(1); } }); threads[i].Start(); } foreach (Thread thread in threads) { thread.Join(); } Assert.Equal(sum, 100000); }
public void TestMultipleTypes() { int sum1 = 0; int sum2 = 0; PubSubSubject <SuperEvent> subject = new PubSubSubject <SuperEvent>(); subject.Subscribe(Observer.Create <SubEvent1>(x => sum1 += 100)); subject.Subscribe(Observer.Create <SubEvent2>(x => sum2 += 500)); subject.OnNext(new SubEvent1()); subject.OnNext(new SubEvent2()); subject.OnNext(new SubEvent2()); Assert.Equal(sum1, 100); Assert.Equal(sum2, 1000); }
public void TestDisposeSingleSubject() { int sum = 0; PubSubSubject <int> subject = new PubSubSubject <int>(); var disposable = subject.Subscribe(Observer.Create <int>(x => sum += x)); subject.OnNext(10); subject.OnNext(10); subject.OnNext(10); Assert.Equal(30, sum); // Unregister the subject and check that calling OnNext does nothing disposable.Dispose(); subject.OnNext(10); Assert.Equal(30, sum); }
public void TestDisposeMultipleSubjects() { int sum1 = 0; int sum2 = 0; SubEvent1 event1 = new SubEvent1(); SubEvent2 event2 = new SubEvent2(); PubSubSubject <SuperEvent> subject = new PubSubSubject <SuperEvent>(); var disposable1 = subject.Subscribe(Observer.Create <SubEvent1>(x => sum1 += 100)); var disposable2 = subject.Subscribe(Observer.Create <SubEvent2>(x => sum2 += 500)); subject.OnNext(event1); subject.OnNext(event2); subject.OnNext(event2); Assert.Equal(sum1, 100); Assert.Equal(sum2, 1000); // Check that unsubscribing from SubEvent1 does not affect other subscriptions disposable1.Dispose(); subject.OnNext(event1); subject.OnNext(event2); Assert.Equal(sum1, 100); Assert.Equal(sum2, 1500); // Unsubscribe from the remaining event types disposable2.Dispose(); subject.OnNext(event1); subject.OnNext(event2); Assert.Equal(sum1, 100); Assert.Equal(sum2, 1500); }
public void TestOnError() { int sum = 0; PubSubSubject <int> subject = new PubSubSubject <int>(); subject.Subscribe(Observer.Create <int>(x => sum += x)); subject.OnNext(10); Assert.Equal(10, sum); subject.OnNext(10); Assert.Equal(20, sum); // Check that after calling OnError, OnNext will do nothing subject.OnError(new Exception("error")); subject.OnNext(10); Assert.Equal(20, sum); }
public void TestOnCompleted() { int sum = 0; PubSubSubject <int> subject = new PubSubSubject <int>(); subject.Subscribe(Observer.Create <int>(x => sum += x)); subject.OnNext(10); Assert.Equal(10, sum); subject.OnNext(10); Assert.Equal(20, sum); // Check that after calling OnCompleted, OnNext will do nothing subject.OnCompleted(); subject.OnNext(10); Assert.Equal(20, sum); }
/// <summary> /// Start the RuntimeClock. /// Clock will continue to run and handle events until it has been disposed. /// </summary> public void Run() { SubscribeHandlers(); var runtimeException = Optional <Exception> .Empty(); try { _handlers.OnNext(new RuntimeStart(_timer.CurrentTime)); _handlers.OnNext(new StartTime(_timer.CurrentTime)); while (true) { lock (_schedule) { if (IsIdle()) { _handlers.OnNext(new IdleClock(_timer.CurrentTime)); } // Blocks and releases lock until it receives the next event Time alarm = GetNextEvent(); ProcessEvent(alarm); if (alarm is StopTime) { break; } } } } catch (Exception e) { runtimeException = Optional <Exception> .Of(new SystemException("Caught Exception in clock, failing the Evaluator.", e)); } var runtimeStop = runtimeException.IsPresent() ? new RuntimeStop(_timer.CurrentTime, runtimeException.Value) : new RuntimeStop(_timer.CurrentTime); _handlers.OnNext(runtimeStop); }
public void TestPubSubSubjectSingleThread() { int sum = 0; // Observer that adds sum of numbers up to and including x PubSubSubject<int> subject = new PubSubSubject<int>(); subject.Subscribe(Observer.Create<int>( x => { for (int i = 0; i <= x; i++) { sum += i; } })); subject.OnNext(10); subject.OnCompleted(); Assert.Equal(sum, 55); }
public void TestPubSubSubjectSingleThread() { int sum = 0; // Observer that adds sum of numbers up to and including x PubSubSubject <int> subject = new PubSubSubject <int>(); subject.Subscribe(Observer.Create <int>( x => { for (int i = 0; i <= x; i++) { sum += i; } })); subject.OnNext(10); subject.OnCompleted(); Assert.Equal(sum, 55); }
public void TestOnCompleted() { int sum = 0; PubSubSubject<int> subject = new PubSubSubject<int>(); subject.Subscribe(Observer.Create<int>(x => sum += x)); subject.OnNext(10); Assert.Equal(10, sum); subject.OnNext(10); Assert.Equal(20, sum); // Check that after calling OnCompleted, OnNext will do nothing subject.OnCompleted(); subject.OnNext(10); Assert.Equal(20, sum); }
public void TestMultipleTypes() { int sum1 = 0; int sum2 = 0; PubSubSubject<SuperEvent> subject = new PubSubSubject<SuperEvent>(); subject.Subscribe(Observer.Create<SubEvent1>(x => sum1 += 100)); subject.Subscribe(Observer.Create<SubEvent2>(x => sum2 += 500)); subject.OnNext(new SubEvent1()); subject.OnNext(new SubEvent2()); subject.OnNext(new SubEvent2()); Assert.Equal(sum1, 100); Assert.Equal(sum2, 1000); }
public void TestDisposeMultipleSubjects() { int sum1 = 0; int sum2 = 0; SubEvent1 event1 = new SubEvent1(); SubEvent2 event2 = new SubEvent2(); PubSubSubject<SuperEvent> subject = new PubSubSubject<SuperEvent>(); var disposable1 = subject.Subscribe(Observer.Create<SubEvent1>(x => sum1 += 100)); var disposable2 = subject.Subscribe(Observer.Create<SubEvent2>(x => sum2 += 500)); subject.OnNext(event1); subject.OnNext(event2); subject.OnNext(event2); Assert.Equal(sum1, 100); Assert.Equal(sum2, 1000); // Check that unsubscribing from SubEvent1 does not affect other subscriptions disposable1.Dispose(); subject.OnNext(event1); subject.OnNext(event2); Assert.Equal(sum1, 100); Assert.Equal(sum2, 1500); // Unsubscribe from the remaining event types disposable2.Dispose(); subject.OnNext(event1); subject.OnNext(event2); Assert.Equal(sum1, 100); Assert.Equal(sum2, 1500); }
public void TestDisposeSingleSubject() { int sum = 0; PubSubSubject<int> subject = new PubSubSubject<int>(); var disposable = subject.Subscribe(Observer.Create<int>(x => sum += x)); subject.OnNext(10); subject.OnNext(10); subject.OnNext(10); Assert.Equal(30, sum); // Unregister the subject and check that calling OnNext does nothing disposable.Dispose(); subject.OnNext(10); Assert.Equal(30, sum); }
public void TestOnError() { int sum = 0; PubSubSubject<int> subject = new PubSubSubject<int>(); subject.Subscribe(Observer.Create<int>(x => sum += x)); subject.OnNext(10); Assert.Equal(10, sum); subject.OnNext(10); Assert.Equal(20, sum); // Check that after calling OnError, OnNext will do nothing subject.OnError(new Exception("error")); subject.OnNext(10); Assert.Equal(20, sum); }