public void Place_New_Buy_Order_And_Match_Exist_Sell_Orders()
        {
            orderbook = new FullOrderbook();

            var ask_orderId_1   = "ask_order_1";
            var ask_isBid_1     = false;
            var ask_quantity_1  = 5;
            var ask_price_1     = 10;
            var ask_timestamp_1 = DateTimeOffset.Now;
            var ask_order_1     = new LimitOrder(
                ask_orderId_1,
                ask_isBid_1,
                ask_quantity_1,
                ask_price_1,
                ask_timestamp_1);

            var ask_orderId_2   = "ask_order_2";
            var ask_isBid_2     = false;
            var ask_quantity_2  = 5;
            var ask_price_2     = 11;
            var ask_timestamp_2 = DateTimeOffset.Now;
            var ask_order_2     = new LimitOrder(
                ask_orderId_2,
                ask_isBid_2,
                ask_quantity_2,
                ask_price_2,
                ask_timestamp_2);

            var ask_orderId_3   = "ask_order_3";
            var ask_isBid_3     = false;
            var ask_quantity_3  = 5;
            var ask_price_3     = 11;
            var ask_timestamp_3 = DateTimeOffset.Now;
            var ask_order_3     = new LimitOrder(
                ask_orderId_3,
                ask_isBid_3,
                ask_quantity_3,
                ask_price_3,
                ask_timestamp_3);

            var ask_orderId_4   = "ask_order_4";
            var ask_isBid_4     = false;
            var ask_quantity_4  = 5;
            var ask_price_4     = 12;
            var ask_timestamp_4 = DateTimeOffset.Now;
            var ask_order_4     = new LimitOrder(
                ask_orderId_4,
                ask_isBid_4,
                ask_quantity_4,
                ask_price_4,
                ask_timestamp_4);

            var bid_orderId   = "bid_order";
            var bid_isBid     = true;
            var bid_quantity  = 17;
            var bid_price     = 12;
            var bid_timestamp = DateTimeOffset.Now;
            var bid_order     = new LimitOrder(
                bid_orderId,
                bid_isBid,
                bid_quantity,
                bid_price,
                bid_timestamp);

            orderbook.PlaceOrder(ask_order_1);
            orderbook.PlaceOrder(ask_order_2);
            orderbook.PlaceOrder(ask_order_3);
            orderbook.PlaceOrder(ask_order_4);
            orderbook.PlaceOrder(bid_order);


            //<1>. Should have only one ask level at $12 left.
            //<2>. Only one order at this level.
            //<3>. TotalLevelQuantity at this level should be 3.
            Assert.IsNull(orderbook.BestBidLevel);

            //Assert <1>
            Assert.IsNotNull(orderbook.BestAskLevel);
            var bestAskLevels = orderbook.GetBestAskLevels(3);

            Assert.AreEqual(1, bestAskLevels.Count);
            Assert.AreEqual(12, orderbook.BestAskLevel.LimitPrice);

            //Assert <2>
            Assert.AreEqual(1, orderbook.BestAskLevel.NumberOfOrders);

            //Assert <3>
            Assert.AreEqual(3, orderbook.BestAskLevel.TotalLevelQuantity);
        }
        public void Place_Mutiple_Sell_Orders_With_Different_Prices()
        {
            orderbook = new FullOrderbook();

            var isBid = false;

            var orderId_1   = "order1";
            var isBid_1     = isBid;
            var quantity_1  = 10;
            var price_1     = 100;
            var timestamp_1 = DateTimeOffset.Now;
            var order_1     = new LimitOrder(
                orderId_1,
                isBid_1,
                quantity_1,
                price_1,
                timestamp_1);

            var orderId_2   = "order2";
            var isBid_2     = isBid;
            var quantity_2  = 20;
            var price_2     = 200;
            var timestamp_2 = DateTimeOffset.Now;
            var order_2     = new LimitOrder(
                orderId_2,
                isBid_2,
                quantity_2,
                price_2,
                timestamp_2);

            var orderId_3   = "order3";
            var isBid_3     = isBid;
            var quantity_3  = 30;
            var price_3     = 300;
            var timestamp_3 = DateTimeOffset.Now;
            var order_3     = new LimitOrder(
                orderId_3,
                isBid_3,
                quantity_3,
                price_3,
                timestamp_3);

            List <LimitOrder> testOrders = new List <LimitOrder>()
            {
                order_1, order_2, order_3
            };

            orderbook.PlaceOrder(order_1);
            orderbook.PlaceOrder(order_2);
            orderbook.PlaceOrder(order_3);

            Assert.IsNotNull(orderbook.AskLevels);
            Assert.IsNotNull(orderbook.BestAskLevel);
            var bestAsksFromGetBestAskLevels = orderbook.GetBestAskLevels(3);

            Assert.IsNotNull(bestAsksFromGetBestAskLevels);
            Assert.AreEqual(3, bestAsksFromGetBestAskLevels.Count);
            var askLevelEnumerator = orderbook.AskLevels.GetEnumerator();

            for (int i = 0; i < 3; i++)
            {
                Assert.IsTrue(askLevelEnumerator.MoveNext());
                var askLevel  = askLevelEnumerator.Current;
                var testOrder = testOrders[i];

                Assert.AreEqual(testOrder.Quantity, askLevel.TotalLevelQuantity);
                Assert.AreEqual(testOrder.LimitPrice, askLevel.LimitPrice);
                Assert.AreEqual(1, askLevel.NumberOfOrders);
                Assert.IsNotNull(askLevel.Orders);
                Assert.IsNotNull(askLevel.Orders.List);
                Assert.AreEqual(1, askLevel.Orders.List.Count);
                Assert.AreEqual(testOrder.OrderId, askLevel.Orders.List.First.Value.OrderId);
                Assert.AreEqual(isBid, askLevel.Orders.List.First.Value.IsBid);
                Assert.AreEqual(testOrder.Quantity, askLevel.Orders.List.First.Value.Quantity);
                Assert.AreEqual(testOrder.LimitPrice, askLevel.Orders.List.First.Value.LimitPrice);
                Assert.AreEqual(testOrder.ReceivedTimestamp, askLevel.Orders.List.First.Value.ReceivedTimestamp);
                Assert.IsNotNull(askLevel.Orders.Table);
                Assert.AreEqual(1, askLevel.Orders.Table.Count);
                Assert.AreSame(askLevel.Orders.Table[testOrder.OrderId],
                               askLevel.Orders.List.First);
                Assert.AreSame(askLevel, bestAsksFromGetBestAskLevels[i]);
            }
        }