nx_intake_handler_gate.nx source
↩ module page · 93 lines · 4772 B
1// nx_intake_handler_gate.nx -- R6 GATE: proves a submitted intake form flows into the whole system. A
2// urlencoded POST body -> ih_record -> sv_load round-trips every field -> and the engines run on THOSE
3// numbers: triage = crisis (90), before-you-buy uses the submitted wage, accommodation reads the submitted
4// ADHD flag. Hermetic /tmp prefix. Exits 0 iff ALL pass. license_tier: ORIGINAL
5import "nx_syscalls.nx"
6import "nx_money.nx"
7import "nx_survey.nx"
8import "nx_accommodate.nx"
9import "nx_adhd.nx"
10import "nx_purchase.nx"
11import "nx_intake_handler.nx"
12
13func 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 }
14func g_putn(v: i64) -> i64 {
15 if v == 0 { sys_write(1, "0" as *u8, 1); return 0 }
16 var m: i64 = v; if m < 0 { sys_write(1, "-" as *u8, 1); m = 0 - m }
17 let d: *u8 = sys_mmap(24); var k: i64 = 0
18 while m > 0 { d[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
19 var j: i64 = k - 1
20 while j >= 0 { sys_write(1, ((d as i64)+j) as *u8, 1); j = j - 1 }
21 return 0
22}
23func chk(name: *u8, got: i64, want: i64, st: *i64) -> i64 {
24 if got == want { st[0] = st[0] + 1; g_puts(" PASS "); g_puts(name); g_puts("\n") }
25 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") }
26 return 0
27}
28
29func main() -> i64 {
30 let st: *i64 = sys_mmap(16) as *i64
31 st[0] = 0; st[1] = 0
32
33 // hermetic prefix "/tmp/intake_<us>-"
34 let pfx: *u8 = sys_mmap(64)
35 var pp: i64 = 0
36 let pre: *u8 = "/tmp/intake_\x00" as *u8
37 while pre[pp] != (0 as u8) { pfx[pp] = pre[pp]; pp = pp + 1 }
38 let us: i64 = sys_now_us()
39 let tmp: *u8 = sys_mmap(32); var m: i64 = us; var kk: i64 = 0
40 if m == 0 { tmp[0] = 0x30 as u8; kk = 1 }
41 while m > 0 { tmp[kk] = (0x30 + (m % 10)) as u8; m = m / 10; kk = kk + 1 }
42 var z: i64 = kk - 1
43 while z >= 0 { pfx[pp] = tmp[z]; pp = pp + 1; z = z - 1 }
44 pfx[pp] = 0x2d as u8; pp = pp + 1; pfx[pp] = 0 as u8
45
46 // a submitted intake form (urlencoded POST body)
47 let body: *u8 = "income_monthly=4000&debt_balance=20000&debt_apr_pct=24&monthly_payment=600&available=500&hourly_wage=25&buffer_goal=1000&behind_mortgage=1&medical_debt=1&job_loss_risk=1&high_interest_debt=1&has_adhd=1&low_energy=0&low_vision=0\x00" as *u8
48 var bn: i64 = 0
49 while body[bn] != (0 as u8) { bn = bn + 1 }
50
51 let cid: *u8 = sys_mmap(96)
52 chk("intake form recorded", ih_record(pfx, "elder\x00" as *u8, body, bn, cid), 0, st)
53
54 let k: *i64 = sys_mmap(8 * 64) as *i64
55 let d: *i64 = sys_mmap(8 * 64) as *i64
56 let nf: i64 = sv_load(pfx, cid, k, d, 64)
57 var lok: i64 = 0
58 if nf > 0 { lok = 1 }
59 chk("profile loads", lok, 1, st)
60
61 // every field round-trips
62 chk("debt_balance = 2000000 ($20,000)", sv_answer(k, d, nf, "debt_balance\x00" as *u8), 2000000, st)
63 chk("hourly_wage = 2500 ($25/hr)", sv_answer(k, d, nf, "hourly_wage\x00" as *u8), 2500, st)
64 chk("income_monthly = 400000 ($4,000, dollars->cents)", sv_answer(k, d, nf, "income_monthly\x00" as *u8), 400000, st)
65 chk("available = 50000 ($500)", sv_answer(k, d, nf, "available\x00" as *u8), 50000, st)
66 chk("has_adhd = 1", sv_answer(k, d, nf, "has_adhd\x00" as *u8), 1, st)
67 chk("low_vision = 0", sv_answer(k, d, nf, "low_vision\x00" as *u8), 0, st)
68
69 // ENGINES RUN ON THE SUBMITTED NUMBERS:
70 // (1) triage from the submitted risk answers -> crisis
71 let wq: *i64 = sys_mmap(8 * 8) as *i64
72 let wt: *i64 = sys_mmap(8 * 8) as *i64
73 wq[0] = "behind_mortgage\x00" as *u8 as i64; wt[0] = 30
74 wq[1] = "medical_debt\x00" as *u8 as i64; wt[1] = 25
75 wq[2] = "job_loss_risk\x00" as *u8 as i64; wt[2] = 20
76 wq[3] = "high_interest_debt\x00" as *u8 as i64; wt[3] = 15
77 chk("triage from THEIR answers = 90 (crisis)", sv_triage(k, d, nf, wq, wt, 4), 90, st)
78
79 // (2) before-you-buy uses THEIR wage: a $200 buy = 8 hours at the submitted $25/hr
80 chk("before-you-buy uses their wage: $200 = 8 hours", pur_hours(20000, sv_answer(k, d, nf, "hourly_wage\x00" as *u8)), 8, st)
81
82 // (3) accommodation reads THEIR ADHD flag -> one step at a time
83 var acc: i64 = 0
84 acc = ac_flag_if(acc, sv_answer(k, d, nf, "has_adhd\x00" as *u8), AC_ADHD)
85 acc = ac_flag_if(acc, sv_answer(k, d, nf, "low_vision\x00" as *u8), AC_LOW_VISION)
86 chk("accommodation from THEIR flag = ADHD (1)", acc, AC_ADHD, st)
87 chk("...so they see ONE step (load budget 1)", ac_load_budget(acc, 2, 6), 1, st)
88
89 g_puts("nx_intake_handler_gate: PASS="); g_putn(st[0]); g_puts(" FAIL="); g_putn(st[1]); g_puts("\n")
90 if st[1] == 0 { g_puts("SITUATION R6 nx_intake_handler: GREEN\n"); return 0 }
91 g_puts("SITUATION R6 nx_intake_handler: RED\n")
92 return 1
93}