code wiki / (root) / nx_bills_gate.nx

nx_bills_gate.nx source

↩ module page · 62 lines · 3278 B

1// nx_bills_gate.nx -- R1 GATE: proves the bills register computes exact cadence-normalized monthly totals, 2// per-category totals, due-soon, and overdue. Bills: mortgage $2000/mo, auto-insurance $1800/6mo, health- 3// insurance $600/mo, HOA $300/quarter, electric $150/mo. Exits 0 iff ALL pass. license_tier: ORIGINAL 4import "nx_syscalls.nx" 5import "nx_money.nx" 6import "nx_bills.nx" 7 8func g_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 9func g_putn(v: i64) -> i64 { 10 if v == 0 { sys_write(1, "0" as *u8, 1); return 0 } 11 var m: i64 = v; if m < 0 { sys_write(1, "-" as *u8, 1); m = 0 - m } 12 let d: *u8 = sys_mmap(24); var k: i64 = 0 13 while m > 0 { d[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 14 var j: i64 = k - 1 15 while j >= 0 { sys_write(1, ((d as i64)+j) as *u8, 1); j = j - 1 } 16 return 0 17} 18func chk(name: *u8, got: i64, want: i64, st: *i64) -> i64 { 19 if got == want { st[0] = st[0] + 1; g_puts(" PASS "); g_puts(name); g_puts("\n") } 20 else { st[1] = st[1] + 1; g_puts(" FAIL "); g_puts(name); g_puts(" got="); g_putn(got); g_puts(" want="); g_putn(want); g_puts("\n") } 21 return 0 22} 23func seti(a: *i64, i: i64, v: i64) -> i64 { a[i] = v; return 0 } 24 25func main() -> i64 { 26 let st: *i64 = sys_mmap(16) as *i64 27 st[0] = 0; st[1] = 0 28 29 let amt: *i64 = sys_mmap(8 * 8) as *i64 30 let cad: *i64 = sys_mmap(8 * 8) as *i64 31 let due: *i64 = sys_mmap(8 * 8) as *i64 32 let cat: *i64 = sys_mmap(8 * 8) as *i64 33 let paid: *i64 = sys_mmap(8 * 8) as *i64 34 // 0 mortgage 35 seti(amt,0,200000); seti(cad,0,1); seti(due,0,1); seti(cat,0,BL_HOUSING); seti(paid,0,1) 36 // 1 auto insurance (semiannual) 37 seti(amt,1,180000); seti(cad,1,6); seti(due,1,15); seti(cat,1,BL_INSURANCE); seti(paid,1,0) 38 // 2 health insurance 39 seti(amt,2,60000); seti(cad,2,1); seti(due,2,1); seti(cat,2,BL_INSURANCE); seti(paid,2,1) 40 // 3 HOA (quarterly) 41 seti(amt,3,30000); seti(cad,3,3); seti(due,3,10); seti(cat,3,BL_HOUSING); seti(paid,3,0) 42 // 4 electric 43 seti(amt,4,15000); seti(cad,4,1); seti(due,4,20); seti(cat,4,BL_UTILITY); seti(paid,4,0) 44 let n: i64 = 5 45 46 chk("auto-insurance $1800/6mo -> $300/mo (30000c)", bl_monthly(180000, 6), 30000, st) 47 chk("HOA $300/quarter -> $100/mo (10000c)", bl_monthly(30000, 3), 10000, st) 48 let tot: i64 = bl_monthly_total(amt, cad, n) 49 g_puts(" [info] total monthly obligation="); g_putn(tot); g_puts("c\n") 50 chk("total monthly obligation = 315000c ($3,150.00)", tot, 315000, st) 51 chk("insurance monthly = 90000c ($900.00)", bl_category_monthly(amt, cad, cat, n, BL_INSURANCE), 90000, st) 52 chk("housing monthly = 210000c ($2,100.00)", bl_category_monthly(amt, cad, cat, n, BL_HOUSING), 210000, st) 53 54 let idx: *i64 = sys_mmap(8 * 16) as *i64 55 chk("due within 10 days of the 12th -> 2 (auto-ins 15, electric 20)", bl_due_soon(due, 12, 10, n, idx), 2, st) 56 chk("overdue as of the 12th -> 1 (HOA, due 10, unpaid)", bl_overdue(due, paid, 12, n, idx), 1, st) 57 58 g_puts("nx_bills_gate: PASS="); g_putn(st[0]); g_puts(" FAIL="); g_putn(st[1]); g_puts("\n") 59 if st[1] == 0 { g_puts("SITUATION R1 nx_bills: GREEN\n"); return 0 } 60 g_puts("SITUATION R1 nx_bills: RED\n") 61 return 1 62}