public void ByteArraySegmentedStream_ReadByteTest()
        {
            var arr = new byte[100];
            for (byte i = 0; i < 100; i++)
                arr[i] = i;

            var segments = new List<ArraySegment<byte>>();
            

            var stream = new ByteArraySegmentedStream(true);
            stream.AddSegment(new ArraySegment<byte>(arr, 0, 5));
            stream.AddSegment(new ArraySegment<byte>(arr, 2, 5));
            stream.AddSegment(new ArraySegment<byte>(arr, 10, 10));

            var reader = new BinaryReader(stream);

            for (byte i = 0; i < 5; i++)
                Assert.AreEqual(i, reader.ReadByte());

            for (byte i = 0; i < 5; i++)
                Assert.AreEqual(i + 2, reader.ReadByte());

            for (byte i = 0; i < 10; i++)
                Assert.AreEqual(i + 10, reader.ReadByte());
        }
        public void ByteArraySegmentedStream_ReadBytesTest()
        {
            var arr = new byte[100];
            for (byte i = 0; i < 100; i++)
                arr[i] = i;

            var stream = new ByteArraySegmentedStream(true);
            stream.AddSegment(new ArraySegment<byte>(arr, 0, 10));
            stream.AddSegment(new ArraySegment<byte>(arr, 10, 25));
            stream.AddSegment(new ArraySegment<byte>(arr, 5, 10));

            var reader = new BinaryReader(stream);

            var bs = reader.ReadBytes(5);
            Assert.AreEqual(bs.Length, 5);
            for (byte i = 0; i < 5; i++)
                Assert.AreEqual(i, bs[i]);

            bs = reader.ReadBytes(10);
            Assert.AreEqual(bs.Length, 10);
            for (byte i = 0; i < 10; i++)
                Assert.AreEqual(i + 5, bs[i]);

            bs = reader.ReadBytes(100);
            Assert.AreEqual(bs.Length, 30);
            for (byte i = 0; i < 20; i++)
                Assert.AreEqual(i + 15, bs[i]);
            for (byte i = 0; i < 10; i++)
                Assert.AreEqual(i + 5, bs[i + 20]);
        }
        public void ByteArraySegmentedStream_SeekTest()
        {
            var arr = new byte[100];
            for (byte i = 0; i < 100; i++)
                arr[i] = i;

            var stream = new ByteArraySegmentedStream(false);
            stream.AddSegment(new ArraySegment<byte>(arr, 0, 5));
            stream.AddSegment(new ArraySegment<byte>(arr, 2, 5));
            stream.AddSegment(new ArraySegment<byte>(arr, 10, 10));

            var reader = new BinaryReader(stream);

            long pos = stream.Seek(0, SeekOrigin.Begin);
            Assert.AreEqual(0, pos);

            for (byte i = 0; i < 5; i++)
                Assert.AreEqual(i, reader.ReadByte());

            pos = stream.Seek(0, SeekOrigin.Begin);
            Assert.AreEqual(0, pos);

            for (byte i = 0; i < 5; i++)
                Assert.AreEqual(i, reader.ReadByte());

            pos = stream.Seek(-15, SeekOrigin.End);
            Assert.AreEqual(5, pos);

            for (byte i = 0; i < 5; i++)
                Assert.AreEqual(i + 2, reader.ReadByte());
            for (byte i = 0; i < 10; i++)
                Assert.AreEqual(i + 10, reader.ReadByte());

            Assert.AreEqual(0, reader.ReadBytes(10).Length);

            stream.Position -= 6;
            Assert.AreEqual(14, reader.ReadByte());

            stream.Position += 5;
            Assert.AreEqual(0, reader.ReadBytes(10).Length);
        }
        private void ReadReceiveBuffer()
        {
            var stream = new ByteArraySegmentedStream();
            var reader = new BinaryReader(stream);

            int recvBytes = 0;
            RpcFrame frame = null;

            while (true)
            {
                _recvEvent.WaitOne();

                // Read next message

                ArraySegment<byte> segment;
                while (_recvQueue.TryDequeue(out segment))
                {
                    stream.AddSegment(segment);
                    recvBytes += segment.Count;

                    ProcessFrames(reader, ref recvBytes, ref frame);
                }
            }
        }