code wiki / _hdl_build / nx_apistack_paginate_gate.nx

nx_apistack_paginate_gate.nx source

↩ module page · 38 lines · 2819 B

1// nx_apistack_paginate_gate.nx -- hermetic gate for CAP-API-PAGINATE. Proves page counts, the walk to the last 2// page, over-limit, and past-end. Sovereign: nx_syscalls + nx_apistack_paginate. expect_exit: 0 3import "nx_syscalls.nx" 4import "nx_apistack_paginate.nx" 5import "nx_gate_verdict.nx" 6 7func gp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 8func gn(v: i64) -> i64 { var t: i64=v; if t<0{sys_write(1,"-" as *u8,1);t=0-t} let tm:*u8=sys_mmap(24); var k:i64=0; if t==0{tm[0]=48 as u8;k=1} while t>0{tm[k]=(48+(t%10)) as u8;t=t/10;k=k+1} let b:*u8=sys_mmap(24); var j:i64=0; while j<k{b[j]=tm[k-1-j];j=j+1} sys_write(1,b,k); return 0 } 9 10func main(argc: i64, argv: *i64) -> i64 { 11 gp("=== nx_apistack_paginate_gate (deterministic cursor pagination) ===\n" as *u8) 12 var pass: i64 = 0; var fail: i64 = 0 13 14 if pg_count(10,0,3)==3 { if pg_next(10,0,3)==3 { pass=pass+1; gp(" T1 page0: count 3, next 3 PASS\n" as *u8) } else { fail=fail+1; gp(" T1 FAIL next\n" as *u8) } } else { fail=fail+1; gp(" T1 FAIL count\n" as *u8) } 15 16 if pg_count(10,9,3)==1 { if pg_next(10,9,3)==(0-1) { pass=pass+1; gp(" T2 last page: count 1, next -1 PASS\n" as *u8) } else { fail=fail+1; gp(" T2 FAIL next\n" as *u8) } } else { fail=fail+1; gp(" T2 FAIL count\n" as *u8) } 17 18 if pg_count(10,0,100)==10 { if pg_next(10,0,100)==(0-1) { pass=pass+1; gp(" T3 over-limit: count 10, next -1 PASS\n" as *u8) } else { fail=fail+1; gp(" T3 FAIL\n" as *u8) } } else { fail=fail+1; gp(" T3 FAIL\n" as *u8) } 19 20 if pg_count(10,10,3)==0 { pass=pass+1; gp(" T4 past end -> count 0 PASS\n" as *u8) } else { fail=fail+1; gp(" T4 FAIL\n" as *u8) } 21 22 // T5 full walk covers all 10 exactly once 23 var cur: i64 = 0; var seen: i64 = 0; var guard: i64 = 0 24 var go: i64 = 1 25 while go == 1 { if guard > 100 { go = 0 } else { let c: i64 = pg_count(10, cur, 3); seen = seen + c; let nx: i64 = pg_next(10, cur, 3); if nx < 0 { go = 0 } else { cur = nx } guard = guard + 1 } } 26 if seen == 10 { pass=pass+1; gp(" T5 full walk covers all 10 exactly PASS\n" as *u8) } else { fail=fail+1; gp(" T5 FAIL seen=" as *u8); gn(seen); gp("\n" as *u8) } 27 28 gp("RESULT pass=" as *u8); gn(pass); gp(" fail=" as *u8); gn(fail) 29 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check 30 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled 31 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify. 32 let ctr__dry: *i64 = gv_ctr() 33 ctr__dry[0] = pass 34 ctr__dry[1] = pass + fail 35 let rc__dry: i64 = gv_verdict("APISTACK-PAGINATE-GATE" as *u8, ctr__dry, "teeth unchanged; verdict emission migrated onto the shared base class" as *u8) 36 sys_exit(rc__dry) 37 return rc__dry 38}