static void TestWriteRead(Action <AbstractBufferedWriter> writeAction, byte[] checkResult,
                                  Action <AbstractBufferedReader> readAction, Action <AbstractBufferedReader> skipAction)
        {
            var sw = new BufferedWriterStub(1);

            writeAction(sw);
            sw.FlushBuffer();
            Assert.AreEqual(checkResult, sw.Output);
            BufferedReaderStub sr;

            if (checkResult.Length > 1)
            {
                sw = new BufferedWriterStub(checkResult.Length);
                writeAction(sw);
                sw.FlushBuffer();
                Assert.AreEqual(checkResult, sw.Output);
                sw = new BufferedWriterStub(checkResult.Length + 1);
                writeAction(sw);
                sw.FlushBuffer();
                Assert.AreEqual(checkResult, sw.Output);
                sr = new BufferedReaderStub(checkResult, checkResult.Length);
                readAction(sr);
                Assert.True(sr.Eof);
            }
            sr = new BufferedReaderStub(checkResult, 1);
            readAction(sr);
            Assert.True(sr.Eof);
            sw = new BufferedWriterStub(checkResult.Length * 2);
            writeAction(sw);
            writeAction(sw);
            sw.FlushBuffer();
            Assert.AreEqual(checkResult.Concat(checkResult).ToArray(), sw.Output);
            sr = new BufferedReaderStub(checkResult.Concat(checkResult).ToArray(), checkResult.Length * 2);
            readAction(sr);
            readAction(sr);
            if (skipAction != null)
            {
                sr = new BufferedReaderStub(checkResult.Concat(checkResult).ToArray(), checkResult.Length * 2);
                skipAction(sr);
                readAction(sr);
                Assert.True(sr.Eof);
                sr = new BufferedReaderStub(checkResult.Concat(checkResult).ToArray(), checkResult.Length * 2);
                readAction(sr);
                skipAction(sr);
                Assert.True(sr.Eof);
            }
        }
 static void TestWriteRead(Action<AbstractBufferedWriter> writeAction, byte[] checkResult,
           Action<AbstractBufferedReader> readAction, Action<AbstractBufferedReader> skipAction)
 {
     var sw = new BufferedWriterStub(1);
     writeAction(sw);
     sw.FlushBuffer();
     Assert.Equal(checkResult, sw.Output);
     BufferedReaderStub sr;
     if (checkResult.Length > 1)
     {
         sw = new BufferedWriterStub(checkResult.Length);
         writeAction(sw);
         sw.FlushBuffer();
         Assert.Equal(checkResult, sw.Output);
         sw = new BufferedWriterStub(checkResult.Length + 1);
         writeAction(sw);
         sw.FlushBuffer();
         Assert.Equal(checkResult, sw.Output);
         sr = new BufferedReaderStub(checkResult, checkResult.Length);
         readAction(sr);
         Assert.True(sr.Eof);
     }
     sr = new BufferedReaderStub(checkResult, 1);
     readAction(sr);
     Assert.True(sr.Eof);
     sw = new BufferedWriterStub(checkResult.Length * 2);
     writeAction(sw);
     writeAction(sw);
     sw.FlushBuffer();
     Assert.Equal(checkResult.Concat(checkResult).ToArray(), sw.Output);
     sr = new BufferedReaderStub(checkResult.Concat(checkResult).ToArray(), checkResult.Length * 2);
     readAction(sr);
     readAction(sr);
     if (skipAction != null)
     {
         sr = new BufferedReaderStub(checkResult.Concat(checkResult).ToArray(), checkResult.Length * 2);
         skipAction(sr);
         readAction(sr);
         Assert.True(sr.Eof);
         sr = new BufferedReaderStub(checkResult.Concat(checkResult).ToArray(), checkResult.Length * 2);
         readAction(sr);
         skipAction(sr);
         Assert.True(sr.Eof);
     }
 }