public void GetRateTest_ChecksTheRateForTheGivenCurrencyPairAfterSubmittingDepthLevels_ChecksTheRateReturnedToVerify()
        {
            MarketController marketController = (MarketController)_applicationContext["MarketController"];
            BBOMemoryImage   bboMemoryImage   = (BBOMemoryImage)_applicationContext["BBOMemoryImage"];

            DepthLevel bidLevel1 = new DepthLevel(new Price(491));
            DepthLevel bidLevel2 = new DepthLevel(new Price(492));
            DepthLevel bidLevel3 = new DepthLevel(new Price(493));

            DepthLevel askLevel1 = new DepthLevel(new Price(494));
            DepthLevel askLevel2 = new DepthLevel(new Price(495));
            DepthLevel askLevel3 = new DepthLevel(new Price(496));

            bboMemoryImage.OnBBOArrived("XBT/USD", bidLevel1, askLevel1);
            IHttpActionResult httpActionResult = marketController.GetRate("XBT/USD");

            OkNegotiatedContentResult <Rate> returnedOkRate = (OkNegotiatedContentResult <Rate>)httpActionResult;
            Rate rate = returnedOkRate.Content;

            Assert.AreEqual("XBT/USD", rate.CurrencyPair);
            Assert.AreEqual(492.5, rate.RateValue); // MidPoint of bidLevel1 = 491 & askLevel1 = 494

            bboMemoryImage.OnBBOArrived("XBT/USD", bidLevel2, askLevel2);
            httpActionResult = marketController.GetRate("XBT/USD");
            returnedOkRate   = (OkNegotiatedContentResult <Rate>)httpActionResult;
            rate             = returnedOkRate.Content;

            Assert.AreEqual("XBT/USD", rate.CurrencyPair);
            Assert.AreEqual(493.5, rate.RateValue); // MidPoint of bidLevel2 = 492 & askLevel2 = 495

            bboMemoryImage.OnBBOArrived("XBT/USD", bidLevel3, askLevel3);
            httpActionResult = marketController.GetRate("XBT/USD");
            returnedOkRate   = (OkNegotiatedContentResult <Rate>)httpActionResult;
            rate             = returnedOkRate.Content;

            Assert.AreEqual("XBT/USD", rate.CurrencyPair);
            Assert.AreEqual(494.5, rate.RateValue); // MidPoint of bidLevel3 = 493 & askLevel3 = 496
        }
        public void GetRateEndToEndTests_SubmitsOrdersAndChecksTheRateForOneCurrencyPair_VerifiesThroughTheReturnedRate()
        {
            // Get the instance through Spring configuration
            OrderController orderController = (OrderController)_applicationContext["OrderController"];

            orderController.Request = new HttpRequestMessage(HttpMethod.Post, "");
            orderController.Request.Headers.Add("Auth", "123456789");
            MarketController marketController = (MarketController)_applicationContext["MarketController"];

            ManualResetEvent  manualResetEvent = new ManualResetEvent(false);
            IHttpActionResult orderHttpResult  = orderController.CreateOrder(new CreateOrderParam()
            {
                Pair   = "XBTUSD",
                Price  = 491,
                Volume = 100,
                Side   = "buy",
                Type   = "limit"
            });

            manualResetEvent.Reset();
            manualResetEvent.WaitOne(2000);
            orderController.CreateOrder(new CreateOrderParam()
            {
                Pair   = "XBTUSD",
                Price  = 494,
                Volume = 900,
                Side   = "sell",
                Type   = "limit"
            });
            manualResetEvent.Reset();
            manualResetEvent.WaitOne(2000);

            IHttpActionResult httpActionResult          = marketController.GetRate("XBTUSD");
            OkNegotiatedContentResult <Rate> okResponse = (OkNegotiatedContentResult <Rate>)httpActionResult;

            Rate rate = okResponse.Content;

            Assert.AreEqual("XBTUSD", rate.CurrencyPair);
            Assert.AreEqual(492.5, rate.RateValue); // MidPoint of xbtUsdBidLevel = 491 & xbtUsdAskLevel = 494

            orderController.CreateOrder(new CreateOrderParam()
            {
                Pair   = "XBTUSD",
                Price  = 493,
                Volume = 1000,
                Side   = "buy",
                Type   = "limit"
            });

            manualResetEvent.Reset();
            manualResetEvent.WaitOne(2000);
            httpActionResult = marketController.GetRate("XBTUSD");
            okResponse       = (OkNegotiatedContentResult <Rate>)httpActionResult;

            rate = okResponse.Content;

            Assert.AreEqual("XBTUSD", rate.CurrencyPair);
            Assert.AreEqual(493.5, rate.RateValue); // MidPoint of xbtUsdBidLevel = 493 & xbtUsdAskLevel = 496
            // Fill the existing top Ask order
            orderController.CreateOrder(new CreateOrderParam()
            {
                Pair   = "XBTUSD",
                Price  = 494,
                Volume = 900,
                Side   = "buy",
                Type   = "limit"
            });
            manualResetEvent.Reset();
            manualResetEvent.WaitOne(2000);
            // Send a new Ask order to stay on top of the ask book
            orderController.CreateOrder(new CreateOrderParam()
            {
                Pair   = "XBTUSD",
                Price  = 496,
                Volume = 900,
                Side   = "sell",
                Type   = "limit"
            });
            manualResetEvent.Reset();
            manualResetEvent.WaitOne(2000);
            httpActionResult = marketController.GetRate("XBTUSD");
            okResponse       = (OkNegotiatedContentResult <Rate>)httpActionResult;

            rate = okResponse.Content;

            Assert.AreEqual("XBTUSD", rate.CurrencyPair);
            Assert.AreEqual(494.5, rate.RateValue); // MidPoint of xbtUsdBidLevel = 493 & xbtUsdAskLevel = 496
        }