nx_find_test.nx source
↩ module page · 180 lines · 6831 B
1// nx_find_test.nx -- KAT for S5 bits-up file-tree filter primitive.
2
3import "nx_syscalls.nx"
4import "nx_string_ops.nx"
5import "nx_dir.nx"
6import "nx_find.nx"
7
8// Build a synthetic NxDirRow array for KAT input. Each row's
9// name_ptr points into a name-arena byte buffer the caller owns.
10//
11// Layout: we hard-code 6 entries:
12// 0 "nx_etg.nx" REG not-dotlike
13// 1 "nx_etg_test.nx" REG not-dotlike
14// 2 "_offc_probe.nx" REG not-dotlike
15// 3 "." DIR dotlike
16// 4 "subdir" DIR not-dotlike
17// 5 "nx_grep.nx" REG not-dotlike
18
19func main() -> i64 {
20 // ----- Allocate name arena + populate names -----
21 let arena: *u8 = sys_mmap(256)
22 let n0: *u8 = "nx_etg.nx"
23 let n1: *u8 = "nx_etg_test.nx"
24 let n2: *u8 = "_offc_probe.nx"
25 let n3: *u8 = "."
26 let n4: *u8 = "subdir"
27 let n5: *u8 = "nx_grep.nx"
28
29 nx_str_slice_copy(n0, 0, 9, arena, 256)
30 nx_str_slice_copy(n1, 0, 14, (arena as *u8) + 10, 246)
31 nx_str_slice_copy(n2, 0, 14, (arena as *u8) + 25, 231)
32 nx_str_slice_copy(n3, 0, 1, (arena as *u8) + 40, 216)
33 nx_str_slice_copy(n4, 0, 6, (arena as *u8) + 42, 214)
34 nx_str_slice_copy(n5, 0, 10, (arena as *u8) + 49, 207)
35
36 // ----- Allocate + populate NxDirRow array -----
37 let rows_buf: *u8 = sys_mmap(6 * NX_DIR_ROW_BYTES + 32)
38 let rows: *NxDirRow = rows_buf as *NxDirRow
39
40 // Row 0: "nx_etg.nx" REG not-dotlike
41 let r0: *NxDirRow = nx_dir_row_at(rows, 0)
42 r0.name_ptr = (arena as *u8) + 0
43 r0.name_len = 9
44 r0.dtype = NX_DT_REG
45 r0.is_dotlike = 0
46
47 // Row 1: "nx_etg_test.nx" REG
48 let r1: *NxDirRow = nx_dir_row_at(rows, 1)
49 r1.name_ptr = (arena as *u8) + 10
50 r1.name_len = 14
51 r1.dtype = NX_DT_REG
52 r1.is_dotlike = 0
53
54 // Row 2: "_offc_probe.nx" REG
55 let r2: *NxDirRow = nx_dir_row_at(rows, 2)
56 r2.name_ptr = (arena as *u8) + 25
57 r2.name_len = 14
58 r2.dtype = NX_DT_REG
59 r2.is_dotlike = 0
60
61 // Row 3: "." DIR dotlike
62 let r3: *NxDirRow = nx_dir_row_at(rows, 3)
63 r3.name_ptr = (arena as *u8) + 40
64 r3.name_len = 1
65 r3.dtype = NX_DT_DIR
66 r3.is_dotlike = 1
67
68 // Row 4: "subdir" DIR
69 let r4: *NxDirRow = nx_dir_row_at(rows, 4)
70 r4.name_ptr = (arena as *u8) + 42
71 r4.name_len = 6
72 r4.dtype = NX_DT_DIR
73 r4.is_dotlike = 0
74
75 // Row 5: "nx_grep.nx" REG
76 let r5: *NxDirRow = nx_dir_row_at(rows, 5)
77 r5.name_ptr = (arena as *u8) + 49
78 r5.name_len = 10
79 r5.dtype = NX_DT_REG
80 r5.is_dotlike = 0
81
82 // ----- Allocate flag arrays -----
83 let flags_a: *i64 = (sys_mmap(6 * 8)) as *i64
84 let flags_b: *i64 = (sys_mmap(6 * 8)) as *i64
85 let flags_c: *i64 = (sys_mmap(6 * 8)) as *i64
86
87 // ----- T1 nx_find_filter_suffix ".nx" -----
88 // Should match: 0, 1, 2, 5 (four "nx" files); not 3, 4
89 let nx_suf: *u8 = ".nx"
90 let kept1: i64 = nx_find_filter_suffix(rows, 6, nx_suf, 3, flags_a)
91 if kept1 != 4 { return 1 }
92 if flags_a[0] != 1 { return 2 }
93 if flags_a[1] != 1 { return 3 }
94 if flags_a[2] != 1 { return 4 }
95 if flags_a[3] != 0 { return 5 }
96 if flags_a[4] != 0 { return 6 }
97 if flags_a[5] != 1 { return 7 }
98
99 // ----- T2 nx_find_filter_suffix "_test.nx" -----
100 let test_suf: *u8 = "_test.nx"
101 let kept2: i64 = nx_find_filter_suffix(rows, 6, test_suf, 8, flags_b)
102 if kept2 != 1 { return 10 }
103 if flags_b[1] != 1 { return 11 }
104 if flags_b[0] != 0 { return 12 }
105
106 // ----- T3 nx_find_filter_prefix "_offc" -----
107 let offc_pre: *u8 = "_offc"
108 let kept3: i64 = nx_find_filter_prefix(rows, 6, offc_pre, 5, flags_b)
109 if kept3 != 1 { return 20 }
110 if flags_b[2] != 1 { return 21 }
111 if flags_b[0] != 0 { return 22 }
112
113 // ----- T4 nx_find_filter_regular_files -----
114 // Should keep rows 0, 1, 2, 5 (NX_DT_REG); skip 3, 4 (NX_DT_DIR)
115 let kept4: i64 = nx_find_filter_regular_files(rows, 6, flags_b)
116 if kept4 != 4 { return 30 }
117 if flags_b[0] != 1 { return 31 }
118 if flags_b[3] != 0 { return 32 }
119 if flags_b[4] != 0 { return 33 }
120 if flags_b[5] != 1 { return 34 }
121
122 // ----- T5 nx_find_filter_skip_dotlike -----
123 let kept5: i64 = nx_find_filter_skip_dotlike(rows, 6, flags_b)
124 if kept5 != 5 { return 40 }
125 if flags_b[3] != 0 { return 41 }
126 if flags_b[4] != 1 { return 42 }
127
128 // ----- T6 nx_find_intersect: ".nx files" AND "regular files" -----
129 // T1 already set flags_a to {1,1,1,0,0,1}. Compute regular into flags_b.
130 nx_find_filter_regular_files(rows, 6, flags_b)
131 // Intersect: {1,1,1,0,0,1} AND {1,1,1,0,0,1} = same (no DIR has .nx suffix)
132 let kept6: i64 = nx_find_intersect(flags_a, flags_b, 6, flags_c)
133 if kept6 != 4 { return 50 }
134 if flags_c[0] != 1 { return 51 }
135 if flags_c[5] != 1 { return 52 }
136
137 // ----- T7 nx_find_intersect: ".nx" AND NOT "_test.nx" -----
138 // Need a "not _test.nx" predicate; easiest: compute test-flag,
139 // then invert into a fresh array.
140 let flags_test: *i64 = (sys_mmap(6 * 8)) as *i64
141 let flags_not_test: *i64 = (sys_mmap(6 * 8)) as *i64
142 nx_find_filter_suffix(rows, 6, test_suf, 8, flags_test)
143 var i7: i64 = 0
144 while i7 < 6 {
145 if flags_test[i7] == 1 { flags_not_test[i7] = 0 }
146 if flags_test[i7] == 0 { flags_not_test[i7] = 1 }
147 i7 = i7 + 1
148 }
149 // Now intersect ".nx" AND "not _test.nx": should yield 0, 2, 5 (3 rows)
150 let kept7: i64 = nx_find_intersect(flags_a, flags_not_test, 6, flags_c)
151 if kept7 != 3 { return 60 }
152 if flags_c[0] != 1 { return 61 }
153 if flags_c[1] != 0 { return 62 } // _test excluded
154 if flags_c[2] != 1 { return 63 }
155 if flags_c[5] != 1 { return 64 }
156
157 // ----- T8 nx_find_count_kept on synthetic flag array -----
158 let cnt_flags: *i64 = (sys_mmap(6 * 8)) as *i64
159 cnt_flags[0] = 1; cnt_flags[1] = 0; cnt_flags[2] = 1
160 cnt_flags[3] = 1; cnt_flags[4] = 0; cnt_flags[5] = 1
161 if nx_find_count_kept(cnt_flags, 6) != 4 { return 70 }
162 if nx_find_count_kept(cnt_flags, 0) != 0 { return 71 }
163 if nx_find_count_kept(cnt_flags, 3) != 2 { return 72 } // first 3 entries
164
165 // ----- T9 nx_find_nth_kept_index iteration -----
166 // flags: 1,0,1,1,0,1 -- 4 kept at indices 0, 2, 3, 5
167 if nx_find_nth_kept_index(cnt_flags, 6, 0) != 0 { return 80 }
168 if nx_find_nth_kept_index(cnt_flags, 6, 1) != 2 { return 81 }
169 if nx_find_nth_kept_index(cnt_flags, 6, 2) != 3 { return 82 }
170 if nx_find_nth_kept_index(cnt_flags, 6, 3) != 5 { return 83 }
171 if nx_find_nth_kept_index(cnt_flags, 6, 4) != -1 { return 84 }
172 if nx_find_nth_kept_index(cnt_flags, 6, -1) != -1 { return 85 }
173
174 // ----- T10 Empty suffix matches nothing (substrate-honest; not "everything") -----
175 let empty: *u8 = ""
176 let kept_empty: i64 = nx_find_filter_suffix(rows, 6, empty, 0, flags_b)
177 if kept_empty != 0 { return 90 }
178
179 return 0
180}