nx_doc_xref_test.nx source
↩ module page · 125 lines · 5706 B
1// nx_doc_xref_test.nx -- KAT for cross-reference verification.
2
3import "nx_syscalls.nx"
4import "nx_string_ops.nx"
5import "nx_doc_xref.nx"
6
7func main() -> i64 {
8 let content: *u8 = sys_mmap(256)
9 let out_name: *u8 = sys_mmap(64)
10 let res_buf: *u8 = sys_mmap(32)
11 let res: *NxLinkScanResult = res_buf as *NxLinkScanResult
12
13 // ----- T1 Extract single link: 'see [[foo]] end' -----
14 let bs1: *u8 = "see [[foo]] end"
15 nx_str_slice_copy(bs1, 0, 15, content, 256)
16 nx_doc_extract_link_target(content, 15, 0, out_name, 64, res)
17 if res.next_offset != 11 { return 1 } // ']]' at 9-10; past = 11
18 if res.n_target != 3 { return 2 }
19 if out_name[0] != 102 { return 3 } // 'f'
20 if out_name[1] != 111 { return 4 } // 'o'
21 if out_name[2] != 111 { return 5 } // 'o'
22 if out_name[3] != 0 { return 6 } // NUL
23
24 // ----- T2 No link: 'no markers here' -----
25 let bs2: *u8 = "no markers here"
26 nx_str_slice_copy(bs2, 0, 15, content, 256)
27 nx_doc_extract_link_target(content, 15, 0, out_name, 64, res)
28 if res.next_offset != -1 { return 10 }
29 if res.n_target != 0 { return 11 }
30
31 // ----- T3 Two links in one buffer: iterate -----
32 let bs3: *u8 = "[[alpha]] mid [[bravo]] end"
33 nx_str_slice_copy(bs3, 0, 27, content, 256)
34 nx_doc_extract_link_target(content, 27, 0, out_name, 64, res)
35 if res.next_offset != 9 { return 20 } // past first ']]' at 7-8
36 if res.n_target != 5 { return 21 } // "alpha"
37 if out_name[0] != 97 { return 22 } // 'a'
38
39 // Second iteration starting at res.next_offset
40 nx_doc_extract_link_target(content, 27, res.next_offset, out_name, 64, res)
41 if res.next_offset != 23 { return 30 } // past second ']]'
42 if res.n_target != 5 { return 31 } // "bravo"
43 if out_name[0] != 98 { return 32 } // 'b'
44
45 // Third iteration (no more) -> -1
46 nx_doc_extract_link_target(content, 27, res.next_offset, out_name, 64, res)
47 if res.next_offset != -1 { return 40 }
48
49 // ----- T4 Empty target '[[]]' rejected -----
50 let bs4: *u8 = "see [[]] empty"
51 nx_str_slice_copy(bs4, 0, 14, content, 256)
52 nx_doc_extract_link_target(content, 14, 0, out_name, 64, res)
53 if res.next_offset != -1 { return 50 } // empty name_len <= 0 = no link
54 if res.n_target != 0 { return 51 }
55
56 // ----- T5 Cap exhaustion: target too big for out_cap -----
57 let bs5: *u8 = "see [[verylongname]] end"
58 nx_str_slice_copy(bs5, 0, 24, content, 256)
59 nx_doc_extract_link_target(content, 24, 0, out_name, 8, res)
60 if res.next_offset != 20 { return 60 } // past ']]' regardless
61 if res.n_target != -1 { return 61 } // sentinel for cap-exceeded
62
63 // ----- T6 Open '[[' without close -----
64 let bs6: *u8 = "see [[unclosed forever"
65 nx_str_slice_copy(bs6, 0, 22, content, 256)
66 nx_doc_extract_link_target(content, 22, 0, out_name, 64, res)
67 if res.next_offset != -1 { return 70 } // no closing ']]'
68
69 // ----- T7 Validator: target in newline-separated namespace -----
70 let names_buf: *u8 = sys_mmap(64)
71 let names_str: *u8 = "alpha\nbravo\ncharlie\n"
72 nx_str_slice_copy(names_str, 0, 20, names_buf, 64)
73 // 'alpha' exists
74 let alpha: *u8 = "alpha"
75 if nx_doc_link_target_exists(alpha, 5, names_buf, 20) != 1 { return 80 }
76 // 'bravo' exists
77 let bravo: *u8 = "bravo"
78 if nx_doc_link_target_exists(bravo, 5, names_buf, 20) != 1 { return 81 }
79 // 'charlie' exists (last line, with or without trailing newline)
80 let charlie: *u8 = "charlie"
81 if nx_doc_link_target_exists(charlie, 7, names_buf, 20) != 1 { return 82 }
82 // 'delta' missing
83 let delta: *u8 = "delta"
84 if nx_doc_link_target_exists(delta, 5, names_buf, 20) != 0 { return 83 }
85
86 // ----- T8 Validator edge cases -----
87 // Empty target
88 if nx_doc_link_target_exists(alpha, 0, names_buf, 20) != 0 { return 90 }
89 // Empty blob
90 if nx_doc_link_target_exists(alpha, 5, names_buf, 0) != 0 { return 91 }
91
92 // ----- T9 Validator: prefix-of-name is NOT a match -----
93 // 'alp' is prefix of 'alpha' but exact match required
94 let alp: *u8 = "alp"
95 if nx_doc_link_target_exists(alp, 3, names_buf, 20) != 0 { return 100 }
96
97 // ----- T10 Validator: case-sensitive (substrate-honest) -----
98 let ALPHA_UC: *u8 = "ALPHA"
99 if nx_doc_link_target_exists(ALPHA_UC, 5, names_buf, 20) != 0 { return 110 }
100
101 // ----- T11 Backtick-aware: [[X]] inside `code` is skipped -----
102 let bs_tick: *u8 = "see `[[buffer(N)]]` attr"
103 nx_str_slice_copy(bs_tick, 0, 24, content, 256)
104 nx_doc_extract_link_target(content, 24, 0, out_name, 64, res)
105 if res.next_offset != -1 { return 120 } // skipped; no valid [[X]] found
106
107 // ----- T12 Backtick-aware: [[X]] OUTSIDE backticks still found -----
108 let bs_mix: *u8 = "see [[real-ref]] vs `[[code]]` here"
109 nx_str_slice_copy(bs_mix, 0, 35, content, 256)
110 nx_doc_extract_link_target(content, 35, 0, out_name, 64, res)
111 if res.next_offset != 16 { return 130 } // past first ']]'
112 if res.n_target != 8 { return 131 } // "real-ref"
113 // Next iteration: 'code' is inside backticks -- skipped
114 nx_doc_extract_link_target(content, 35, res.next_offset, out_name, 64, res)
115 if res.next_offset != -1 { return 132 } // no more outside-backtick links
116
117 // ----- T13 Triple-backtick fence: [[X]] inside code block skipped -----
118 let bs_fence: *u8 = "```\n[[fenced]]\n``` and [[outside]]"
119 nx_str_slice_copy(bs_fence, 0, 34, content, 256)
120 nx_doc_extract_link_target(content, 34, 0, out_name, 64, res)
121 if res.next_offset != 34 { return 140 } // skips fenced; finds 'outside'
122 if res.n_target != 7 { return 141 } // "outside"
123
124 return 0
125}