Skip to content

Commit 0df6b1e

Browse files
committed
Merge rust-bitcoin#5045: Add encoder composition unit tests
6bd571d consensus_encoding: add encoder composition tests (Nick Johnson) Pull request description: Just rounding out the encoders module unit tests with some across the composite encoders. ACKs for top commit: apoelstra: ACK 6bd571d; successfully ran local tests; awesome! hopefully no more sliceencoder bugs tcharding: ACK 6bd571d Tree-SHA512: ba180deb9209eb2fd5a221a4fc34e2d2eb6ff460c5f36b8150e57c12d4ee3ae0c58e74337e75bf154f16345f3fae841cc9d6295580f2121f4a373614c0251bc3
2 parents 51b74e7 + 6bd571d commit 0df6b1e

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
@@ -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

Comments
 (0)