public void Given_a_length_limited_stream_when_doing_something_other_than_reading_then_expect_it_to_throw()
 {
     using (var ms = new MemoryStream())
     using (var lls = ms.VirtualLength(3)) {
         Assert.Throws<NotSupportedException>(() => lls.Write(new byte[5], 0, 5));
         Assert.Throws<NotSupportedException>(() => lls.SetLength(5));
     }
 }
        public void Given_some_data_when_length_limited_to_3_bytes_and_read_to_end_with_zero_buffering_then_read_data_is_as_expected_and_position_has_not_exceeeded_limit()
        {
            using (var ms = new MemoryStream()) {
                ms.Write(_data, 0, _data.Length);
                ms.Position = 0;

                using (var lls = ms.VirtualLength(3)) {
                    Assert.That(lls.ReadByte() == _expected[0]);
                    Assert.That(lls.ReadByte() == _expected[1]);
                    Assert.That(lls.ReadByte() == _expected[2]);
                    Assert.That(ms.Position, Is.EqualTo(3));
                }
            }
        }
        public void Given_some_data_when_length_limited_to_3_bytes_and_read_to_end_with_default_buffering_then_read_data_is_as_expected_and_position_has_not_exceeeded_limit()
        {
            using (var ms = new MemoryStream()) {
                ms.Write(_data, 0, _data.Length);
                ms.Position = 0;

                using (var lls = ms.VirtualLength(3))
                using (var sr = new StreamReader(lls)) {
                    var result = sr.ReadToEnd();
                    Assert.AreEqual(_expected, result);
                    Assert.That(ms.Position, Is.EqualTo(3));
                }

                ms.Position = 0;

                using (var lls = ms.VirtualLength(3)) {
                    Assert.That(lls.ReadByte() == '{');
                    Assert.That(lls.ReadByte() == ' ');
                    Assert.That(lls.ReadByte() == '}');
                    Assert.That(ms.Position, Is.EqualTo(3));
                }
            }
        }
        public void Given_some_data_when_length_limited_to_3_bytes_and_read_first_3_bytes_individually_with_minimal_buffering_then_read_data_is_as_expected_and_position_has_not_exceeeded_limit()
        {
            using (var ms = new MemoryStream()) {
                ms.Write(_data, 0, _data.Length);
                ms.Position = 0;

                using (var lls = ms.VirtualLength(3))
                using (var sr = new StreamReader(lls, Encoding.UTF8, false, 1)) {
                    Assert.That(sr.Read() == _expected[0]);
                    Assert.That(sr.Read() == _expected[1]);
                    Assert.That(sr.Read() == _expected[2]);
                    Assert.That(ms.Position, Is.EqualTo(3));
                }
            }
        }