public void ReplayOrderBook_IfScenario2IsExecuted_VerifyTheWholeSystemState()
        {
            _applicationContext = ContextRegistry.GetContext();
            Scenario2();
            MarketController  marketController     = (MarketController)_applicationContext["MarketController"];
            IHttpActionResult marketDataHttpResult = marketController.GetOrderBook("XBTUSD");

            OkNegotiatedContentResult <object> okResponseMessage =
                (OkNegotiatedContentResult <object>)marketDataHttpResult;
            OrderBookRepresentation representation = okResponseMessage.Content as OrderBookRepresentation;
            Tuple <OrderRepresentationList, OrderRepresentationList> orderBooks = new Tuple <OrderRepresentationList, OrderRepresentationList>(representation.Bids, representation.Asks);

            marketDataHttpResult = marketController.GetDepth("XBTUSD");
            OkNegotiatedContentResult <object> okResponseMessageDepth = (OkNegotiatedContentResult <object>)marketDataHttpResult;
            DepthTupleRepresentation           beforeReplayDepth      = okResponseMessageDepth.Content as DepthTupleRepresentation;

            IOrderRepository      orderRepository = (IOrderRepository)_applicationContext["OrderRepository"];
            List <OrderReadModel> before          = orderRepository.GetAllOrderOfTrader("5555");

            before = before.Concat(orderRepository.GetAllOrderOfTrader("4444")).ToList();

            ITradeRepository       tradeRepository    = (ITradeRepository)_applicationContext["TradeRepository"];
            IList <TradeReadModel> beforeReplayTrades = tradeRepository.GetAll();
            IList <object>         beforeReplayEvents = outputEventStore.GetAllEvents();

            marketDataHttpResult = marketController.GetBbo("XBTUSD");
            OkNegotiatedContentResult <BBORepresentation> okResponseMessageBboBefore = (OkNegotiatedContentResult <BBORepresentation>)marketDataHttpResult;

            //down the exchange, make new exchange and reply
            CrashAndInitializeAgainWithSnapshot();

            marketController     = (MarketController)_applicationContext["MarketController"];
            marketDataHttpResult = marketController.GetOrderBook("XBTUSD");

            okResponseMessage =
                (OkNegotiatedContentResult <object>)marketDataHttpResult;
            representation = okResponseMessage.Content as OrderBookRepresentation;
            Tuple <OrderRepresentationList, OrderRepresentationList> orderBook1 = new Tuple <OrderRepresentationList, OrderRepresentationList>(representation.Bids, representation.Asks);

            //verify orderbook state
            VerifyOrderBookStateAfterReplay(orderBooks, orderBook1);

            List <OrderReadModel> after = orderRepository.GetAllOrderOfTrader("5555");

            after = after.Concat(orderRepository.GetAllOrderOfTrader("4444")).ToList();
            //verify order table in database
            VerifyDatabaseStateAfterReplay(before, after);
            IList <TradeReadModel> afterReplayTrades = tradeRepository.GetAll();

            //verify trades table in database
            VerifyDatabaseStateAfterReplay(beforeReplayTrades, afterReplayTrades);
            IList <object> afterReplayEvents = outputEventStore.GetAllEvents();

            //verify event store state
            VerifyEventStoreStateAfterReplay(beforeReplayEvents, afterReplayEvents);

            marketDataHttpResult   = marketController.GetDepth("XBTUSD");
            okResponseMessageDepth = (OkNegotiatedContentResult <object>)marketDataHttpResult;
            DepthTupleRepresentation afterReplayDepth = okResponseMessageDepth.Content as DepthTupleRepresentation;

            VerifyDepthBeforeAndAfterReplay(beforeReplayDepth, afterReplayDepth);

            marketDataHttpResult = marketController.GetBbo("XBTUSD");
            OkNegotiatedContentResult <BBORepresentation> okResponseMessageBboAfter = (OkNegotiatedContentResult <BBORepresentation>)marketDataHttpResult;

            VerifyBboAfterReplay(okResponseMessageBboBefore.Content, okResponseMessageBboAfter.Content);
        }