WHEN_client_recieves_data_THEN_it_should_call_ondata()
        {
            var client = StreamdataClient <StockMarketOrders> .WithConfiguration(conf =>
            {
                conf.UseSandbox();
                conf.UserServerSentEventEngine <FakeEngine>();
            });

            StockMarketOrders testData             = null;
            StockMarketOrders expectedMarketOrders = new StockMarketOrders();

            expectedMarketOrders.Add(new Order()
            {
                Price = 10, Title = "test1"
            });
            expectedMarketOrders.Add(new Order()
            {
                Price = 20, Title = "test2"
            });

            client.OnData(data => testData = data);

            client.Start("fakeurl");

            FakeEngineWrapper.Instance.SendData(expectedMarketOrders);

            Check.That(testData).IsNotNull();
            Check.That(testData.GetTotal()).IsEqualTo(30);
        }
        WHEN_client_recieves_patch_THEN_it_should_call_onpatch_and_updateddata()
        {
            var client = StreamdataClient <StockMarketOrders> .WithConfiguration(conf =>
            {
                conf.UseSandbox();
                conf.UserServerSentEventEngine <FakeEngine>();
            });

            StockMarketOrders testData             = null;
            StockMarketOrders expectedMarketOrders = new StockMarketOrders();

            expectedMarketOrders.Add(new Order()
            {
                Price = 10, Title = "test1"
            });
            expectedMarketOrders.Add(new Order()
            {
                Price = 20, Title = "test2"
            });

            client.OnData(data => testData = data);
            client.OnPatch(patch => patch.ApplyTo(testData));
            client.Start("fakeurl");

            FakeEngineWrapper.Instance.SendData(expectedMarketOrders);
            var patchDoc = new JsonPatchDocument <StockMarketOrders>(new List <Operation <StockMarketOrders> >
            {
                new Operation <StockMarketOrders>("replace", "0/price", "0/price", 30)
            });

            FakeEngineWrapper.Instance.SendPatch(patchDoc);
            Check.That(testData).IsNotNull();
            Check.That(testData).HasSize(2);
            Check.That(testData.GetTotal()).IsEqualTo(50);
        }
        WHEN_client_has_data_and_patch_THEN_state_is_updated()
        {
            var client = StreamdataClient <StockMarketOrders> .WithConfiguration(conf =>
            {
                conf.UseSandbox();
                conf.UserServerSentEventEngine <FakeEngine>();
                conf.KeepStateUpdated();
            });

            StockMarketOrders expectedMarketOrders = new StockMarketOrders();

            expectedMarketOrders.Add(new Order()
            {
                Price = 10, Title = "test1"
            });
            expectedMarketOrders.Add(new Order()
            {
                Price = 20, Title = "test2"
            });
            StockMarketOrders actualState = null;

            client.Start("fakeurl");
            client.OnUpdatedState += state => actualState = state;
            FakeEngineWrapper.Instance.SendData(expectedMarketOrders);
            var patch = new JsonPatchDocument <StockMarketOrders>(new List <Operation <StockMarketOrders> >
            {
                new Operation <StockMarketOrders>("replace", "0/price", "0/price", 20)
            });

            FakeEngineWrapper.Instance.SendPatch(patch);
            Check.That(actualState).IsNotNull();
            Check.That(actualState.GetTotal()).IsEqualTo(40);
        }