@@ -241,61 +241,106 @@ impl<A: Encoder, B: Encoder, C: Encoder, D: Encoder, E: Encoder, F: Encoder> Enc
241241}
242242
243243#[ cfg( test) ]
244- #[ cfg( feature = "alloc" ) ]
245244mod tests {
246- use alloc:: vec:: Vec ;
247-
248245 use super :: * ;
249246
250- // Run the encoder i.e., use it to encode into a vector.
251- fn run_encoder ( mut encoder : impl Encoder ) -> Vec < u8 > {
252- let mut vec = Vec :: new ( ) ;
253- while let Some ( chunk) = encoder. current_chunk ( ) {
254- vec. extend_from_slice ( chunk) ;
255- encoder. advance ( ) ;
247+ struct TestBytes < ' a > ( & ' a [ u8 ] , bool ) ;
248+
249+ impl < ' a > Encodable for TestBytes < ' a > {
250+ type Encoder < ' s >
251+ = BytesEncoder < ' s >
252+ where
253+ Self : ' s ;
254+
255+ fn encoder ( & self ) -> Self :: Encoder < ' _ > {
256+ if self . 1 {
257+ BytesEncoder :: with_length_prefix ( self . 0 )
258+ } else {
259+ BytesEncoder :: without_length_prefix ( self . 0 )
260+ }
256261 }
257- vec
262+ }
263+
264+ struct TestArray < const N : usize > ( [ u8 ; N ] ) ;
265+
266+ impl < const N : usize > Encodable for TestArray < N > {
267+ type Encoder < ' s >
268+ = ArrayEncoder < N >
269+ where
270+ Self : ' s ;
271+
272+ fn encoder ( & self ) -> Self :: Encoder < ' _ > { ArrayEncoder :: without_length_prefix ( self . 0 ) }
273+ }
274+
275+ #[ test]
276+ fn encode_array_with_data ( ) {
277+ // Should have one chunk with the array data, then exhausted.
278+ let test_array = TestArray ( [ 1u8 , 2 , 3 , 4 ] ) ;
279+ let mut encoder = test_array. encoder ( ) ;
280+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 1u8 , 2 , 3 , 4 ] [ ..] ) ) ;
281+ assert ! ( !encoder. advance( ) ) ;
282+ assert_eq ! ( encoder. current_chunk( ) , None ) ;
283+ }
284+
285+ #[ test]
286+ fn encode_empty_array ( ) {
287+ // Empty array should have one empty chunk, then exhausted.
288+ let test_array = TestArray ( [ ] ) ;
289+ let mut encoder = test_array. encoder ( ) ;
290+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ ] [ ..] ) ) ;
291+ assert ! ( !encoder. advance( ) ) ;
292+ assert_eq ! ( encoder. current_chunk( ) , None ) ;
258293 }
259294
260295 #[ test]
261296 fn encode_byte_slice_without_prefix ( ) {
297+ // Should have one chunk with the byte data, then exhausted.
262298 let obj = [ 1u8 , 2 , 3 ] ;
299+ let test_bytes = TestBytes ( & obj, false ) ;
300+ let mut encoder = test_bytes. encoder ( ) ;
263301
264- let encoder = BytesEncoder :: without_length_prefix ( & obj) ;
265- let got = run_encoder ( encoder) ;
266-
267- assert_eq ! ( got, obj) ;
302+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 1u8 , 2 , 3 ] [ ..] ) ) ;
303+ assert ! ( !encoder. advance( ) ) ;
304+ assert_eq ! ( encoder. current_chunk( ) , None ) ;
268305 }
269306
270307 #[ test]
271308 fn encode_empty_byte_slice_without_prefix ( ) {
309+ // Should have one empty chunk, then exhausted.
272310 let obj = [ ] ;
311+ let test_bytes = TestBytes ( & obj, false ) ;
312+ let mut encoder = test_bytes. encoder ( ) ;
273313
274- let encoder = BytesEncoder :: without_length_prefix ( & obj) ;
275- let got = run_encoder ( encoder) ;
276-
277- assert_eq ! ( got, obj) ;
314+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ ] [ ..] ) ) ;
315+ assert ! ( !encoder. advance( ) ) ;
316+ assert_eq ! ( encoder. current_chunk( ) , None ) ;
278317 }
279318
280319 #[ test]
281320 fn encode_byte_slice_with_prefix ( ) {
321+ // Should have length prefix chunk, then data chunk, then exhausted.
282322 let obj = [ 1u8 , 2 , 3 ] ;
283-
284- let encoder = BytesEncoder :: with_length_prefix ( & obj) ;
285- let got = run_encoder ( encoder) ;
286-
287- let want = [ 3u8 , 1 , 2 , 3 ] ;
288- assert_eq ! ( got, want) ;
323+ let test_bytes = TestBytes ( & obj, true ) ;
324+ let mut encoder = test_bytes. encoder ( ) ;
325+
326+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 3u8 ] [ ..] ) ) ;
327+ assert ! ( encoder. advance( ) ) ;
328+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 1u8 , 2 , 3 ] [ ..] ) ) ;
329+ assert ! ( !encoder. advance( ) ) ;
330+ assert_eq ! ( encoder. current_chunk( ) , None ) ;
289331 }
290332
291333 #[ test]
292334 fn encode_empty_byte_slice_with_prefix ( ) {
335+ // Should have length prefix chunk (0), then empty data chunk, then exhausted.
293336 let obj = [ ] ;
294-
295- let encoder = BytesEncoder :: with_length_prefix ( & obj) ;
296- let got = run_encoder ( encoder) ;
297-
298- let want = [ 0u8 ] ;
299- assert_eq ! ( got, want) ;
337+ let test_bytes = TestBytes ( & obj, true ) ;
338+ let mut encoder = test_bytes. encoder ( ) ;
339+
340+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0u8 ] [ ..] ) ) ;
341+ assert ! ( encoder. advance( ) ) ;
342+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ ] [ ..] ) ) ;
343+ assert ! ( !encoder. advance( ) ) ;
344+ assert_eq ! ( encoder. current_chunk( ) , None ) ;
300345 }
301346}
0 commit comments