code wiki / (root) / nx_find_test.nx

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}