code wiki / (root) / nx_bills_entry_gate.nx

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}