public void MoveNextBlocks()
        {
            var finished   = new ManualResetEvent(false);
            var enumerator = new EnqueueableEnumerator <Tick>(true);

            // producer
            int count = 0;

            Task.Run(() =>
            {
                while (!finished.WaitOne(TimeSpan.FromMilliseconds(50)))
                {
                    enumerator.Enqueue(new Tick(DateTime.Now, Symbols.SPY, 100, 101));
                    count++;

                    // 5 data points is plenty
                    if (count > 5)
                    {
                        finished.Set();
                        enumerator.Stop();
                    }
                }
            });

            // consumer
            int  dequeuedCount        = 0;
            bool encounteredError     = false;
            var  consumerTaskFinished = new ManualResetEvent(false);

            Task.Run(() =>
            {
                while (enumerator.MoveNext())
                {
                    dequeuedCount++;
                    if (enumerator.Current == null)
                    {
                        encounteredError = true;
                    }
                }
                consumerTaskFinished.Set();
            });

            finished.WaitOne(Timeout.Infinite);
            consumerTaskFinished.WaitOne(Timeout.Infinite);

            Assert.IsFalse(enumerator.MoveNext());
            Assert.IsFalse(encounteredError);
            Assert.AreEqual(count, dequeuedCount);

            enumerator.Dispose();
        }
예제 #2
0
        public void SetErrorHandlerExitsOnTrueReturn()
        {
            var enqueable = new EnqueueableEnumerator <BaseData>();
            var exchange  = new BaseDataExchange("test");

            var cancellationToken = new CancellationTokenSource();

            Task.Factory.StartNew(() =>
            {
                while (!cancellationToken.IsCancellationRequested)
                {
                    Thread.Sleep(10);
                    enqueable.Enqueue(new Tick {
                        Symbol = Symbols.SPY, Time = DateTime.UtcNow
                    });
                }
            });

            var      first       = true;
            var      errorCaught = new AutoResetEvent(true);
            BaseData last        = null;

            exchange.SetErrorHandler(error =>
            {
                errorCaught.Set();
                return(true);
            });

            exchange.AddEnumerator(Symbols.SPY, enqueable, handleData: spy =>
            {
                if (first)
                {
                    first = false;
                    throw new Exception();
                }
                last = spy;
            });

            Task.Run(() => exchange.Start());

            Assert.IsTrue(errorCaught.WaitOne(DefaultTimeout));

            exchange.Stop();

            Assert.IsNull(last);

            enqueable.Dispose();
            cancellationToken.Cancel();
        }
예제 #3
0
        public void EndsQueueConsumption()
        {
            var enqueable = new EnqueueableEnumerator <BaseData>();
            var exchange  = new BaseDataExchange("test");

            var cancellationToken = new CancellationTokenSource();

            Task.Run(() =>
            {
                while (!cancellationToken.IsCancellationRequested)
                {
                    Thread.Sleep(10);
                    enqueable.Enqueue(new Tick {
                        Symbol = Symbols.SPY, Time = DateTime.UtcNow
                    });
                }
            });

            BaseData last        = null;
            var      lastUpdated = new AutoResetEvent(false);

            exchange.AddEnumerator(Symbols.SPY, enqueable, handleData: spy =>
            {
                last = spy;
                lastUpdated.Set();
            });

            var finishedRunning = new AutoResetEvent(false);

            Task.Run(() => { exchange.Start(); finishedRunning.Set(); });

            Assert.IsTrue(lastUpdated.WaitOne(DefaultTimeout));

            exchange.Stop();
            cancellationToken.Cancel();

            Assert.IsTrue(finishedRunning.WaitOne(DefaultTimeout));

            var endTime = DateTime.UtcNow;

            Assert.IsNotNull(last);
            Assert.IsTrue(last.Time <= endTime);
            enqueable.Dispose();
        }
예제 #4
0
        public void DefaultErrorHandlerDoesNotStopQueueConsumption()
        {
            var enqueable = new EnqueueableEnumerator <BaseData>();
            var exchange  = new BaseDataExchange("test");

            var cancellationToken = new CancellationTokenSource();

            Task.Run(() =>
            {
                while (!cancellationToken.IsCancellationRequested)
                {
                    Thread.Sleep(10);
                    enqueable.Enqueue(new Tick {
                        Symbol = Symbols.SPY, Time = DateTime.UtcNow
                    });
                }
            });

            var      first       = true;
            BaseData last        = null;
            var      lastUpdated = new AutoResetEvent(false);

            exchange.AddEnumerator(Symbols.SPY, enqueable, handleData: spy =>
            {
                if (first)
                {
                    first = false;
                    throw new Exception("This exception should be swalloed by the exchange!");
                }
                last = spy;
                lastUpdated.Set();
            });

            Task.Run(() => exchange.Start());

            Assert.IsTrue(lastUpdated.WaitOne(DefaultTimeout));

            exchange.Stop();
            cancellationToken.Cancel();
            enqueable.Dispose();
        }
        public void RecordsInternalQueueCount()
        {
            var enumerator = new EnqueueableEnumerator <Tick>();

            var currentTime = new DateTime(2015, 12, 01);
            var tick        = new Tick(currentTime, Symbols.SPY, 100, 101);

            enumerator.Enqueue(tick);
            Assert.AreEqual(1, enumerator.Count);

            tick = new Tick(currentTime, Symbols.SPY, 100, 101);
            enumerator.Enqueue(tick);
            Assert.AreEqual(2, enumerator.Count);

            enumerator.MoveNext();
            Assert.AreEqual(1, enumerator.Count);

            enumerator.MoveNext();
            Assert.AreEqual(0, enumerator.Count);

            enumerator.Dispose();
        }
        public void PassesTicksStraightThrough()
        {
            var enumerator = new EnqueueableEnumerator <Tick>();

            // add some ticks
            var currentTime = new DateTime(2015, 10, 08);

            // returns true even if no data present until stop is called
            Assert.IsTrue(enumerator.MoveNext());
            Assert.IsNull(enumerator.Current);

            var tick1 = new Tick(currentTime, Symbols.SPY, 199.55m, 199, 200)
            {
                Quantity = 10
            };

            enumerator.Enqueue(tick1);
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(tick1, enumerator.Current);

            Assert.IsTrue(enumerator.MoveNext());
            Assert.IsNull(enumerator.Current);

            var tick2 = new Tick(currentTime, Symbols.SPY, 199.56m, 199.21m, 200.02m)
            {
                Quantity = 5
            };

            enumerator.Enqueue(tick2);
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(tick2, enumerator.Current);

            enumerator.Stop();

            Assert.IsFalse(enumerator.MoveNext());
            Assert.IsNull(enumerator.Current);

            enumerator.Dispose();
        }
        public void RecordsMostRecentlyEnqueuedItem()
        {
            var enumerator = new EnqueueableEnumerator <Tick>();

            var currentTime = new DateTime(2015, 12, 01);
            var tick1       = new Tick(currentTime, Symbols.SPY, 100, 101);

            enumerator.Enqueue(tick1);
            Assert.AreEqual(null, enumerator.Current);
            Assert.AreEqual(tick1, enumerator.LastEnqueued);

            var tick2 = new Tick(currentTime, Symbols.SPY, 100, 101);

            enumerator.Enqueue(tick2);
            Assert.AreEqual(tick2, enumerator.LastEnqueued);

            enumerator.MoveNext();
            Assert.AreEqual(tick1, enumerator.Current);

            enumerator.MoveNext();
            Assert.AreEqual(tick2, enumerator.Current);

            enumerator.Dispose();
        }