@@ -587,6 +587,9 @@ mod tests {
587587 #[ case( 3 , 8 ) ]
588588 #[ case( 5 , 10 ) ]
589589 #[ case( 2 , 16 ) ]
590+ #[ case( 8 , 16 ) ]
591+ #[ case( 9 , 16 ) ]
592+ #[ case( 17 , 16 ) ]
590593 fn test_iter_bits_with_offset ( #[ case] offset : usize , #[ case] len : usize ) {
591594 let total_bits = offset + len;
592595 let buf = BitBuffer :: collect_bool ( total_bits, |i| i % 2 == 0 ) ;
@@ -604,4 +607,36 @@ mod tests {
604607 assert_eq ! ( is_set, ( offset + idx) % 2 == 0 ) ;
605608 }
606609 }
610+
611+ #[ rstest]
612+ #[ case( 8 , 10 ) ]
613+ #[ case( 9 , 7 ) ]
614+ #[ case( 16 , 8 ) ]
615+ #[ case( 17 , 10 ) ]
616+ fn test_iter_bits_catches_wrong_byte_offset ( #[ case] offset : usize , #[ case] len : usize ) {
617+ let total_bits = offset + len;
618+ // Alternating pattern to catch byte offset errors: Bits are set for even indexed bytes.
619+ let buf = BitBuffer :: collect_bool ( total_bits, |i| ( i / 8 ) % 2 == 0 ) ;
620+
621+ let buf_with_offset = BitBuffer :: new_with_offset ( buf. inner ( ) . clone ( ) , len, offset) ;
622+
623+ let mut collected = Vec :: new ( ) ;
624+ buf_with_offset. iter_bits ( |idx, is_set| {
625+ collected. push ( ( idx, is_set) ) ;
626+ } ) ;
627+
628+ assert_eq ! ( collected. len( ) , len) ;
629+
630+ for ( idx, is_set) in collected {
631+ let bit_position = offset + idx;
632+ let byte_index = bit_position / 8 ;
633+ let expected_is_set = byte_index % 2 == 0 ;
634+
635+ assert_eq ! (
636+ is_set, expected_is_set,
637+ "Bit mismatch at index {}: expected {} got {}" ,
638+ bit_position, expected_is_set, is_set
639+ ) ;
640+ }
641+ }
607642}
0 commit comments