@@ -650,6 +650,8 @@ impl FromIterator<bool> for BitBufferMut {
650650
651651#[ cfg( test) ]
652652mod tests {
653+ use rstest:: rstest;
654+
653655 use crate :: BufferMut ;
654656 use crate :: bit:: buf_mut:: BitBufferMut ;
655657 use crate :: bitbuffer;
@@ -924,6 +926,20 @@ mod tests {
924926 assert ! ( frozen. value( 7 ) ) ;
925927 }
926928
929+ #[ test]
930+ fn append_after_clear_reads_back_false ( ) {
931+ // `clear` must not leave stale set bits behind: `append_false` and `append_buffer`
932+ // rely on bits beyond `len` being zero.
933+ let mut bools = BitBufferMut :: new_set ( 16 ) ;
934+ bools. clear ( ) ;
935+ bools. append_false ( ) ;
936+ bools. append_buffer ( & crate :: BitBuffer :: new_unset ( 8 ) ) ;
937+
938+ let bools = bools. freeze ( ) ;
939+ assert_eq ! ( bools. len( ) , 9 ) ;
940+ assert_eq ! ( bools. true_count( ) , 0 ) ;
941+ }
942+
927943 #[ test]
928944 fn test_append_buffer_after_truncate ( ) {
929945 // Truncating leaves stale set bits in the last partial byte; an append after that
@@ -942,22 +958,27 @@ mod tests {
942958 }
943959 }
944960
945- #[ test]
946- fn test_append_buffer_misaligned_long ( ) {
947- // Force mismatched source/destination bit offsets across many words.
961+ #[ rstest]
962+ #[ case:: both_aligned( 0 , 0 ) ]
963+ #[ case:: dst_unaligned( 3 , 0 ) ]
964+ #[ case:: src_unaligned( 0 , 5 ) ]
965+ #[ case:: mismatched( 3 , 5 ) ]
966+ #[ case:: equal_nonzero( 5 , 5 ) ]
967+ fn test_append_buffer_long ( #[ case] dst_prefix : usize , #[ case] src_start : usize ) {
968+ // Exercise every alignment combination across many words.
948969 let source = crate :: BitBuffer :: from_iter ( ( 0 ..301 ) . map ( |i| i % 3 == 0 ) ) ;
949- let source = source. slice ( 5 ..301 ) ;
970+ let source = source. slice ( src_start ..301 ) ;
950971
951972 let mut dest = BitBufferMut :: with_capacity ( 512 ) ;
952- dest. append_n ( true , 3 ) ;
973+ dest. append_n ( true , dst_prefix ) ;
953974 dest. append_buffer ( & source) ;
954975
955- assert_eq ! ( dest. len( ) , 3 + source. len( ) ) ;
956- for i in 0 ..3 {
976+ assert_eq ! ( dest. len( ) , dst_prefix + source. len( ) ) ;
977+ for i in 0 ..dst_prefix {
957978 assert ! ( dest. value( i) , "prefix bit {i}" ) ;
958979 }
959980 for i in 0 ..source. len ( ) {
960- assert_eq ! ( dest. value( 3 + i) , source. value( i) , "bit {i}" ) ;
981+ assert_eq ! ( dest. value( dst_prefix + i) , source. value( i) , "bit {i}" ) ;
961982 }
962983 }
963984
0 commit comments