nx_bills_entry_gate.nx source
↩ module page · 87 lines · 4370 B
1// nx_bills_entry_gate.nx -- proves the bill-entry data path: a urlencoded form body -> be_record -> a stored
2// bill with the right fields (money dollars->cents), sane defaults for omitted fields, and no digit-bleed
3// between adjacent fields (the NUL-terminate guard). Hermetic /tmp prefix. Exits 0 iff ALL pass.
4// license_tier: ORIGINAL
5import "nx_syscalls.nx"
6import "nx_bills.nx"
7import "nx_bills_store.nx"
8import "nx_bills_entry.nx"
9
10func 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 }
11func g_putn(v: i64) -> i64 {
12 if v == 0 { sys_write(1, "0" as *u8, 1); return 0 }
13 var m: i64 = v; if m < 0 { sys_write(1, "-" as *u8, 1); m = 0 - m }
14 let d: *u8 = sys_mmap(24); var k: i64 = 0
15 while m > 0 { d[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
16 var j: i64 = k - 1
17 while j >= 0 { sys_write(1, ((d as i64)+j) as *u8, 1); j = j - 1 }
18 return 0
19}
20func chk(name: *u8, got: i64, want: i64, st: *i64) -> i64 {
21 if got == want { st[0] = st[0] + 1; g_puts(" PASS "); g_puts(name); g_puts("\n") }
22 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") }
23 return 0
24}
25
26func main() -> i64 {
27 let st: *i64 = sys_mmap(16) as *i64
28 st[0] = 0; st[1] = 0
29
30 // hermetic prefix "/tmp/billentry_<us>-"
31 let pfx: *u8 = sys_mmap(64)
32 var pp: i64 = 0
33 let pre: *u8 = "/tmp/billentry_\x00" as *u8
34 while pre[pp] != (0 as u8) { pfx[pp] = pre[pp]; pp = pp + 1 }
35 let us: i64 = sys_now_us()
36 let tmp: *u8 = sys_mmap(32); var m: i64 = us; var kk: i64 = 0
37 if m == 0 { tmp[0] = 0x30 as u8; kk = 1 }
38 while m > 0 { tmp[kk] = (0x30 + (m % 10)) as u8; m = m / 10; kk = kk + 1 }
39 var z: i64 = kk - 1
40 while z >= 0 { pfx[pp] = tmp[z]; pp = pp + 1; z = z - 1 }
41 pfx[pp] = 0x2d as u8; pp = pp + 1; pfx[pp] = 0 as u8
42
43 let who: *u8 = "operator\x00" as *u8
44 let amt: *i64 = sys_mmap(8 * 64) as *i64
45 let cad: *i64 = sys_mmap(8 * 64) as *i64
46 let due: *i64 = sys_mmap(8 * 64) as *i64
47 let cat: *i64 = sys_mmap(8 * 64) as *i64
48 let paid: *i64 = sys_mmap(8 * 64) as *i64
49
50 // bill 1: insurance $1800 / 6mo / due-15 / unpaid
51 let b1: *u8 = "bill_amount=1800&bill_cadence=6&bill_due_day=15&bill_category=1&bill_paid=0\x00" as *u8
52 var b1n: i64 = 0; while b1[b1n] != (0 as u8) { b1n = b1n + 1 }
53 chk("be_record bill 1 -> ok", be_record(pfx, who, b1, b1n), 0, st)
54 chk("count = 1", bs_count(pfx, who), 1, st)
55 bs_load(pfx, who, amt, cad, due, cat, paid, 64)
56 chk("bill1 amount 1800 dollars -> 180000 cents", amt[0], 180000, st) // dollars->cents
57 chk("bill1 cadence = 6 (no digit-bleed from amount)", cad[0], 6, st) // NUL-term guard
58 chk("bill1 due_day = 15", due[0], 15, st)
59 chk("bill1 category = 1 (insurance)", cat[0], 1, st)
60 chk("bill1 paid = 0", paid[0], 0, st)
61
62 // bill 2: utility $50 / monthly / due-10 / unpaid
63 let b2: *u8 = "bill_amount=50&bill_cadence=1&bill_due_day=10&bill_category=2&bill_paid=0\x00" as *u8
64 var b2n: i64 = 0; while b2[b2n] != (0 as u8) { b2n = b2n + 1 }
65 chk("be_record bill 2 -> ok", be_record(pfx, who, b2, b2n), 0, st)
66 chk("count = 2", bs_count(pfx, who), 2, st)
67 bs_load(pfx, who, amt, cad, due, cat, paid, 64)
68 chk("bill2 amount 50 -> 5000 cents", amt[1], 5000, st)
69
70 // bill 3: omits cadence + due_day -> sane defaults (monthly, day 1)
71 let b3: *u8 = "bill_amount=120&bill_category=4\x00" as *u8
72 var b3n: i64 = 0; while b3[b3n] != (0 as u8) { b3n = b3n + 1 }
73 chk("be_record bill 3 (sparse) -> ok", be_record(pfx, who, b3, b3n), 0, st)
74 bs_load(pfx, who, amt, cad, due, cat, paid, 64)
75 chk("bill3 amount 120 -> 12000 cents", amt[2], 12000, st)
76 chk("bill3 cadence defaults to 1 (monthly)", cad[2], 1, st)
77 chk("bill3 due_day defaults to 1", due[2], 1, st)
78 chk("bill3 category = 4 (other)", cat[2], 4, st)
79
80 // the stored bills feed the engine end-to-end: monthly total = $300 + $50 + $120 = $470
81 chk("engine monthly total over entered bills = 47000c ($470)", bl_monthly_total(amt, cad, 3), 47000, st)
82
83 g_puts("nx_bills_entry_gate: PASS="); g_putn(st[0]); g_puts(" FAIL="); g_putn(st[1]); g_puts("\n")
84 if st[1] == 0 { g_puts("SITUATION BILL-ENTRY: GREEN\n"); return 0 }
85 g_puts("SITUATION BILL-ENTRY: RED\n")
86 return 1
87}