code wiki / _hdl_build / nx_pm_review_log_test.nx
nx_pm_review_log_test.nx source
↩ module page · 49 lines · 2557 B
1// nx_pm_review_log_test.nx -- prove the PM review log: write a deliverable + a gap, read back, confirm
2// both structured lines landed on disk with the right kind/verdict. Exit 0 on 6/6. license_tier: ORIGINAL
3
4import "nx_pm_review_log.nx"
5import "nx_syscalls.nx"
6
7func qt_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
8func qt_num(v: i64) -> i64 { let bb: *u8 = sys_mmap(28); var m: i64=v; if m<0{m=0-m}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48;k=1}; while m>0{t[k]=48+(m%10);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(1,bb,k); return 0 }
9
10// find substring `needle` (len nl) in buf (len n): 1 if present.
11func qt_has(buf: *u8, n: i64, needle: *u8, nl: i64) -> i64 {
12 var i: i64 = 0
13 while i <= n - nl {
14 var j: i64 = 0; var ok: i64 = 1
15 while j < nl { if buf[i+j] != needle[j] { ok = 0; j = nl } j = j + 1 }
16 if ok == 1 { return 1 }
17 i = i + 1
18 }
19 return 0
20}
21
22func main() -> i64 {
23 qt_puts("=== PM REVIEW LOG ===\n" as *u8)
24 let path: *u8 = "/tmp/_pm_review_test.log" as *u8
25 // truncate for a clean test
26 let tfd: i64 = sys_openat_wr(path, 0x1a4); sys_close(tfd)
27 let fd: i64 = pm_open(path)
28 pm_deliverable(fd, "retire-gcc/x86_64" as *u8, "sovereign assemble+link" as *u8, "nx_cc->nxasm_x86->run, no gcc" as *u8)
29 pm_gap(fd, "retire-gcc/x86_64" as *u8, "NEEDS-CAPABILITY" as *u8, "nxasm_x86 coverage" as *u8, "unencoded instruction in target .s" as *u8)
30 sys_close(fd)
31
32 let rfd: i64 = sys_openat_rd(path)
33 let buf: *u8 = sys_mmap(2048)
34 let got: i64 = sys_read(rfd, buf, 2047)
35 qt_puts(" log bytes=" as *u8); qt_num(got); qt_puts("\n" as *u8)
36
37 let r: *i64 = sys_mmap(8*8) as *i64
38 r[0]=0; if got > 40 { r[0]=1 }
39 r[1]=0; if qt_has(buf, got, "PMLOG kind=DELIVERABLE" as *u8, 22) == 1 { r[1]=1 }
40 r[2]=0; if qt_has(buf, got, "PMLOG kind=GAP" as *u8, 14) == 1 { r[2]=1 }
41 r[3]=0; if qt_has(buf, got, "verdict=NEEDS-CAPABILITY" as *u8, 24) == 1 { r[3]=1 }
42 r[4]=0; if qt_has(buf, got, "area=retire-gcc/x86_64" as *u8, 22) == 1 { r[4]=1 }
43 r[5]=0; if qt_has(buf, got, "verdict=OK" as *u8, 10) == 1 { r[5]=1 }
44 var pass: i64 = 0; var i: i64 = 0
45 while i < 6 { pass = pass + r[i]; i = i + 1 }
46 qt_puts(" passed " as *u8); qt_num(pass); qt_puts("/6\n" as *u8)
47 if pass == 6 { qt_puts(" PM review log works: the team can flag deliverables + gaps for our joint review.\n" as *u8); sys_exit(0); return 0 }
48 qt_puts(" FAIL\n" as *u8); sys_exit(1); return 1
49}