@@ -129,5 +129,112 @@ public void Dispose_DisposesUnderlyingStream()
129129 // Assert: baseStream should be disposed and reading should throw
130130 Assert . Throws < ObjectDisposedException > ( ( ) => baseStream . ReadByte ( ) ) ;
131131 }
132+
133+ [ Test ]
134+ public void GetChunks_DoesNotReturnChunksSmallerThanRequestedSize_WhenEnoughDataAvailable ( )
135+ {
136+ // Arrange
137+ var chunkSize = 8 * 1024 * 1024 ; // 8 MB
138+ var totalSize = chunkSize * 3 ; // exactly 3 chunks
139+ var data = Enumerable . Range ( 0 , totalSize ) . Select ( i => ( byte ) ( i % 256 ) ) . ToArray ( ) ;
140+ using var baseStream = new MemoryStream ( data ) ;
141+ using var chunked = new ChunkedStream ( baseStream , chunkSize ) ;
142+
143+ // Act
144+ var chunks = chunked . GetChunks ( ) . ToList ( ) ;
145+
146+ // Assert
147+ Assert . That ( chunks , Has . Count . EqualTo ( 3 ) ) ;
148+ for ( int idx = 0 ; idx < chunks . Count ; idx ++ )
149+ {
150+ using var chunk = chunks [ idx ] ;
151+ int length = ( int ) chunk . Length ;
152+ Assert . That ( length , Is . EqualTo ( chunkSize ) , $ "Chunk #{ idx } length is not equal to requested chunk size") ;
153+ }
154+ }
155+
156+ [ Test ]
157+ public void GetChunks_ProducesSingleChunk_WhenDataSmallerThanChunkSize ( )
158+ {
159+ // Arrange
160+ var chunkSize = 8 * 1024 * 1024 ; // 8 MB
161+ var totalSize = 32 * 1024 ; // 32 KB
162+ var data = Enumerable . Range ( 0 , totalSize ) . Select ( i => ( byte ) ( i % 256 ) ) . ToArray ( ) ;
163+ using var baseStream = new MemoryStream ( data ) ;
164+ using var chunked = new ChunkedStream ( baseStream , chunkSize ) ;
165+
166+ // Act
167+ var chunks = chunked . GetChunks ( ) . ToList ( ) ;
168+
169+ // Assert
170+ Assert . That ( chunks , Has . Count . EqualTo ( 1 ) ) ;
171+ using var onlyChunk = chunks [ 0 ] ;
172+ Assert . That ( onlyChunk . Length , Is . EqualTo ( totalSize ) ) ;
173+ }
174+
175+ [ Test ]
176+ public void GetChunks_RespectsBaseStreamPosition_StartsFromCurrentPosition ( )
177+ {
178+ // Arrange
179+ var totalSize = 1024 * 1024 ; // 1 MB
180+ var chunkSize = 64 * 1024 ; // 64 KB
181+ var skip = 128 * 1024 ; // skip first 128 KB
182+ var data = Enumerable . Range ( 0 , totalSize ) . Select ( i => ( byte ) ( i % 256 ) ) . ToArray ( ) ;
183+ using var baseStream = new MemoryStream ( data ) ;
184+ baseStream . Position = skip ;
185+ using var chunked = new ChunkedStream ( baseStream , chunkSize ) ;
186+
187+ // Act
188+ var chunks = chunked . GetChunks ( ) . ToList ( ) ;
189+
190+ // Assert
191+ var remaining = totalSize - skip ;
192+ var expectedFullChunks = remaining / chunkSize ;
193+ var expectedLastChunk = remaining % chunkSize ;
194+
195+ Assert . That ( chunks , Has . Count . EqualTo ( expectedFullChunks + ( expectedLastChunk > 0 ? 1 : 0 ) ) ) ;
196+
197+ // First byte of first chunk should equal data[skip]
198+ using ( var firstChunk = chunks [ 0 ] )
199+ {
200+ Assert . That ( firstChunk . ReadByte ( ) , Is . EqualTo ( data [ skip ] ) ) ;
201+ }
202+
203+ // Dispose rest
204+ for ( int i = 1 ; i < chunks . Count ; i ++ )
205+ {
206+ chunks [ i ] . Dispose ( ) ;
207+ }
208+ }
209+
210+ [ Test ]
211+ public void GetChunks_ReturnsConsistentChunkSizes_ForLargeStreams ( )
212+ {
213+ // Arrange: create stream larger than typical buffer sizes
214+ var chunkSize = 8 * 1024 * 1024 ; // 8 MB
215+ var totalSize = chunkSize * 5 + chunkSize / 2 ; // 5.5 chunks
216+ var data = new byte [ totalSize ] ;
217+ new Random ( 1234 ) . NextBytes ( data ) ;
218+ using var baseStream = new MemoryStream ( data ) ;
219+ using var chunked = new ChunkedStream ( baseStream , chunkSize ) ;
220+
221+ // Act
222+ var chunks = chunked . GetChunks ( ) . ToList ( ) ;
223+
224+ // Assert
225+ Assert . That ( chunks , Has . Count . EqualTo ( 6 ) ) ;
226+ for ( int i = 0 ; i < chunks . Count ; i ++ )
227+ {
228+ using var chunk = chunks [ i ] ;
229+ if ( i < 5 )
230+ {
231+ Assert . That ( chunk . Length , Is . EqualTo ( chunkSize ) ) ;
232+ }
233+ else
234+ {
235+ Assert . That ( chunk . Length , Is . EqualTo ( chunkSize / 2 ) ) ;
236+ }
237+ }
238+ }
132239 }
133240}
0 commit comments