nx_money_ledger_gate.nx source
↩ module page · 53 lines · 3110 B
1// nx_money_ledger_gate.nx -- proves the sovereign data-in path end-to-end: parse a real statement CSV, sum income,
2// auto-categorize outflows (need/want/save + recurring), then run nx_spend_analyze ON THE INGESTED DATA (integration:
3// CSV -> ledger -> analyzer). Exit 0 iff all pass. license_tier: ORIGINAL
4import "nx_gate.nx"
5import "nx_money_ledger.nx"
6
7func chk(name: *u8, got: i64, want: i64, st: *i64) -> i64 {
8 if got == want { st[0] = st[0] + 1; gw(" PASS " as *u8); gw(name); gw("\n" as *u8) }
9 else { st[1] = st[1] + 1; gw(" FAIL " as *u8); gw(name); gw(" got=" as *u8); gn(got); gw(" want=" as *u8); gn(want); gw("\n" as *u8) }
10 return 0
11}
12
13func main() -> i64 {
14 let st: *i64 = sys_mmap(16) as *i64
15 st[0] = 0; st[1] = 0
16
17 let csv: *u8 = "2024-01-01,PAYROLL DEPOSIT,3000.00\n2024-01-02,RENT PAYMENT,-1500.00\n2024-01-03,WHOLE FOODS MARKET,-85.50\n2024-01-05,NETFLIX SUBSCRIPTION,-15.99\n2024-01-06,STARBUCKS COFFEE,-6.50\n2024-01-10,TRANSFER TO SAVINGS,-200.00\n" as *u8
18 var len: i64 = 0; while csv[len] != (0 as u8) { len = len + 1 }
19
20 let sp: *i64 = sys_mmap(8 * SP_FIELDS * 16) as *i64
21 let inc: *i64 = sys_mmap(16) as *i64
22 let n: i64 = lg_parse_csv(csv, len, sp, 16, inc)
23
24 chk("parsed outflow rows = 5" as *u8, n, 5, st)
25 chk("income (inflows) = $3000" as *u8, inc[0], 300000, st)
26
27 // amount parser spot-checks
28 chk("parse \"-1500.00\" = -150000c" as *u8, lg_parse_amount("-1500.00" as *u8, 0, 8), 0 - 150000, st)
29 chk("parse \"-6.50\" = -650c" as *u8, lg_parse_amount("-6.50" as *u8, 0, 5), 0 - 650, st)
30
31 // categorization of specific rows
32 chk("row0 RENT -> class NEED" as *u8, sp[0*SP_FIELDS+1], SP_NEED, st)
33 chk("row0 RENT -> recurring 1" as *u8, sp[0*SP_FIELDS+2], 1, st)
34 chk("row0 RENT -> $1500" as *u8, sp[0*SP_FIELDS+0], 150000, st)
35 chk("row2 NETFLIX -> class WANT" as *u8, sp[2*SP_FIELDS+1], SP_WANT, st)
36 chk("row2 NETFLIX -> recurring 1" as *u8, sp[2*SP_FIELDS+2], 1, st)
37 chk("row2 NETFLIX -> $15.99" as *u8, sp[2*SP_FIELDS+0], 1599, st)
38 chk("row3 STARBUCKS -> WANT, not recurring" as *u8, sp[3*SP_FIELDS+2], 0, st)
39 chk("row4 SAVINGS -> class SAVE" as *u8, sp[4*SP_FIELDS+1], SP_SAVE, st)
40
41 // INTEGRATION: run the analyzer on the ingested ledger
42 chk("analyzer: total outflow = $1807.99" as *u8, sp_total(sp, n), 180799, st)
43 chk("analyzer: needs = $1585.50" as *u8, sp_total_by_class(sp, n, SP_NEED), 158550, st)
44 chk("analyzer: wants = $22.49" as *u8, sp_total_by_class(sp, n, SP_WANT), 2249, st)
45 chk("analyzer: savings = $200" as *u8, sp_total_by_class(sp, n, SP_SAVE), 20000, st)
46 chk("analyzer: cancellable subs = $15.99 (Netflix)" as *u8, sp_recurring_want_total(sp, n), 1599, st)
47 chk("analyzer: largest want = row 2 (Netflix)" as *u8, sp_largest_want(sp, n), 2, st)
48
49 gw("nx_money_ledger_gate: PASS=" as *u8); gn(st[0]); gw(" FAIL=" as *u8); gn(st[1]); gw("\n" as *u8)
50 if st[1] == 0 { gw("nx_money_ledger: GREEN (sovereign CSV -> ledger -> auto-categorize -> analyzer, end-to-end)\n" as *u8); return 0 }
51 gw("nx_money_ledger: RED\n" as *u8)
52 return 1
53}