1+ using System ;
2+ using System . Collections . Generic ;
3+ using System . IO ;
4+ using System . Linq ;
5+ using System . Text ;
6+ using System . Threading . Tasks ;
7+ using Kaitai . Async ;
8+ using Xunit ;
9+
10+ namespace Kaitai . Struct . Runtime . Async . Tests . PipeReader
11+ {
12+ public class ReadBytesAsync
13+ {
14+ public static IEnumerable < object [ ] > BytesData =>
15+ new List < ( byte [ ] streamContent , int bytesCount ) >
16+ {
17+ ( new byte [ ] { 0b_1101_0101 } , 0 ) ,
18+ ( new byte [ ] { 0b_1101_0101 } , 1 ) ,
19+ ( new byte [ ] { 0b_1101_0101 , 0b_1101_0101 } , 1 ) ,
20+ ( new byte [ ] { 0b_1101_0101 , 0b_1101_0101 } , 2 ) ,
21+ } . Select ( t => new object [ ] { t . streamContent , t . bytesCount } ) ;
22+
23+
24+ [ Theory ]
25+ [ MemberData ( nameof ( BytesData ) ) ]
26+ public async Task ReadBytesAsync_long_Test ( byte [ ] streamContent , long bytesCount )
27+ {
28+ var kaitaiStreamSUT = new KaitaiPipeReaderAsyncStream ( streamContent ) ;
29+
30+ Assert . Equal ( streamContent . Take ( ( int ) bytesCount ) , await kaitaiStreamSUT . ReadBytesAsync ( bytesCount ) ) ;
31+ }
32+
33+ [ Theory ]
34+ [ MemberData ( nameof ( BytesData ) ) ]
35+ public async Task ReadBytesAsync_ulong_Test ( byte [ ] streamContent , ulong bytesCount )
36+ {
37+ var kaitaiStreamSUT = new KaitaiPipeReaderAsyncStream ( streamContent ) ;
38+
39+ Assert . Equal ( streamContent . Take ( ( int ) bytesCount ) , await kaitaiStreamSUT . ReadBytesAsync ( bytesCount ) ) ;
40+ }
41+
42+ [ Fact ]
43+ public async Task ReadBytesAsyncLong_NegativeInvoke_ThrowsArgumentOutOfRangeException ( )
44+ {
45+ var kaitaiStreamSUT = new KaitaiPipeReaderAsyncStream ( new byte [ 0 ] ) ;
46+
47+ await Assert . ThrowsAsync < ArgumentOutOfRangeException > ( async ( ) =>
48+ await kaitaiStreamSUT . ReadBytesAsync ( ( long ) - 1 ) ) ;
49+ }
50+
51+ [ Fact ]
52+ public async Task ReadBytesAsyncLong_LargerThanInt32Invoke_ThrowsArgumentOutOfRangeException ( )
53+ {
54+ var kaitaiStreamSUT = new KaitaiPipeReaderAsyncStream ( new byte [ 0 ] ) ;
55+
56+ await Assert . ThrowsAsync < ArgumentOutOfRangeException > ( async ( ) =>
57+ await kaitaiStreamSUT . ReadBytesAsync ( ( long ) Int32 . MaxValue + 1 ) ) ;
58+ }
59+
60+ [ Fact ]
61+ public async Task ReadBytesAsyncLong_LargerThanBufferInvoke_ThrowsArgumentOutOfRangeException ( )
62+ {
63+ var kaitaiStreamSUT = new KaitaiPipeReaderAsyncStream ( new byte [ 0 ] ) ;
64+
65+ await Assert . ThrowsAsync < EndOfStreamException > ( async ( ) =>
66+ await kaitaiStreamSUT . ReadBytesAsync ( ( long ) 1 ) ) ;
67+ }
68+
69+ [ Fact ]
70+ public async Task ReadBytesAsyncULong_LargerThanInt32Invoke_ThrowsArgumentOutOfRangeException ( )
71+ {
72+ var kaitaiStreamSUT = new KaitaiPipeReaderAsyncStream ( new byte [ 0 ] ) ;
73+
74+ await Assert . ThrowsAsync < ArgumentOutOfRangeException > ( async ( ) =>
75+ await kaitaiStreamSUT . ReadBytesAsync ( ( ulong ) Int32 . MaxValue + 1 ) ) ;
76+ }
77+
78+ [ Fact ]
79+ public async Task ReadBytesAsyncULong_LargerThanBufferInvoke_ThrowsArgumentOutOfRangeException ( )
80+ {
81+ var kaitaiStreamSUT = new KaitaiPipeReaderAsyncStream ( new byte [ 0 ] ) ;
82+
83+ await Assert . ThrowsAsync < EndOfStreamException > ( async ( ) =>
84+ await kaitaiStreamSUT . ReadBytesAsync ( ( ulong ) 1 ) ) ;
85+ }
86+
87+ public static IEnumerable < object [ ] > StringData =>
88+ new List < string >
89+ {
90+ "" ,
91+ "ABC" ,
92+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ,
93+ } . Select ( t => new [ ] { Encoding . ASCII . GetBytes ( t ) } ) ;
94+
95+
96+ [ Theory ]
97+ [ MemberData ( nameof ( StringData ) ) ]
98+ public async Task ReadBytesFullAsync_Test ( byte [ ] streamContent )
99+ {
100+ var kaitaiStreamSUT = new KaitaiPipeReaderAsyncStream ( streamContent ) ;
101+
102+ Assert . Equal ( streamContent , await kaitaiStreamSUT . ReadBytesFullAsync ( ) ) ;
103+ }
104+
105+ [ Theory ]
106+ [ MemberData ( nameof ( StringData ) ) ]
107+ public async Task EnsureFixedContentsAsync_Test ( byte [ ] streamContent )
108+ {
109+ var kaitaiStreamSUT = new KaitaiPipeReaderAsyncStream ( streamContent ) ;
110+
111+ Assert . Equal ( streamContent , await kaitaiStreamSUT . EnsureFixedContentsAsync ( streamContent ) ) ;
112+ }
113+
114+ [ Theory ]
115+ [ MemberData ( nameof ( StringData ) ) ]
116+ public async Task EnsureFixedContentsAsync_ThrowsIfByteIsChanged ( byte [ ] streamContent )
117+ {
118+ if ( streamContent . Length == 0 ) return ;
119+
120+ var kaitaiStreamSUT = new KaitaiPipeReaderAsyncStream ( streamContent ) ;
121+
122+ var expected = streamContent . ToArray ( ) ;
123+ expected [ 0 ] = ( byte ) ~ expected [ 0 ] ;
124+
125+ await Assert . ThrowsAsync < Exception > ( async ( ) => await kaitaiStreamSUT . EnsureFixedContentsAsync ( expected ) ) ;
126+ }
127+
128+ public static IEnumerable < object [ ] > StringWithTerminatorsData =>
129+ new List < ( string streamContent , string expected , char terminator , bool isPresent , bool shouldInclude ) >
130+ {
131+ ( "" , "" , '\0 ' , false , false ) ,
132+ ( "" , "" , '\0 ' , false , true ) ,
133+
134+ ( "ABC" , "ABC" , '\0 ' , false , false ) ,
135+ ( "ABC" , "ABC" , '\0 ' , false , true ) ,
136+
137+ ( "ABC" , "" , 'A' , true , false ) ,
138+ ( "ABC" , "A" , 'A' , true , true ) ,
139+
140+ ( "ABC" , "A" , 'B' , true , false ) ,
141+ ( "ABC" , "AB" , 'B' , true , true ) ,
142+
143+ ( "ABC" , "AB" , 'C' , true , false ) ,
144+ ( "ABC" , "ABC" , 'C' , true , true ) ,
145+ } . Select ( t => new [ ] { Encoding . ASCII . GetBytes ( t . streamContent ) , Encoding . ASCII . GetBytes ( t . expected ) , ( object ) ( byte ) t . terminator , t . isPresent , t . shouldInclude } ) ;
146+
147+ [ Theory ]
148+ [ MemberData ( nameof ( StringWithTerminatorsData ) ) ]
149+ public async Task ReadBytesTermAsync ( byte [ ] streamContent , byte [ ] expected , byte terminator , bool _ , bool shouldInclude )
150+ {
151+ var kaitaiStreamSUT = new KaitaiPipeReaderAsyncStream ( streamContent ) ;
152+
153+ Assert . Equal ( expected , await kaitaiStreamSUT . ReadBytesTermAsync ( terminator , shouldInclude , false , false ) ) ;
154+ }
155+
156+ [ Theory ]
157+ [ MemberData ( nameof ( StringWithTerminatorsData ) ) ]
158+ public async Task ReadBytesTermAsync_ThrowsIsTerminatorNotPresent ( byte [ ] streamContent , byte [ ] expected , byte terminator , bool terminatorIsPresent , bool shouldInclude )
159+ {
160+ var kaitaiStreamSUT = new KaitaiPipeReaderAsyncStream ( streamContent ) ;
161+
162+ if ( terminatorIsPresent ) return ;
163+
164+ await Assert . ThrowsAsync < EndOfStreamException > ( async ( ) => await kaitaiStreamSUT . ReadBytesTermAsync ( terminator , shouldInclude , false , true ) ) ;
165+ }
166+
167+ [ Theory ]
168+ [ MemberData ( nameof ( StringWithTerminatorsData ) ) ]
169+ public async Task ReadBytesTermAsync_ShouldNotConsumeTerminator ( byte [ ] streamContent , byte [ ] expected , byte terminator , bool terminatorIsPresent , bool shouldInclude )
170+ {
171+ //Arrange
172+ var kaitaiStreamSUT = new KaitaiPipeReaderAsyncStream ( streamContent ) ;
173+
174+ //Act
175+ await kaitaiStreamSUT . ReadBytesTermAsync ( terminator , shouldInclude , false , false ) ;
176+
177+ //Assert
178+ var amountToConsume = expected . Length ;
179+ if ( expected . Length > 0 && shouldInclude && terminatorIsPresent )
180+ {
181+ amountToConsume -- ;
182+ }
183+
184+ Assert . Equal ( amountToConsume , kaitaiStreamSUT . Pos ) ;
185+ }
186+
187+ [ Theory ]
188+ [ MemberData ( nameof ( StringWithTerminatorsData ) ) ]
189+ public async Task ReadBytesTermAsync_ShouldConsumeTerminator ( byte [ ] streamContent , byte [ ] expected , byte terminator , bool terminatorIsPresent , bool shouldInclude )
190+ {
191+ //Arrange
192+ var kaitaiStreamSUT = new KaitaiPipeReaderAsyncStream ( streamContent ) ;
193+
194+ //Act
195+ await kaitaiStreamSUT . ReadBytesTermAsync ( terminator , shouldInclude , true , false ) ;
196+
197+ //Assert
198+ var amountToConsume = expected . Length ;
199+ if ( ! shouldInclude && terminatorIsPresent )
200+ {
201+ amountToConsume ++ ;
202+ }
203+
204+ Assert . Equal ( amountToConsume , kaitaiStreamSUT . Pos ) ;
205+ }
206+
207+ }
208+ }
0 commit comments