nx_compare_scope_gate.nx source
↩ module page · 70 lines · 5916 B
1// Pure selection fixtures only; publication integration needs a separate witness.
2// license_tier: ORIGINAL. No I/O beyond gate reporting; no hardware writes.
3import "nx_gate_verdict.nx"
4import "nx_compare_scope_lib.nx"
5func csg_len(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
6func csg_row(label: *u8, roster: *u8, name: *u8, expected: i64, ctr: *i64) -> i64 {
7 return gv_check_eq(label, cscope_roster_count(roster, csg_len(roster), name, csg_len(name)), expected, ctr)
8}
9func main() -> i64 {
10 let ctr: *i64 = gv_ctr()
11 gv_head("compare scope gate -- strict names and exact roster membership" as *u8)
12 gv_check_eq("name empty" as *u8, cscope_validate_name("" as *u8, 64), CSCOPE_INVALID, ctr)
13 gv_check_eq("name traversal" as *u8, cscope_validate_name("../team" as *u8, 64), CSCOPE_INVALID, ctr)
14 gv_check_eq("name slash" as *u8, cscope_validate_name("team/x" as *u8, 64), CSCOPE_INVALID, ctr)
15 gv_check_eq("name backslash" as *u8, cscope_validate_name("team\\x" as *u8, 64), CSCOPE_INVALID, ctr)
16 gv_check_eq("name uppercase" as *u8, cscope_validate_name("Team" as *u8, 64), CSCOPE_INVALID, ctr)
17 gv_check_eq("name space" as *u8, cscope_validate_name("team x" as *u8, 64), CSCOPE_INVALID, ctr)
18 gv_check_eq("name tab" as *u8, cscope_validate_name("team\tx" as *u8, 64), CSCOPE_INVALID, ctr)
19 gv_check_eq("name newline" as *u8, cscope_validate_name("team\n" as *u8, 64), CSCOPE_INVALID, ctr)
20 gv_check_eq("name dot" as *u8, cscope_validate_name("team.x" as *u8, 64), CSCOPE_INVALID, ctr)
21 gv_check_eq("name over bound" as *u8, cscope_validate_name("team" as *u8, 3), CSCOPE_INVALID, ctr)
22 gv_check_eq("name zero bound" as *u8, cscope_validate_name("team" as *u8, 0), CSCOPE_INVALID, ctr)
23 gv_check_eq("name negative bound" as *u8, cscope_validate_name("team" as *u8, 0 - 1), CSCOPE_INVALID, ctr)
24 gv_check_eq("name normal" as *u8, cscope_validate_name("team" as *u8, 64), 4, ctr)
25 gv_check_eq("name exact bound" as *u8, cscope_validate_name("team" as *u8, 4), 4, ctr)
26 gv_check_eq("name ascii alphabet" as *u8, cscope_validate_name("az09_-" as *u8, 6), 6, ctr)
27 csg_row("roster LF" as *u8, "team\ngraphics\n" as *u8, "team" as *u8, 1, ctr)
28 csg_row("roster CRLF" as *u8, "# domains\r\n\r\nteam\r\ngraphics\r\n" as *u8, "team" as *u8, 1, ctr)
29 csg_row("roster missing final newline" as *u8, "graphics\nteam" as *u8, "team" as *u8, 1, ctr)
30 csg_row("roster empty roster" as *u8, "" as *u8, "team" as *u8, 0, ctr)
31 csg_row("roster comments only" as *u8, "# team\n\n" as *u8, "team" as *u8, 0, ctr)
32 csg_row("roster unknown" as *u8, "graphics\n" as *u8, "team" as *u8, 0, ctr)
33 csg_row("roster prefix is not member" as *u8, "teamwork\n" as *u8, "team" as *u8, 0, ctr)
34 csg_row("roster suffix is not member" as *u8, "myteam\n" as *u8, "team" as *u8, 0, ctr)
35 csg_row("roster selected longer than row" as *u8, "team\n" as *u8, "teamwork" as *u8, 0, ctr)
36 csg_row("roster duplicate selected" as *u8, "team\ngraphics\nteam\n" as *u8, "team" as *u8, 2, ctr)
37 csg_row("roster duplicate CRLF selected" as *u8, "team\r\nteam\r\n" as *u8, "team" as *u8, 2, ctr)
38 csg_row("roster unrelated duplicate" as *u8, "team\ngraphics\ngraphics\n" as *u8, "team" as *u8, 1, ctr)
39 csg_row("roster comment occurrence" as *u8, "# team\nteam\n#team\n" as *u8, "team" as *u8, 1, ctr)
40 csg_row("roster unsafe active row" as *u8, "team\n../graphics\n" as *u8, "team" as *u8, 1, ctr)
41 csg_row("roster unsafe only" as *u8, "../team\n" as *u8, "team" as *u8, 0, ctr)
42 csg_row("roster embedded CR" as *u8, "te\ram\n" as *u8, "team" as *u8, 0, ctr)
43 csg_row("roster bare final CR" as *u8, "team\r" as *u8, "team" as *u8, 0, ctr)
44 csg_row("roster inline comment" as *u8, "team # note\n" as *u8, "team" as *u8, 0, ctr)
45 csg_row("roster space padded" as *u8, " team\n" as *u8, "team" as *u8, 0, ctr)
46 csg_row("roster empty selected" as *u8, "team\n" as *u8, "" as *u8, CSCOPE_INVALID, ctr)
47 csg_row("roster invalid selected" as *u8, "team\n" as *u8, "Team" as *u8, CSCOPE_INVALID, ctr)
48 csg_row("roster unterminated comment" as *u8, "# team" as *u8, "team" as *u8, 0, ctr)
49 gv_check_eq("null name" as *u8, cscope_validate_name(0 as *u8, 64), CSCOPE_INVALID, ctr)
50 gv_check_eq("null roster" as *u8, cscope_roster_count(0 as *u8, 0, "team" as *u8, 4), CSCOPE_INVALID, ctr)
51 gv_check_eq("negative roster length" as *u8, cscope_roster_count("" as *u8, 0 - 1, "team" as *u8, 4), CSCOPE_INVALID, ctr)
52 gv_check_eq("null selected span" as *u8, cscope_roster_count("team" as *u8, 4, 0 as *u8, 4), CSCOPE_INVALID, ctr)
53 gv_check_eq("negative selected length" as *u8, cscope_roster_count("team" as *u8, 4, "team" as *u8, 0 - 1), CSCOPE_INVALID, ctr)
54 gv_check_eq("bounded roster ignores tail" as *u8, cscope_roster_count("team\n../unsafe" as *u8, 5, "team" as *u8, 4), 1, ctr)
55 gv_check_eq("bounded selected span" as *u8, cscope_roster_count("team\n" as *u8, 5, "teamwork" as *u8, 4), 1, ctr)
56 let raw: *u8 = sys_mmap(4)
57 raw[0] = 128 as u8; raw[1] = 0 as u8
58 gv_check_eq("non ASCII name byte" as *u8, cscope_validate_name(raw, 1), CSCOPE_INVALID, ctr)
59 gv_check_eq("non ASCII roster byte" as *u8, cscope_roster_count(raw, 1, "a" as *u8, 1), 0, ctr)
60 raw[0] = 97 as u8; raw[1] = 0 as u8; raw[2] = 98 as u8
61 gv_check_eq("embedded roster NUL" as *u8, cscope_roster_count(raw, 3, "a" as *u8, 1), CSCOPE_INVALID, ctr)
62 raw[0] = 35 as u8
63 gv_check_eq("embedded comment NUL" as *u8, cscope_roster_count(raw, 3, "a" as *u8, 1), CSCOPE_INVALID, ctr)
64 raw[0] = 97 as u8; raw[1] = 98 as u8
65 gv_check_eq("unterminated bounded name" as *u8, cscope_validate_name(raw, 1), CSCOPE_INVALID, ctr)
66 let rc: i64 = gv_verdict("COMPARE-SCOPE", ctr, "pure selection fixtures; live scoped publication remains a separate obligation" as *u8)
67 sys_exit(rc)
68 return rc
69}
70