public void StreamingSnapshot_DifferentPairsSeparately_ShouldHandleCorrectly() { var pair1 = "BTC/USD"; var pair2 = "ETH/BTC"; var data1 = GetOrderBookSnapshotMockData(pair1, 500); var data2 = GetOrderBookSnapshotMockData(pair2, 200); var now = CryptoDateUtils.ConvertFromUnixSeconds(1577575307.123451); var snapshot1 = new OrderBookLevelBulk(OrderBookAction.Insert, data1, CryptoOrderBookType.L2) { ExchangeName = "test", ServerSequence = 4, ServerTimestamp = now.AddMilliseconds(1) }; var snapshot2 = new OrderBookLevelBulk(OrderBookAction.Insert, data2, CryptoOrderBookType.L2) { ExchangeName = "test", ServerSequence = 5, ServerTimestamp = now.AddMilliseconds(2) }; var source = new OrderBookSourceMock(); ICryptoOrderBook orderBook1 = new CryptoOrderBook(pair1, source); ICryptoOrderBook orderBook2 = new CryptoOrderBook(pair2, source); orderBook1.OrderBookUpdatedStream.Subscribe(x => { Assert.Equal("test", x.ExchangeName); Assert.Equal(4, x.ServerSequence); Assert.Equal("1577575307.124451", x.ServerTimestamp.ToUnixSecondsString()); }); orderBook2.OrderBookUpdatedStream.Subscribe(x => { Assert.Equal("test", x.ExchangeName); Assert.Equal(5, x.ServerSequence); Assert.Equal("1577575307.125451", x.ServerTimestamp.ToUnixSecondsString()); }); source.StreamSnapshotRaw(snapshot1); source.StreamSnapshotRaw(snapshot2); Assert.Equal(500, orderBook1.BidLevels.Length); Assert.Equal(500, orderBook1.AskLevels.Length); Assert.Equal(200, orderBook2.BidLevels.Length); Assert.Equal(200, orderBook2.AskLevels.Length); Assert.Equal(499, orderBook1.BidLevels.First().Price); Assert.Equal(1499, orderBook1.BidLevels.First().Amount); Assert.Equal(199, orderBook2.BidLevels.First().Price); Assert.Equal(599, orderBook2.BidLevels.First().Amount); Assert.Equal(501, orderBook1.AskLevels.First().Price); Assert.Equal(2501, orderBook1.AskLevels.First().Amount); Assert.Equal(201, orderBook2.AskLevels.First().Price); Assert.Equal(1001, orderBook2.AskLevels.First().Amount); var levels = orderBook1.Levels; foreach (var level in levels) { Assert.Equal(CryptoPairsHelper.Clean(pair1), level.Pair); } }