Skip to content

Commit 6bd571d

Browse files
committed
consensus_encoding: add encoder composition tests
1 parent bda6df7 commit 6bd571d

File tree

1 file changed

+257
-0
lines changed

1 file changed

+257
-0
lines changed

consensus_encoding/src/encode/encoders.rs

Lines changed: 257 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)