public async Task TestBasicFeature()
        {
            var sw = new Stopwatch();

            sw.Start();
            var trafficReader = new TcpDataReader(1024);

            var incomingArray = new byte[] { 1, 2, 3, 4, 5, 6 };

            var task = trafficReader.NewPackageAsync(incomingArray);

            var token = new CancellationTokenSource();
            var data  = await trafficReader.ReadAsyncAsync(3, token.Token);

            TestExtensions.AsReadOnlyMemory(incomingArray, 0, 3).ArrayIsEqualWith(data.AsArray());
            trafficReader.CommitReadData(data);

            data = trafficReader.ReadAsyncAsync(2, token.Token).Result;
            TestExtensions.AsReadOnlyMemory(incomingArray, 3, 2).ArrayIsEqualWith(data.AsArray());
            trafficReader.CommitReadData(data);

            await task;

            sw.Stop();
            Console.WriteLine(sw.Elapsed);
        }
        public async Task TestBasicFeature()
        {
            var trafficReader = new TcpDataReader(1024);

            var incomingArray = new byte[] { 1, 2, 3, 4, 5, 6 };

            await trafficReader.NewPackageAsync(incomingArray);

            var tc   = new CancellationTokenSource();
            var data = await trafficReader.ReadAsyncAsync(3, tc.Token);

            TestExtensions.AsReadOnlyMemory(incomingArray, 0, 3).ArraysAreEqual(data.AsArray());
            trafficReader.CommitReadData(data);

            data = await trafficReader.ReadAsyncAsync(2, tc.Token);

            TestExtensions.AsReadOnlyMemory(incomingArray, 3, 2).ArraysAreEqual(data.AsArray());
            trafficReader.CommitReadData(data);
        }
        public async Task TestSizeWithSeveralChunks()
        {
            var trafficReader = new TcpDataReader(5);

            var writeTask = trafficReader.NewPackagesAsync(
                new byte[] { 1, 2, 3, 4, 5 },
                new byte[] { 6, 7, 8, 9, 10 });

            var token   = new CancellationTokenSource();
            var result1 = await trafficReader.ReadAsyncAsync(7, token.Token);

            new ReadOnlyMemory <byte>(new byte[] { 1, 2, 3, 4, 5, 6, 7 }).ArrayIsEqualWith(result1.AsArray());
            trafficReader.CommitReadData(result1);

            var result2 = await trafficReader.ReadAsyncAsync(3, token.Token);

            new ReadOnlyMemory <byte>(new byte[] { 8, 9, 10 }).ArrayIsEqualWith(result2.AsArray());
            trafficReader.CommitReadData(result2);

            await writeTask;
        }
        public async Task TestSearchWithSeveralChunks()
        {
            var trafficReader = new TcpDataReader(5);

            var writeTask = trafficReader.NewPackagesAsync(
                new byte[] { 1, 2, 3, 4, 5 },
                new byte[] { 6, 7, 8, 9, 10 }
                );

            var token   = new CancellationTokenSource();
            var result1 = await trafficReader.ReadWhileWeGetSequenceAsync(new byte[] { 5, 6 }, token.Token);

            new ReadOnlyMemory <byte>(new byte[] { 1, 2, 3, 4, 5, 6 }).ArrayIsEqualWith(result1.CommittedMemory);
            trafficReader.CommitReadData(result1);

            var result2 = await trafficReader.ReadWhileWeGetSequenceAsync(new byte[] { 9, 10 }, token.Token);

            new ReadOnlyMemory <byte>(new byte[] { 7, 8, 9, 10 }).ArrayIsEqualWith(result2.UncommittedMemory);
            trafficReader.CommitReadData(result1);

            await writeTask;
        }
        public async Task TestOverflowFeature()
        {
            var trafficReader = new TcpDataReader(1024);

            var incomingArray1 = new byte[] { 1, 2, 3, 4, 5, 6 };
            var incomingArray2 = new byte[] { 11, 22, 33, 44, 55, 66 };

            var writeTask = trafficReader.NewPackagesAsync(incomingArray1, incomingArray2);

            var token = new CancellationTokenSource();
            var data  = await trafficReader.ReadAsyncAsync(3, token.Token);

            new ReadOnlyMemory <byte>(new byte[] { 1, 2, 3 }).ArrayIsEqualWith(data.AsArray());
            trafficReader.CommitReadData(data);

            data = await trafficReader.ReadAsyncAsync(4, token.Token);

            new ReadOnlyMemory <byte>(new byte[] { 4, 5, 6, 11 }).ArrayIsEqualWith(data.AsArray());
            trafficReader.CommitReadData(data);

            await writeTask;
        }
        public async Task TestFindingTheSequenceFeatureByReadingToArraysAtTheEnd()
        {
            var trafficReader = new TcpDataReader(1024);

            var incomingArray1 = new byte[] { 1, 2, 3, 4, 5 };
            var incomingArray2 = new byte[] { 11, 12, 13, 4, 5 };

            var writingTask = trafficReader.NewPackagesAsync(incomingArray1, incomingArray2);

            var tc   = new CancellationTokenSource();
            var data = await trafficReader.ReadWhileWeGetSequenceAsync(new byte[] { 5, 11 }, tc.Token);

            new ReadOnlyMemory <byte>(new byte[] { 1, 2, 3, 4, 5, 11 }).ArraysAreEqual(data.AsArray());
            trafficReader.CommitReadData(data);

            data = await trafficReader.ReadWhileWeGetSequenceAsync(new byte[] { 4, 5 }, tc.Token);

            new ReadOnlyMemory <byte>(new byte[] { 12, 13, 4, 5 }).ArraysAreEqual(data.AsArray());
            trafficReader.CommitReadData(data);

            await writingTask;
        }
        public async Task TestFindingTheSequenceRightAway()
        {
            var trafficReader = new TcpDataReader(1024);

            var incomingArray1 = new byte[] { 1, 2, 3, 4, 5 };
            var incomingArray2 = new byte[] { 11, 12, 13, 4, 5 };

            var writeTask = trafficReader.NewPackagesAsync(incomingArray1, incomingArray2);

            var token = new CancellationTokenSource();
            var data  = await trafficReader.ReadWhileWeGetSequenceAsync(new byte[] { 4, 5 }, token.Token);

            new ReadOnlyMemory <byte>(new byte[] { 1, 2, 3, 4, 5 }).ArrayIsEqualWith(data.AsArray());
            trafficReader.CommitReadData(data);

            data = await trafficReader.ReadWhileWeGetSequenceAsync(new byte[] { 4, 5 }, token.Token);

            new ReadOnlyMemory <byte>(new byte[] { 11, 12, 13, 4, 5 }).ArrayIsEqualWith(data.AsArray());
            trafficReader.CommitReadData(data);

            await writeTask;
        }
        public async Task TestFindingTheSequenceFeatureByReadingToArraysAtTheEndOtherWayAround()
        {
            var trafficReader = new TcpDataReader(1024);

            var token    = new CancellationTokenSource();
            var dataTask = trafficReader.ReadWhileWeGetSequenceAsync(new byte[] { 5, 11 }, token.Token);

            var writeTask = trafficReader.NewPackagesAsync(
                new byte[] { 1, 2, 3, 4, 5 },
                new byte[] { 11, 12, 13, 4, 5 });

            var data = await dataTask;

            new ReadOnlyMemory <byte>(new byte[] { 1, 2, 3, 4, 5, 11 }).ArrayIsEqualWith(data.AsArray());
            trafficReader.CommitReadData(data);

            data = await trafficReader.ReadWhileWeGetSequenceAsync(new byte[] { 4, 5 }, token.Token);

            new ReadOnlyMemory <byte>(new byte[] { 12, 13, 4, 5 }).ArrayIsEqualWith(data.AsArray());
            trafficReader.CommitReadData(data);

            await writeTask;
        }
        public async Task TestDoubleVeryOverflowFeature()
        {
            var trafficReader = new TcpDataReader(1024);

            var incomingArray1 = new byte[] { 1, 2, 3, 4, 5, 6 };
            var incomingArray2 = new byte[] { 11, 22, 33, 44, 55, 66, };
            var incomingArray3 = new byte[] { 111, 222, 233, 244, 254, 255 };

            var writingTasks = trafficReader.NewPackagesAsync(incomingArray1, incomingArray2, incomingArray3);


            var tc   = new CancellationTokenSource();
            var data = await trafficReader.ReadAsyncAsync(3, tc.Token);

            new ReadOnlyMemory <byte>(new byte[] { 1, 2, 3 }).ArraysAreEqual(data.AsArray());
            trafficReader.CommitReadData(data);

            data = await trafficReader.ReadAsyncAsync(10, tc.Token);

            new ReadOnlyMemory <byte>(new byte[] { 4, 5, 6, 11, 22, 33, 44, 55, 66, 111 }).ArraysAreEqual(data.AsArray());
            trafficReader.CommitReadData(data);

            await writingTasks;
        }
        public async Task TestFindingSequenceWithTwoAsOnePieceAndOtherComplete()
        {
            var trafficReader = new TcpDataReader(1024);

            var token    = new CancellationTokenSource();
            var dataTask = trafficReader.ReadWhileWeGetSequenceAsync(new byte[] { 14, 15 }, token.Token);

            var writeTask = trafficReader.NewPackagesAsync(
                new byte[] { 1, 2, 3, 4, 5 },
                new byte[] { 11, 12, 13, 14, 15 },
                new byte[] { 21, 22, 23, 14, 15 });

            var data = await dataTask;

            new ReadOnlyMemory <byte>(new byte[] { 1, 2, 3, 4, 5, 11, 12, 13, 14, 15 }).ArrayIsEqualWith(data.AsArray());
            trafficReader.CommitReadData(data);

            data = await trafficReader.ReadWhileWeGetSequenceAsync(new byte[] { 14, 15 }, token.Token);

            new ReadOnlyMemory <byte>(new byte[] { 21, 22, 23, 14, 15 }).ArrayIsEqualWith(data.AsArray());
            trafficReader.CommitReadData(data);

            await writeTask;
        }
        public async Task TestReadyAmountWayBiggerThenAmountOfBuffer()
        {
            var dataReader = new TcpDataReader(64);

            var list = new List <byte>();

            for (byte i = 0; i < 255; i++)
            {
                list.Add(i);
            }

            var src       = list.ToArray();
            var writeTask = dataReader.NewPackageAsync(src);


            var result = await dataReader.ReadAsyncAsync(255, new CancellationTokenSource().Token);

            src.ArraysAreEqual(result.AsArray());
            dataReader.CommitReadData(result);

            await writeTask;
        }