code wiki / (root) / nx_caplab_finance_test.nx

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}