@@ -481,6 +481,91 @@ fn test_streaming_no_std() {
481
481
}
482
482
}
483
483
484
+ #[ test]
485
+ fn test_decode_all ( ) {
486
+ use crate :: frame_decoder:: { FrameDecoder , FrameDecoderError } ;
487
+
488
+ let skip_frame = |input : & mut Vec < u8 > , length : usize | {
489
+ input. extend_from_slice ( & 0x184D2A50u32 . to_le_bytes ( ) ) ;
490
+ input. extend_from_slice ( & ( length as u32 ) . to_le_bytes ( ) ) ;
491
+ input. resize ( input. len ( ) + length, 0 ) ;
492
+ } ;
493
+
494
+ let mut original = Vec :: new ( ) ;
495
+ let mut input = Vec :: new ( ) ;
496
+
497
+ skip_frame ( & mut input, 300 ) ;
498
+ input. extend_from_slice ( include_bytes ! ( "../../decodecorpus_files/z000089.zst" ) ) ;
499
+ original. extend_from_slice ( include_bytes ! ( "../../decodecorpus_files/z000089" ) ) ;
500
+ skip_frame ( & mut input, 400 ) ;
501
+ input. extend_from_slice ( include_bytes ! ( "../../decodecorpus_files/z000090.zst" ) ) ;
502
+ original. extend_from_slice ( include_bytes ! ( "../../decodecorpus_files/z000090" ) ) ;
503
+ skip_frame ( & mut input, 500 ) ;
504
+
505
+ let mut decoder = FrameDecoder :: new ( ) ;
506
+
507
+ // decode_all with correct buffers.
508
+ let mut output = vec ! [ 0 ; original. len( ) ] ;
509
+ let result = decoder. decode_all ( & input, & mut output) . unwrap ( ) ;
510
+ assert_eq ! ( result, original. len( ) ) ;
511
+ assert_eq ! ( output, original) ;
512
+
513
+ // decode_all with smaller output length.
514
+ let mut output = vec ! [ 0 ; original. len( ) - 1 ] ;
515
+ let result = decoder. decode_all ( & input, & mut output) ;
516
+ assert ! (
517
+ matches!( result, Err ( FrameDecoderError :: TargetTooSmall ) ) ,
518
+ "{:?}" ,
519
+ result
520
+ ) ;
521
+
522
+ // decode_all with larger output length.
523
+ let mut output = vec ! [ 0 ; original. len( ) + 1 ] ;
524
+ let result = decoder. decode_all ( & input, & mut output) . unwrap ( ) ;
525
+ assert_eq ! ( result, original. len( ) ) ;
526
+ assert_eq ! ( & output[ ..result] , original) ;
527
+
528
+ // decode_all with truncated regular frame.
529
+ let mut output = vec ! [ 0 ; original. len( ) ] ;
530
+ let result = decoder. decode_all ( & input[ ..input. len ( ) - 600 ] , & mut output) ;
531
+ assert ! (
532
+ matches!( result, Err ( FrameDecoderError :: FailedToReadBlockBody ( _) ) ) ,
533
+ "{:?}" ,
534
+ result
535
+ ) ;
536
+
537
+ // decode_all with truncated skip frame.
538
+ let mut output = vec ! [ 0 ; original. len( ) ] ;
539
+ let result = decoder. decode_all ( & input[ ..input. len ( ) - 1 ] , & mut output) ;
540
+ assert ! (
541
+ matches!( result, Err ( FrameDecoderError :: FailedToSkipFrame ) ) ,
542
+ "{:?}" ,
543
+ result
544
+ ) ;
545
+
546
+ // decode_all_to_vec with correct output capacity.
547
+ let mut output = Vec :: new ( ) ;
548
+ output. reserve_exact ( original. len ( ) ) ;
549
+ decoder. decode_all_to_vec ( & input, & mut output) . unwrap ( ) ;
550
+ assert_eq ! ( output, original) ;
551
+
552
+ // decode_all_to_vec with smaller output capacity.
553
+ let mut output = Vec :: new ( ) ;
554
+ output. reserve_exact ( original. len ( ) - 1 ) ;
555
+ let result = decoder. decode_all_to_vec ( & input, & mut output) ;
556
+ assert ! (
557
+ matches!( result, Err ( FrameDecoderError :: TargetTooSmall ) ) ,
558
+ "{:?}" ,
559
+ result
560
+ ) ;
561
+
562
+ // decode_all_to_vec with larger output capacity.
563
+ let mut output = Vec :: new ( ) ;
564
+ output. reserve_exact ( original. len ( ) + 1 ) ;
565
+ decoder. decode_all_to_vec ( & input, & mut output) . unwrap ( ) ;
566
+ assert_eq ! ( output, original) ;
567
+ }
568
+
484
569
pub mod bit_reader;
485
570
pub mod decode_corpus;
486
571
pub mod dict_test;
0 commit comments