@@ -384,4 +384,261 @@ mod tests {
384384 assert ! ( !encoder. advance( ) ) ;
385385 assert_eq ! ( encoder. current_chunk( ) , None ) ;
386386 }
387+
388+ #[ test]
389+ fn encode_two_arrays ( ) {
390+ // Should encode first array, then second array, then exhausted.
391+ let enc1 = TestArray ( [ 1u8 , 2 ] ) . encoder ( ) ;
392+ let enc2 = TestArray ( [ 3u8 , 4 ] ) . encoder ( ) ;
393+ let mut encoder = Encoder2 :: new ( enc1, enc2) ;
394+
395+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 1u8 , 2 ] [ ..] ) ) ;
396+ assert ! ( encoder. advance( ) ) ;
397+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 3u8 , 4 ] [ ..] ) ) ;
398+ assert ! ( !encoder. advance( ) ) ;
399+ assert_eq ! ( encoder. current_chunk( ) , None ) ;
400+ }
401+
402+ #[ test]
403+ fn encode_two_empty_arrays ( ) {
404+ // Should encode first empty array, then second empty array, then exhausted.
405+ let enc1 = TestArray ( [ ] ) . encoder ( ) ;
406+ let enc2 = TestArray ( [ ] ) . encoder ( ) ;
407+ let mut encoder = Encoder2 :: new ( enc1, enc2) ;
408+
409+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ ] [ ..] ) ) ;
410+ assert ! ( encoder. advance( ) ) ;
411+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ ] [ ..] ) ) ;
412+ assert ! ( !encoder. advance( ) ) ;
413+ assert_eq ! ( encoder. current_chunk( ) , None ) ;
414+ }
415+
416+ #[ test]
417+ fn encode_two_byte_slices_mixed ( ) {
418+ // Should encode byte slice without prefix, then with prefix, then exhausted.
419+ let enc1 = TestBytes ( & [ 0xAA , 0xBB ] , false ) . encoder ( ) ;
420+ let enc2 = TestBytes ( & [ 0xCC ] , true ) . encoder ( ) ;
421+ let mut encoder = Encoder2 :: new ( enc1, enc2) ;
422+
423+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0xAA , 0xBB ] [ ..] ) ) ;
424+ assert ! ( encoder. advance( ) ) ;
425+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 1u8 ] [ ..] ) ) ;
426+ assert ! ( encoder. advance( ) ) ;
427+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0xCC ] [ ..] ) ) ;
428+ assert ! ( !encoder. advance( ) ) ;
429+ assert_eq ! ( encoder. current_chunk( ) , None ) ;
430+ }
431+
432+ #[ test]
433+ fn encode_three_arrays ( ) {
434+ // Should encode three arrays in sequence, then exhausted.
435+ let enc1 = TestArray ( [ 1u8 ] ) . encoder ( ) ;
436+ let enc2 = TestArray ( [ 2u8 , 3u8 ] ) . encoder ( ) ;
437+ let enc3 = TestArray ( [ 4u8 , 5u8 , 6u8 ] ) . encoder ( ) ;
438+ let mut encoder = Encoder3 :: new ( enc1, enc2, enc3) ;
439+
440+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 1u8 ] [ ..] ) ) ;
441+ assert ! ( encoder. advance( ) ) ;
442+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 2u8 , 3u8 ] [ ..] ) ) ;
443+ assert ! ( encoder. advance( ) ) ;
444+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 4u8 , 5u8 , 6u8 ] [ ..] ) ) ;
445+ assert ! ( !encoder. advance( ) ) ;
446+ assert_eq ! ( encoder. current_chunk( ) , None ) ;
447+ }
448+
449+ #[ test]
450+ fn encode_four_arrays ( ) {
451+ // Should encode four arrays in sequence, then exhausted.
452+ let enc1 = TestArray ( [ 0x10 ] ) . encoder ( ) ;
453+ let enc2 = TestArray ( [ 0x20 ] ) . encoder ( ) ;
454+ let enc3 = TestArray ( [ 0x30 ] ) . encoder ( ) ;
455+ let enc4 = TestArray ( [ 0x40 ] ) . encoder ( ) ;
456+ let mut encoder = Encoder4 :: new ( enc1, enc2, enc3, enc4) ;
457+
458+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x10 ] [ ..] ) ) ;
459+ assert ! ( encoder. advance( ) ) ;
460+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x20 ] [ ..] ) ) ;
461+ assert ! ( encoder. advance( ) ) ;
462+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x30 ] [ ..] ) ) ;
463+ assert ! ( encoder. advance( ) ) ;
464+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x40 ] [ ..] ) ) ;
465+ assert ! ( !encoder. advance( ) ) ;
466+ assert_eq ! ( encoder. current_chunk( ) , None ) ;
467+ }
468+
469+ #[ test]
470+ fn encode_six_arrays ( ) {
471+ // Should encode six arrays in sequence, then exhausted.
472+ let enc1 = TestArray ( [ 0x01 ] ) . encoder ( ) ;
473+ let enc2 = TestArray ( [ 0x02 ] ) . encoder ( ) ;
474+ let enc3 = TestArray ( [ 0x03 ] ) . encoder ( ) ;
475+ let enc4 = TestArray ( [ 0x04 ] ) . encoder ( ) ;
476+ let enc5 = TestArray ( [ 0x05 ] ) . encoder ( ) ;
477+ let enc6 = TestArray ( [ 0x06 ] ) . encoder ( ) ;
478+ let mut encoder = Encoder6 :: new ( enc1, enc2, enc3, enc4, enc5, enc6) ;
479+
480+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x01 ] [ ..] ) ) ;
481+ assert ! ( encoder. advance( ) ) ;
482+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x02 ] [ ..] ) ) ;
483+ assert ! ( encoder. advance( ) ) ;
484+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x03 ] [ ..] ) ) ;
485+ assert ! ( encoder. advance( ) ) ;
486+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x04 ] [ ..] ) ) ;
487+ assert ! ( encoder. advance( ) ) ;
488+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x05 ] [ ..] ) ) ;
489+ assert ! ( encoder. advance( ) ) ;
490+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x06 ] [ ..] ) ) ;
491+ assert ! ( !encoder. advance( ) ) ;
492+ assert_eq ! ( encoder. current_chunk( ) , None ) ;
493+ }
494+
495+ #[ test]
496+ fn encode_mixed_composition_with_byte_slices ( ) {
497+ // Should encode byte slice with prefix, then array, then exhausted.
498+ let enc1 = TestBytes ( & [ 0xFF , 0xEE ] , true ) . encoder ( ) ;
499+ let enc2 = TestArray ( [ 0xDD , 0xCC ] ) . encoder ( ) ;
500+ let mut encoder = Encoder2 :: new ( enc1, enc2) ;
501+
502+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 2u8 ] [ ..] ) ) ;
503+ assert ! ( encoder. advance( ) ) ;
504+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0xFF , 0xEE ] [ ..] ) ) ;
505+ assert ! ( encoder. advance( ) ) ;
506+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0xDD , 0xCC ] [ ..] ) ) ;
507+ assert ! ( !encoder. advance( ) ) ;
508+ assert_eq ! ( encoder. current_chunk( ) , None ) ;
509+ }
510+
511+ #[ test]
512+ fn encode_nested_composition ( ) {
513+ // Should encode empty array, single byte array, then three byte array, then exhausted.
514+ let enc1 = TestArray ( [ ] ) . encoder ( ) ;
515+ let enc2 = TestArray ( [ 0x42 ] ) . encoder ( ) ;
516+ let enc3 = TestArray ( [ 0x43 , 0x44 , 0x45 ] ) . encoder ( ) ;
517+ let mut encoder = Encoder3 :: new ( enc1, enc2, enc3) ;
518+
519+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ ] [ ..] ) ) ;
520+ assert ! ( encoder. advance( ) ) ;
521+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x42 ] [ ..] ) ) ;
522+ assert ! ( encoder. advance( ) ) ;
523+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x43 , 0x44 , 0x45 ] [ ..] ) ) ;
524+ assert ! ( !encoder. advance( ) ) ;
525+ assert_eq ! ( encoder. current_chunk( ) , None ) ;
526+ }
527+
528+ #[ test]
529+ fn encode_slice_with_array_composition ( ) {
530+ // Should encode slice with prefix and elements, then array, then exhausted.
531+ let slice = & [ TestArray ( [ 0x10 , 0x11 ] ) , TestArray ( [ 0x12 , 0x13 ] ) ] ;
532+ let slice_enc = SliceEncoder :: with_length_prefix ( slice) ;
533+ let array_enc = TestArray ( [ 0x20 , 0x21 ] ) . encoder ( ) ;
534+ let mut encoder = Encoder2 :: new ( slice_enc, array_enc) ;
535+
536+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 2u8 ] [ ..] ) ) ;
537+ assert ! ( encoder. advance( ) ) ;
538+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x10 , 0x11 ] [ ..] ) ) ;
539+ assert ! ( encoder. advance( ) ) ;
540+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x12 , 0x13 ] [ ..] ) ) ;
541+ assert ! ( encoder. advance( ) ) ;
542+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x20 , 0x21 ] [ ..] ) ) ;
543+ assert ! ( !encoder. advance( ) ) ;
544+ assert_eq ! ( encoder. current_chunk( ) , None ) ;
545+ }
546+
547+ #[ test]
548+ fn encode_array_with_slice_composition ( ) {
549+ // Should encode header array, then slice with prefix and elements, then exhausted.
550+ let header = TestArray ( [ 0xFF , 0xFE ] ) . encoder ( ) ;
551+ let slice = & [ TestArray ( [ 0x01 ] ) , TestArray ( [ 0x02 ] ) , TestArray ( [ 0x03 ] ) ] ;
552+ let slice_enc = SliceEncoder :: with_length_prefix ( slice) ;
553+ let mut encoder = Encoder2 :: new ( header, slice_enc) ;
554+
555+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0xFF , 0xFE ] [ ..] ) ) ;
556+ assert ! ( encoder. advance( ) ) ;
557+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 3u8 ] [ ..] ) ) ;
558+ assert ! ( encoder. advance( ) ) ;
559+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x01 ] [ ..] ) ) ;
560+ assert ! ( encoder. advance( ) ) ;
561+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x02 ] [ ..] ) ) ;
562+ assert ! ( encoder. advance( ) ) ;
563+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x03 ] [ ..] ) ) ;
564+ assert ! ( !encoder. advance( ) ) ;
565+ assert_eq ! ( encoder. current_chunk( ) , None ) ;
566+ }
567+
568+ #[ test]
569+ fn encode_multiple_slices_composition ( ) {
570+ // Should encode three slices in sequence with prefixes and elements, then exhausted.
571+ let slice1 = & [ TestArray ( [ 0xA1 ] ) , TestArray ( [ 0xA2 ] ) ] ;
572+ let slice2: & [ TestArray < 1 > ] = & [ ] ;
573+ let slice3 = & [ TestArray ( [ 0xC1 ] ) , TestArray ( [ 0xC2 ] ) , TestArray ( [ 0xC3 ] ) ] ;
574+
575+ let enc1 = SliceEncoder :: with_length_prefix ( slice1) ;
576+ let enc2 = SliceEncoder :: with_length_prefix ( slice2) ;
577+ let enc3 = SliceEncoder :: with_length_prefix ( slice3) ;
578+ let mut encoder = Encoder3 :: new ( enc1, enc2, enc3) ;
579+
580+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 2u8 ] [ ..] ) ) ;
581+ assert ! ( encoder. advance( ) ) ;
582+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0xA1 ] [ ..] ) ) ;
583+ assert ! ( encoder. advance( ) ) ;
584+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0xA2 ] [ ..] ) ) ;
585+ assert ! ( encoder. advance( ) ) ;
586+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0u8 ] [ ..] ) ) ;
587+ assert ! ( encoder. advance( ) ) ;
588+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 3u8 ] [ ..] ) ) ;
589+ assert ! ( encoder. advance( ) ) ;
590+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0xC1 ] [ ..] ) ) ;
591+ assert ! ( encoder. advance( ) ) ;
592+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0xC2 ] [ ..] ) ) ;
593+ assert ! ( encoder. advance( ) ) ;
594+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0xC3 ] [ ..] ) ) ;
595+ assert ! ( !encoder. advance( ) ) ;
596+ assert_eq ! ( encoder. current_chunk( ) , None ) ;
597+ }
598+
599+ #[ test]
600+ fn encode_slice_with_mixed_byte_encoders ( ) {
601+ // Should encode slice of mixed byte encoders with different prefix settings, then exhausted.
602+ let bytes1 = TestBytes ( & [ 0x11 , 0x12 ] , false ) ;
603+ let bytes2 = TestBytes ( & [ 0x21 , 0x22 , 0x23 ] , true ) ;
604+ let bytes3 = TestBytes ( & [ ] , false ) ;
605+ let slice = & [ bytes1, bytes2, bytes3] ;
606+ let mut encoder = SliceEncoder :: with_length_prefix ( slice) ;
607+
608+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 3u8 ] [ ..] ) ) ;
609+ assert ! ( encoder. advance( ) ) ;
610+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x11 , 0x12 ] [ ..] ) ) ;
611+ assert ! ( encoder. advance( ) ) ;
612+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 3u8 ] [ ..] ) ) ;
613+ assert ! ( encoder. advance( ) ) ;
614+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x21 , 0x22 , 0x23 ] [ ..] ) ) ;
615+ assert ! ( encoder. advance( ) ) ;
616+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ ] [ ..] ) ) ;
617+ assert ! ( !encoder. advance( ) ) ;
618+ assert_eq ! ( encoder. current_chunk( ) , None ) ;
619+ }
620+
621+ #[ test]
622+ fn encode_complex_nested_structure ( ) {
623+ // Should encode header, slice with elements, and footer with prefix, then exhausted.
624+ let header = TestBytes ( & [ 0xDE , 0xAD ] , false ) . encoder ( ) ;
625+ let data_slice = & [ TestArray ( [ 0x01 , 0x02 ] ) , TestArray ( [ 0x03 , 0x04 ] ) ] ;
626+ let slice_enc = SliceEncoder :: with_length_prefix ( data_slice) ;
627+ let footer = TestBytes ( & [ 0xBE , 0xEF ] , true ) . encoder ( ) ;
628+ let mut encoder = Encoder3 :: new ( header, slice_enc, footer) ;
629+
630+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0xDE , 0xAD ] [ ..] ) ) ;
631+ assert ! ( encoder. advance( ) ) ;
632+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 2u8 ] [ ..] ) ) ;
633+ assert ! ( encoder. advance( ) ) ;
634+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x01 , 0x02 ] [ ..] ) ) ;
635+ assert ! ( encoder. advance( ) ) ;
636+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x03 , 0x04 ] [ ..] ) ) ;
637+ assert ! ( encoder. advance( ) ) ;
638+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 2u8 ] [ ..] ) ) ;
639+ assert ! ( encoder. advance( ) ) ;
640+ assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0xBE , 0xEF ] [ ..] ) ) ;
641+ assert ! ( !encoder. advance( ) ) ;
642+ assert_eq ! ( encoder. current_chunk( ) , None ) ;
643+ }
387644}
0 commit comments