public void PerformWriteOpOnReadOnlyWrapper()
        {
            byte[] buf = new byte[10];

            using (FileStreamWrapper fsw = new FileStreamWrapper())
            {
                // If:
                // ... I have a readonly file stream wrapper
                // Then:
                // ... Attempting to perform any write operation should result in an exception
                Assert.Throws <InvalidOperationException>(() => fsw.WriteData(buf, 1));
                Assert.Throws <InvalidOperationException>(() => fsw.Flush());
            }
        }
        public void PerformOpWithoutInit()
        {
            byte[] buf = new byte[10];

            using (FileStreamWrapper fsw = new FileStreamWrapper())
            {
                // If:
                // ... I have a file stream wrapper that hasn't been initialized
                // Then:
                // ... Attempting to perform any operation will result in an exception
                Assert.Throws <InvalidOperationException>(() => fsw.ReadData(buf, 1));
                Assert.Throws <InvalidOperationException>(() => fsw.ReadData(buf, 1, 0));
                Assert.Throws <InvalidOperationException>(() => fsw.WriteData(buf, 1));
                Assert.Throws <InvalidOperationException>(() => fsw.Flush());
            }
        }
        [InlineData(10)]    // Internal buffer too small, forces a flush
        public void WriteData(int internalBufferLength)
        {
            string fileName = Path.GetTempFileName();

            byte[] bytesToWrite = Encoding.Unicode.GetBytes("hello");

            try
            {
                // If:
                // ... I have a file stream that has been initialized
                // ... And I write some bytes to it
                using (FileStreamWrapper fsw = new FileStreamWrapper())
                {
                    fsw.Init(fileName, internalBufferLength, FileAccess.ReadWrite);
                    int bytesWritten = fsw.WriteData(bytesToWrite, bytesToWrite.Length);

                    Assert.Equal(bytesToWrite.Length, bytesWritten);
                }

                // Then:
                // ... The file I wrote to should contain only the bytes I wrote out
                using (FileStream fs = File.OpenRead(fileName))
                {
                    byte[] readBackBytes = new byte[1024];
                    int    bytesRead     = fs.Read(readBackBytes, 0, readBackBytes.Length);

                    Assert.Equal(bytesToWrite.Length, bytesRead);   // If bytes read is not equal, then more or less of the original string was written to the file
                    Assert.True(bytesToWrite.SequenceEqual(readBackBytes.Take(bytesRead)));
                }
            }
            finally
            {
                // Cleanup:
                // ... Delete the test file
                CleanupTestFile(fileName);
            }
        }