示例#1
0
        /// <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));
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#6
0
        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);
        }
示例#7
0
        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);
        }
示例#8
0
        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);
        }
示例#9
0
        /// <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);
        }
示例#10
0
        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);
        }
示例#11
0
        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);
        }
示例#12
0
        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);
        }
示例#13
0
        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);
        }
示例#14
0
        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);
        }
示例#15
0
        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);
        }
示例#16
0
        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);
        }