code wiki / (root) / nx_damerau_levenshtein_test.nx

nx_damerau_levenshtein_test.nx source

↩ module page · 54 lines · 2271 B

1// nx_damerau_levenshtein_test.nx -- smoke for transposition-aware edit distance. 2 3import "nx_syscalls.nx" 4import "nx_tier.nx" 5import "nx_damerau_levenshtein.nx" 6 7func main() -> nx_int { 8 // === Test 1: identical -> 0 === 9 let a1: *u8 = sys_mmap(8) 10 a1[0] = 97; a1[1] = 98; a1[2] = 99 // "abc" 11 let b1: *u8 = sys_mmap(8) 12 b1[0] = 97; b1[1] = 98; b1[2] = 99 13 if nx_damerau_levenshtein(a1, 3, b1, 3) != 0 { return 1 } 14 15 // === Test 2: adjacent transposition "ab" -> "ba" = 1 === 16 // (Levenshtein would give 2; Damerau gives 1) 17 let a2: *u8 = sys_mmap(8) 18 a2[0] = 97; a2[1] = 98 // "ab" 19 let b2: *u8 = sys_mmap(8) 20 b2[0] = 98; b2[1] = 97 // "ba" 21 if nx_damerau_levenshtein(a2, 2, b2, 2) != 1 { return 10 } 22 23 // === Test 3: "teh" vs "the" -- classic typo -- distance 1 === 24 let a3: *u8 = sys_mmap(8) 25 a3[0] = 116; a3[1] = 101; a3[2] = 104 // "teh" 26 let b3: *u8 = sys_mmap(8) 27 b3[0] = 116; b3[1] = 104; b3[2] = 101 // "the" 28 if nx_damerau_levenshtein(a3, 3, b3, 3) != 1 { return 20 } 29 30 // === Test 4: non-adjacent transposition is NOT one edit === 31 // "abc" vs "cba" requires 2 swaps -> distance 2 in restricted-Damerau. 32 let a4: *u8 = sys_mmap(8) 33 a4[0] = 97; a4[1] = 98; a4[2] = 99 // "abc" 34 let b4: *u8 = sys_mmap(8) 35 b4[0] = 99; b4[1] = 98; b4[2] = 97 // "cba" 36 let d4: nx_int = nx_damerau_levenshtein(a4, 3, b4, 3) 37 if d4 < 2 { return 30 } // restricted-Damerau: 2 38 39 // === Test 5: empty cases === 40 if nx_damerau_levenshtein(a1, 0, b1, 0) != 0 { return 40 } 41 if nx_damerau_levenshtein(a1, 0, b1, 3) != 3 { return 41 } 42 if nx_damerau_levenshtein(a1, 3, b1, 0) != 3 { return 42 } 43 44 // === Test 6: similarity Q10 reflects distance / max(n1, n2) === 45 let s_ab_ba: nx_int = nx_damerau_levenshtein_similarity_q10(a2, 2, b2, 2) 46 // distance=1, max=2 -> asym=512 -> sim = 512 47 if s_ab_ba != 512 { return 50 } 48 49 // === Test 7: shared classifier (uses NX_STRSIM_* bands) === 50 if nx_damerau_levenshtein_classify(1024) != NX_STRSIM_IDENTICAL { return 60 } 51 if nx_damerau_levenshtein_classify(0) != NX_STRSIM_DISTINCT { return 61 } 52 53 return 0 54}