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