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}