@@ -146,3 +146,68 @@ pub(crate) fn hamming_distance_bytes_classic(a: &[u8], b: &[u8], max_dist: i64)
146146 1
147147 }
148148}
149+
150+ #[ cfg( test) ]
151+ mod tests {
152+ use super :: * ;
153+
154+ #[ test]
155+ fn popcnt64_known_values ( ) {
156+ assert_eq ! ( popcnt64_classic( 0 ) , 0 ) ;
157+ assert_eq ! ( popcnt64_classic( 1 ) , 1 ) ;
158+ assert_eq ! ( popcnt64_classic( 0xFF ) , 8 ) ;
159+ assert_eq ! ( popcnt64_classic( 0xFFFFFFFFFFFFFFFF ) , 64 ) ;
160+ assert_eq ! ( popcnt64_classic( 0xAAAAAAAAAAAAAAAA ) , 32 ) ;
161+ assert_eq ! ( popcnt64_classic( 0xDEADBEEF ) , 24 ) ;
162+ }
163+
164+ #[ test]
165+ fn string_classic_basic ( ) {
166+ assert_eq ! ( hamming_distance_string_classic( b"ff" , b"00" ) . unwrap( ) , 8 ) ;
167+ assert_eq ! ( hamming_distance_string_classic( b"deadbeef" , b"00000000" ) . unwrap( ) , 24 ) ;
168+ assert_eq ! ( hamming_distance_string_classic( b"0000" , b"0000" ) . unwrap( ) , 0 ) ;
169+ }
170+
171+ #[ test]
172+ fn string_classic_invalid ( ) {
173+ assert ! ( hamming_distance_string_classic( b"zz" , b"00" ) . is_err( ) ) ;
174+ assert ! ( hamming_distance_string_classic( b"gg" , b"00" ) . is_err( ) ) ;
175+ }
176+
177+ #[ test]
178+ fn string_classic_odd_length ( ) {
179+ assert_eq ! ( hamming_distance_string_classic( b"f" , b"0" ) . unwrap( ) , 4 ) ;
180+ assert_eq ! ( hamming_distance_string_classic( b"fff" , b"000" ) . unwrap( ) , 12 ) ;
181+ assert_eq ! ( hamming_distance_string_classic( b"fffff" , b"00000" ) . unwrap( ) , 20 ) ;
182+ }
183+
184+ #[ test]
185+ fn bytes_classic_full_distance ( ) {
186+ assert_eq ! ( hamming_distance_bytes_classic( b"\xff " , b"\x00 " , -1 ) , 8 ) ;
187+ assert_eq ! ( hamming_distance_bytes_classic( b"\x00 \x00 " , b"\x00 \x00 " , -1 ) , 0 ) ;
188+ // 64 bytes to exercise 32-byte unrolled loop
189+ let a = vec ! [ 0xFFu8 ; 64 ] ;
190+ let b = vec ! [ 0x00u8 ; 64 ] ;
191+ assert_eq ! ( hamming_distance_bytes_classic( & a, & b, -1 ) , 512 ) ;
192+ }
193+
194+ #[ test]
195+ fn bytes_classic_with_max_dist ( ) {
196+ // Within threshold → returns 1
197+ assert_eq ! ( hamming_distance_bytes_classic( b"\xff " , b"\xfe " , 2 ) , 1 ) ;
198+ // Exceeds threshold → returns 0
199+ assert_eq ! ( hamming_distance_bytes_classic( b"\xff " , b"\x00 " , 2 ) , 0 ) ;
200+ }
201+
202+ #[ test]
203+ fn bytes_classic_tail_bytes ( ) {
204+ // 9 bytes: exercises 8-byte chunk + 1 tail byte
205+ let a = vec ! [ 0xFF ; 9 ] ;
206+ let b = vec ! [ 0x00 ; 9 ] ;
207+ assert_eq ! ( hamming_distance_bytes_classic( & a, & b, -1 ) , 72 ) ;
208+ // 7 bytes: no 8-byte chunks, all tail
209+ let a = vec ! [ 0xFF ; 7 ] ;
210+ let b = vec ! [ 0x00 ; 7 ] ;
211+ assert_eq ! ( hamming_distance_bytes_classic( & a, & b, -1 ) , 56 ) ;
212+ }
213+ }
0 commit comments