Add "here to the end" constructors

This commit is contained in:
Matt Nadareski
2025-08-23 21:11:41 -04:00
parent d0392be2d8
commit c98eb5c42a
2 changed files with 59 additions and 2 deletions

View File

@@ -9,11 +9,23 @@ namespace SabreTools.IO.Test.Streams
{
#region Constructor
[Theory]
[InlineData(0, 0, 0)]
[InlineData(1024, 0, 1024)]
[InlineData(1024, 256, 768)]
public void Constructor_Array(int size, long offset, long expectedLength)
{
byte[] data = new byte[size];
var stream = new ViewStream(data, offset);
Assert.Equal(expectedLength, stream.Length);
Assert.Equal(0, stream.Position);
}
[Theory]
[InlineData(0, 0, 0, 0)]
[InlineData(1024, 0, 1024, 1024)]
[InlineData(1024, 256, 512, 512)]
public void Constructor_Array(int size, long offset, long length, long expectedLength)
public void Constructor_Array_Length(int size, long offset, long length, long expectedLength)
{
byte[] data = new byte[size];
var stream = new ViewStream(data, offset, length);
@@ -47,11 +59,23 @@ namespace SabreTools.IO.Test.Streams
Assert.Throws<ArgumentOutOfRangeException>(() => _ = new ViewStream(data, offset, length));
}
[Theory]
[InlineData(0, 0, 0)]
[InlineData(1024, 0, 1024)]
[InlineData(1024, 256, 768)]
public void Constructor_Stream(int size, long offset, long expectedLength)
{
Stream data = new MemoryStream(new byte[size]);
var stream = new ViewStream(data, offset);
Assert.Equal(expectedLength, stream.Length);
Assert.Equal(0, stream.Position);
}
[Theory]
[InlineData(0, 0, 0, 0)]
[InlineData(1024, 0, 1024, 1024)]
[InlineData(1024, 256, 512, 512)]
public void Constructor_Stream(int size, long offset, long length, long expectedLength)
public void Constructor_Stream_Length(int size, long offset, long length, long expectedLength)
{
Stream data = new MemoryStream(new byte[size]);
var stream = new ViewStream(data, offset, length);

View File

@@ -89,6 +89,23 @@ namespace SabreTools.IO.Streams
#region Constructors
/// <summary>
/// Construct a new ViewStream from a Stream
/// </summary>
public ViewStream(Stream data, long offset)
{
if (!data.CanRead)
throw new ArgumentException(nameof(data));
if (offset < 0 || offset > data.Length)
throw new ArgumentOutOfRangeException(nameof(offset));
_source = data;
_initialPosition = offset;
_length = data.Length - offset;
_source.Seek(_initialPosition, SeekOrigin.Begin);
}
/// <summary>
/// Construct a new ViewStream from a Stream
/// </summary>
@@ -108,6 +125,22 @@ namespace SabreTools.IO.Streams
_source.Seek(_initialPosition, SeekOrigin.Begin);
}
/// <summary>
/// Construct a new ViewStream from a byte array
/// </summary>
public ViewStream(byte[] data, long offset)
{
if (offset < 0 || offset > data.Length)
throw new ArgumentOutOfRangeException(nameof(offset));
long length = data.Length - offset;
_source = new MemoryStream(data, (int)offset, (int)length);
_initialPosition = 0;
_length = length;
_source.Seek(_initialPosition, SeekOrigin.Begin);
}
/// <summary>
/// Construct a new ViewStream from a byte array
/// </summary>