code wiki / (root) / nx_compare_scope_gate.nx

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