Skip to content

Commit

Permalink
Merge pull request #3 from pluskal/PipeReader
Browse files Browse the repository at this point in the history
Pipe reader
  • Loading branch information
pluskal authored Jan 22, 2020
2 parents 9812fe7 + 41323ab commit a93100d
Show file tree
Hide file tree
Showing 18 changed files with 1,143 additions and 780 deletions.
196 changes: 107 additions & 89 deletions Kaitai.Struct.Runtime.Async.Tests/KaitaiAsyncStreamBaseTests.cs
Original file line number Diff line number Diff line change
@@ -1,97 +1,115 @@
using System.Threading.Tasks;
using System.IO;
using System.Threading.Tasks;
using Kaitai.Async;
using Xunit;

namespace Kaitai.Struct.Runtime.Async.Tests
{
public class KaitaiAsyncStreamBaseTests
public class StreamKaitaiAsyncStreamBaseTests : KaitaiAsyncStreamBaseTests
{
[Fact]
public async Task AlignToByte_Test()
{
//Arrange
var kaitaiStreamSUT = new KaitaiAsyncStream(new byte[]{0b_1000_0000});

var read = await kaitaiStreamSUT.ReadBitsIntAsync(1);
Assert.Equal(1u, read);

//Act
kaitaiStreamSUT.AlignToByte();
//Assert
Assert.Equal(1, kaitaiStreamSUT.Pos);
}

[Theory]
[InlineData(true, 0, 0)]
[InlineData(false, 1, 0)]
[InlineData(false, 1, 1)]
[InlineData(false, 1, 2)]
[InlineData(false, 1, 3)]
[InlineData(false, 1, 4)]
[InlineData(false, 1, 5)]
[InlineData(false, 1, 6)]
[InlineData(false, 1, 7)]
[InlineData(true, 1, 8)]
public async Task Eof_Test(bool shouldBeEof, int streamSize, int readBitsAmount)
{
var kaitaiStreamSUT = new KaitaiAsyncStream(new byte[streamSize]);

await kaitaiStreamSUT.ReadBitsIntAsync(readBitsAmount);

if (shouldBeEof)
Assert.True(kaitaiStreamSUT.IsEof);
else
Assert.False(kaitaiStreamSUT.IsEof);
}

[Theory]
[InlineData(0, 0)]
[InlineData(1, 1)]
public async Task Pos_ByRead_Test(int expectedPos, int readBitsAmount)
{
var kaitaiStreamSUT = new KaitaiAsyncStream(new byte[1]);

await kaitaiStreamSUT.ReadBytesAsync(readBitsAmount);

Assert.Equal(expectedPos, kaitaiStreamSUT.Pos);
}

[Theory]
[InlineData(0, 0)]
[InlineData(1, 1)]
public async Task Pos_BySeek_Test(int expectedPos, int position)
{
var kaitaiStreamSUT = new KaitaiAsyncStream(new byte[1]);

await kaitaiStreamSUT.SeekAsync(position);

Assert.Equal(expectedPos, kaitaiStreamSUT.Pos);
}

[Theory]
[InlineData(0)]
[InlineData(1)]
public void Size_Test(int streamSize)
{
var kaitaiStreamSUT = new KaitaiAsyncStream(new byte[streamSize]);

Assert.Equal(streamSize, kaitaiStreamSUT.Size);
}

[Fact]
public void EmptyStream_NoRead_NoSeek_IsEof_ShouldBe_True()
{
var kaitaiStreamSUT = new KaitaiAsyncStream(new byte[0]);

Assert.True(kaitaiStreamSUT.IsEof);
}

[Fact]
public void EmptyStream_NoRead_NoSeek_Pos_ShouldBe_0()
{
var kaitaiStreamSUT = new KaitaiAsyncStream(new byte[0]);

Assert.Equal(0, kaitaiStreamSUT.Pos);
}
protected override KaitaiAsyncStream Create(byte[] data) => new KaitaiAsyncStream(data);
}

public class PipeReaderKaitaiAsyncStreamBaseTests : KaitaiAsyncStreamBaseTests
{
protected override KaitaiAsyncStream Create(byte[] data) =>
new KaitaiAsyncStream(System.IO.Pipelines.PipeReader.Create(new MemoryStream(data)));
}

public abstract class KaitaiAsyncStreamBaseTests
{
protected abstract KaitaiAsyncStream Create(byte[] data);

[Theory]
[InlineData(true, 0, 0)]
[InlineData(false, 1, 0)]
[InlineData(false, 1, 1)]
[InlineData(false, 1, 2)]
[InlineData(false, 1, 3)]
[InlineData(false, 1, 4)]
[InlineData(false, 1, 5)]
[InlineData(false, 1, 6)]
[InlineData(false, 1, 7)]
[InlineData(true, 1, 8)]
public async Task Eof_Test(bool shouldBeEof, int streamSize, int readBitsAmount)
{
var kaitaiStreamSUT = Create(new byte[streamSize]);

await kaitaiStreamSUT.ReadBitsIntAsync(readBitsAmount);

if (shouldBeEof)
{
Assert.True(kaitaiStreamSUT.IsEof);
}
else
{
Assert.False(kaitaiStreamSUT.IsEof);
}
}

[Theory]
[InlineData(0, 0)]
[InlineData(1, 1)]
public async Task Pos_ByRead_Test(int expectedPos, int readBitsAmount)
{
var kaitaiStreamSUT = Create(new byte[1]);

await kaitaiStreamSUT.ReadBytesAsync(readBitsAmount);

Assert.Equal(expectedPos, kaitaiStreamSUT.Pos);
}

[Theory]
[InlineData(0, 0)]
[InlineData(1, 1)]
public async Task Pos_BySeek_Test(int expectedPos, int position)
{
var kaitaiStreamSUT = Create(new byte[1]);

await kaitaiStreamSUT.SeekAsync(position);

Assert.Equal(expectedPos, kaitaiStreamSUT.Pos);
}

[Theory]
[InlineData(0)]
[InlineData(1)]
public void Size_Test(int streamSize)
{
var kaitaiStreamSUT = Create(new byte[streamSize]);

Assert.Equal(streamSize, kaitaiStreamSUT.Size);
}

[Fact]
public async Task AlignToByte_Test()
{
//Arrange
var kaitaiStreamSUT = Create(new byte[] {0b_1000_0000});

ulong read = await kaitaiStreamSUT.ReadBitsIntAsync(1);
Assert.Equal(1u, read);

//Act
kaitaiStreamSUT.AlignToByte();
//Assert
Assert.Equal(1, kaitaiStreamSUT.Pos);
}

[Fact]
public void EmptyStream_NoRead_NoSeek_IsEof_ShouldBe_True()
{
var kaitaiStreamSUT = Create(new byte[0]);

Assert.True(kaitaiStreamSUT.IsEof);
}

[Fact]
public void EmptyStream_NoRead_NoSeek_Pos_ShouldBe_0()
{
var kaitaiStreamSUT = Create(new byte[0]);

Assert.Equal(0, kaitaiStreamSUT.Pos);
}
}
}
48 changes: 29 additions & 19 deletions Kaitai.Struct.Runtime.Async.Tests/KaitaiAsyncStructTests.cs
Original file line number Diff line number Diff line change
@@ -1,28 +1,38 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using Kaitai.Async;
using Xunit;

namespace Kaitai.Struct.Runtime.Async.Tests
{

public class KaitaiAsyncStructTests
public class StreamKaitaiAsyncStructTests : KaitaiAsyncStructTests
{
protected override KaitaiAsyncStream Create(byte[] data) => new KaitaiAsyncStream(data);
}

public class PipeReaderKaitaiAsyncStructTests : KaitaiAsyncStructTests
{
protected override KaitaiAsyncStream Create(byte[] data) =>
new KaitaiAsyncStream(System.IO.Pipelines.PipeReader.Create(new MemoryStream(data)));
}

public abstract class KaitaiAsyncStructTests
{
protected abstract KaitaiAsyncStream Create(byte[] data);

private class FooKaitaiAsyncStruct : KaitaiAsyncStruct
{
[Fact]
public void M_Io_IsSet()
{
var kaitaiAsyncStream = new KaitaiAsyncStream(new byte[0]);
var kaitaiAsyncStructSUT = new FooKaitaiAsyncStruct(kaitaiAsyncStream);
public FooKaitaiAsyncStruct(KaitaiAsyncStream kaitaiStream) : base(kaitaiStream)
{
}
}

Assert.Equal(kaitaiAsyncStream, kaitaiAsyncStructSUT.M_Io);
}
[Fact]
public void M_Io_IsSet()
{
var kaitaiAsyncStream = Create(new byte[0]);
var kaitaiAsyncStructSUT = new FooKaitaiAsyncStruct(kaitaiAsyncStream);

private class FooKaitaiAsyncStruct : KaitaiAsyncStruct
{
public FooKaitaiAsyncStruct(KaitaiAsyncStream kaitaiStream) : base(kaitaiStream)
{
}
}
Assert.Equal(kaitaiAsyncStream, kaitaiAsyncStructSUT.M_Io);
}
}
}
}
30 changes: 0 additions & 30 deletions Kaitai.Struct.Runtime.Async.Tests/ReadBits.cs

This file was deleted.

41 changes: 41 additions & 0 deletions Kaitai.Struct.Runtime.Async.Tests/ReadBitsAsyncTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
using System.IO;
using System.Threading.Tasks;
using Kaitai.Async;
using Xunit;

namespace Kaitai.Struct.Runtime.Async.Tests
{
public class StreamKaitaiReadBitsAsyncTests : ReadBitsAsyncTests
{
protected override KaitaiAsyncStream Create(byte[] data) => new KaitaiAsyncStream(data);
}

public class PipeReaderReadBitsAsyncTests : ReadBitsAsyncTests
{
protected override KaitaiAsyncStream Create(byte[] data) =>
new KaitaiAsyncStream(System.IO.Pipelines.PipeReader.Create(new MemoryStream(data)));
}

public abstract class ReadBitsAsyncTests
{
protected abstract KaitaiAsyncStream Create(byte[] data);

[Theory]
[MemberData(nameof(BitsData.BitsBeData), MemberType = typeof(BitsData))]
public async Task ReadBitsIntAsync_Test(ulong expected, byte[] streamContent, int bitsCount)
{
var kaitaiStreamSUT = Create(streamContent);

Assert.Equal(expected, await kaitaiStreamSUT.ReadBitsIntAsync(bitsCount));
}

[Theory]
[MemberData(nameof(BitsData.BitsLeData), MemberType = typeof(BitsData))]
public async Task ReadBitsIntLeAsync_Test(ulong expected, byte[] streamContent, int bitsCount)
{
var kaitaiStreamSUT = Create(streamContent);

Assert.Equal(expected, await kaitaiStreamSUT.ReadBitsIntLeAsync(bitsCount));
}
}
}
Loading

0 comments on commit a93100d

Please sign in to comment.