nx_caplab_finance_test.nx source
↩ module page · 79 lines · 3654 B
1// nx_caplab_finance_test.nx -- gate for Capitalism Lab R7 (finances).
2//
3// Proves: (1) net worth = cash - debt, (2) a loan within the credit limit adds
4// liquidity, (3) a loan over the limit is denied, (4) a loan does NOT change net
5// worth (liquidity != wealth), (5) interest draws down cash, (6) repay reduces
6// both cash and debt, (7) bankruptcy is detected when underwater beyond credit,
7// (8) over-leverage drives a firm bankrupt as interest compounds the hole.
8
9import "nx_syscalls.nx"
10import "nx_runtime.nx"
11import "nx_tier.nx"
12import "nx_caplab_finance.nx"
13
14func nx_assert_eq(label: *u8, got: nx_int, want: nx_int, pass_n: *nx_int, fail_n: *nx_int) {
15 print(label); print(": got=" as *u8); print_i64(got); print(" want=" as *u8); print_i64(want)
16 if got == want { println(" PASS" as *u8); pass_n[0] = pass_n[0] + 1; return }
17 println(" FAIL" as *u8); fail_n[0] = fail_n[0] + 1
18}
19
20func mk2(a: nx_int, b: nx_int) -> *i64 {
21 let p: *i64 = (sys_mmap(16)) as *i64
22 p[0] = a
23 p[1] = b
24 return p
25}
26
27func main() -> nx_exit {
28 let pass_n: *nx_int = (sys_mmap(8)) as *nx_int
29 let fail_n: *nx_int = (sys_mmap(8)) as *nx_int
30 pass_n[0] = 0
31 fail_n[0] = 0
32 let LIMIT: nx_int = 500
33
34 println("=== CAPLAB R7: firm finances ===" as *u8)
35
36 // --- T1: net worth ---
37 nx_assert_eq("net worth (300-200) " as *u8, nx_clab_fin_networth(mk2(300, 200)), 100, pass_n, fail_n)
38
39 // --- T2/T4: loan within limit adds cash; net worth UNCHANGED ---
40 let f1: *i64 = mk2(100, 0)
41 let nwBefore: nx_int = nx_clab_fin_networth(f1)
42 nx_assert_eq("loan granted (200<=500)" as *u8, nx_clab_fin_loan(f1, 200, LIMIT), 1, pass_n, fail_n)
43 nx_assert_eq("loan -> cash 300 " as *u8, f1[NX_FIN_CASH], 300, pass_n, fail_n)
44 nx_assert_eq("loan -> debt 200 " as *u8, f1[NX_FIN_DEBT], 200, pass_n, fail_n)
45 nx_assert_eq("loan keeps net worth " as *u8, nx_clab_fin_networth(f1), nwBefore, pass_n, fail_n)
46
47 // --- T3: loan over the limit denied (record unchanged) ---
48 let f2: *i64 = mk2(100, 400)
49 nx_assert_eq("loan denied (400+200>L)" as *u8, nx_clab_fin_loan(f2, 200, LIMIT), 0, pass_n, fail_n)
50 nx_assert_eq("denied: cash unchanged " as *u8, f2[NX_FIN_CASH], 100, pass_n, fail_n)
51
52 // --- T5: interest draws down cash (200 debt @10% = 20) ---
53 let f3: *i64 = mk2(300, 200)
54 nx_clab_fin_interest(f3, 10)
55 nx_assert_eq("interest -> cash 280 " as *u8, f3[NX_FIN_CASH], 280, pass_n, fail_n)
56
57 // --- T6: repay reduces cash and debt together ---
58 let f4: *i64 = mk2(280, 200)
59 nx_clab_fin_repay(f4, 100)
60 nx_assert_eq("repay -> cash 180 " as *u8, f4[NX_FIN_CASH], 180, pass_n, fail_n)
61 nx_assert_eq("repay -> debt 100 " as *u8, f4[NX_FIN_DEBT], 100, pass_n, fail_n)
62
63 // --- T7: bankruptcy detection ---
64 nx_assert_eq("bankrupt (nw -600<=-500)" as *u8, nx_clab_fin_bankrupt(mk2(0, 600), LIMIT), 1, pass_n, fail_n)
65 nx_assert_eq("solvent (nw -300>-500)" as *u8, nx_clab_fin_bankrupt(mk2(100, 400), LIMIT), 0, pass_n, fail_n)
66
67 // --- T8: over-leverage -> interest tips it into bankruptcy ---
68 let f5: *i64 = mk2(50, 500)
69 nx_assert_eq("pre: solvent " as *u8, nx_clab_fin_bankrupt(f5, LIMIT), 0, pass_n, fail_n)
70 nx_clab_fin_interest(f5, 10)
71 nx_assert_eq("after interest: cash 0 " as *u8, f5[NX_FIN_CASH], 0, pass_n, fail_n)
72 nx_assert_eq("now BANKRUPT " as *u8, nx_clab_fin_bankrupt(f5, LIMIT), 1, pass_n, fail_n)
73
74 println("" as *u8)
75 print("PASS=" as *u8); print_i64(pass_n[0])
76 print(" FAIL=" as *u8); print_i64(fail_n[0]); println("" as *u8)
77 if fail_n[0] > 0 { return 1 }
78 return 0
79}