public void CanSubmitBuyLimitOrder()
        {
            ILimitOrderBook lob = new LimitOrderBook.StandardLimitOrderBook();

            Assert.IsNotNull(lob);
            Assert.AreEqual(0, lob.Bids.Count);

            Assert.IsInstanceOfType(lob, typeof(ILimitOrderBook));

            var testOrder = new Order() { Price = 100, Quantity = 10, Side = OrderSide.Buy, Type = OrderType.LimitOrder, UserID = "Test" };
            var testOrderGuid = testOrder.ID.ToString();

            var result = lob.ProcessLimitOrder(testOrder,true);

            Assert.IsNotNull(result);
            Assert.AreEqual(1, result.Count());
            Assert.AreEqual(true, result.First().Placed);
            Assert.AreEqual("Test", result.First().Order.UserID);
            Assert.AreEqual(testOrderGuid, result.First().Order.ID.ToString());
            Assert.AreEqual(OrderSide.Buy, result.First().Order.Side);
            Assert.AreEqual(1, lob.Bids.Count);

            Assert.AreEqual(100, lob.BestBid.Price);
            Assert.AreEqual(10, lob.BestBid.Quantity);
        }
        public void CanInstantiateLOB()
        {
            var lob = new LimitOrderBook.StandardLimitOrderBook();

            Assert.IsNotNull(lob);

            Assert.IsInstanceOfType(lob, typeof(ILimitOrderBook));
        }
        public void CanSubmitBuyMarketOrderSimple()
        {
            //ARRANGE
            ILimitOrderBook lob = new LimitOrderBook.StandardLimitOrderBook();

            Assert.IsNotNull(lob);
            Assert.AreEqual(0, lob.Bids.Count);

            Assert.IsInstanceOfType(lob, typeof(ILimitOrderBook));

            var setupOrder = new Order() { Price = 101, Quantity = 20, Side = OrderSide.Sell, Type = OrderType.LimitOrder, UserID = "Test" };
            var result = lob.ProcessLimitOrder(setupOrder,true);
            Assert.AreEqual(1, result.Count());
            Assert.AreEqual(true, result.First().Placed);

            setupOrder = new Order() { Price = 101, Quantity = 10, Side = OrderSide.Sell, Type = OrderType.LimitOrder, UserID = "Test" };
            result = lob.ProcessLimitOrder(setupOrder, true);
            Assert.AreEqual(1, result.Count());
            Assert.AreEqual(true, result.First().Placed);

            setupOrder = new Order() { Price = 103, Quantity = 30, Side = OrderSide.Sell, Type = OrderType.LimitOrder, UserID = "Test" };
            result = lob.ProcessLimitOrder(setupOrder, true);
            Assert.AreEqual(1, result.Count());
            Assert.AreEqual(true, result.First().Placed);

            setupOrder = new Order() { Price = 104, Quantity = 15, Side = OrderSide.Sell, Type = OrderType.LimitOrder, UserID = "Test" };
            result = lob.ProcessLimitOrder(setupOrder, true);
            Assert.AreEqual(1, result.Count());
            Assert.AreEqual(true, result.First().Placed);

            setupOrder = new Order() { Price = 104, Quantity = 5, Side = OrderSide.Sell, Type = OrderType.LimitOrder, UserID = "Test" };
            result = lob.ProcessLimitOrder(setupOrder, true);
            Assert.AreEqual(1, result.Count());
            Assert.AreEqual(true, result.First().Placed);

            setupOrder = new Order() { Price = 105, Quantity = 50, Side = OrderSide.Sell, Type = OrderType.LimitOrder, UserID = "Test" };
            result = lob.ProcessLimitOrder(setupOrder, true);
            Assert.AreEqual(1, result.Count());
            Assert.AreEqual(true, result.First().Placed);

            setupOrder = new Order() { Price = 94, Quantity = 30, Side = OrderSide.Buy, Type = OrderType.LimitOrder, UserID = "Test" };
            result = lob.ProcessLimitOrder(setupOrder, true);
            Assert.AreEqual(1, result.Count());
            Assert.AreEqual(true, result.First().Placed);

            setupOrder = new Order() { Price = 96, Quantity = 50, Side = OrderSide.Buy, Type = OrderType.LimitOrder, UserID = "Test" };
            result = lob.ProcessLimitOrder(setupOrder, true);
            Assert.AreEqual(1, result.Count());
            Assert.AreEqual(true, result.First().Placed);

            setupOrder = new Order() { Price = 97, Quantity = 40, Side = OrderSide.Buy, Type = OrderType.LimitOrder, UserID = "Test" };
            result = lob.ProcessLimitOrder(setupOrder, true);
            Assert.AreEqual(1, result.Count());
            Assert.AreEqual(true, result.First().Placed);

            setupOrder = new Order() { Price = 97, Quantity = 10, Side = OrderSide.Buy, Type = OrderType.LimitOrder, UserID = "Test" };
            result = lob.ProcessLimitOrder(setupOrder, true);
            Assert.AreEqual(1, result.Count());
            Assert.AreEqual(true, result.First().Placed);

            setupOrder = new Order() { Price = 97, Quantity = 10, Side = OrderSide.Buy, Type = OrderType.LimitOrder, UserID = "Test" };
            result = lob.ProcessLimitOrder(setupOrder, true);
            Assert.AreEqual(1, result.Count());
            Assert.AreEqual(true, result.First().Placed);

            //ACT
            var marketOrder = new Order()
            {
                Quantity = 15,
                Side = OrderSide.Buy,
                Type = OrderType.MarketOrder,
                UserID = "Test2"
            };

            var testResult = lob.ProcessMarketOrder(marketOrder, true);

            Assert.AreEqual(1, result.Count());

            //ASSERT

            Assert.AreEqual(2, lob.Asks[101].Count);
            Assert.AreEqual(5,lob.Asks[101].ElementAt(0).Quantity);
            Assert.AreEqual(10, lob.Asks[101].ElementAt(1).Quantity);

            Assert.AreEqual(1, lob.Asks[103].Count);
            Assert.AreEqual(30, lob.Asks[103].ElementAt(0).Quantity);

            Assert.AreEqual(2, lob.Asks[104].Count);
            Assert.AreEqual(15, lob.Asks[104].ElementAt(0).Quantity);
            Assert.AreEqual(5, lob.Asks[104].ElementAt(1).Quantity);

            Assert.AreEqual(1, lob.Asks[105].Count);
            Assert.AreEqual(50, lob.Asks[105].ElementAt(0).Quantity);

            Assert.AreEqual(3, lob.Bids[97].Count);
            Assert.AreEqual(40, lob.Bids[97].ElementAt(0).Quantity);
            Assert.AreEqual(10, lob.Bids[97].ElementAt(1).Quantity);
            Assert.AreEqual(10, lob.Bids[97].ElementAt(2).Quantity);

            Assert.AreEqual(1, lob.Bids[96].Count);
            Assert.AreEqual(50, lob.Bids[96].ElementAt(0).Quantity);

            Assert.AreEqual(1, lob.Bids[94].Count);
            Assert.AreEqual(30, lob.Bids[94].ElementAt(0).Quantity);
        }