nx_grove_test.nx source
↩ module page · 102 lines · 4873 B
1// nx_grove_test.nx -- smoke for nx_grove.
2
3import "nx_syscalls.nx"
4import "nx_grove.nx"
5
6func main() -> i64 {
7 let now: nx_size = 1000000
8
9 // 1: enum validity
10 if nx_gr_kind_is_valid(NX_GR_KIND_ENDOWMENT_PRINCIPAL) != 1 { return 1 }
11 if nx_gr_kind_is_valid(NX_GR_KIND_TEK_CONTRIBUTION) != 1 { return 2 }
12 if nx_gr_kind_is_valid(-1) != 0 { return 3 }
13 if nx_gr_kind_is_valid(8) != 0 { return 4 }
14 if NX_GR_KIND_N != 8 { return 5 }
15
16 if nx_gr_v_is_valid(NX_GR_V_OK) != 1 { return 6 }
17 if nx_gr_v_is_valid(NX_GR_V_INVALID) != 1 { return 7 }
18 if nx_gr_v_is_valid(-1) != 0 { return 8 }
19 if nx_gr_v_is_valid(NX_GR_V_N) != 0 { return 9 }
20
21 // 2: classification predicates
22 if nx_gr_kind_is_in_perpetuity(NX_GR_KIND_ENDOWMENT_PRINCIPAL) != 1 { return 10 }
23 if nx_gr_kind_is_in_perpetuity(NX_GR_KIND_LAND_TRUST) != 1 { return 11 }
24 if nx_gr_kind_is_in_perpetuity(NX_GR_KIND_CONSERVATION_EASEMENT) != 1 { return 12 }
25 if nx_gr_kind_is_in_perpetuity(NX_GR_KIND_INDIGENOUS_STEWARDSHIP) != 1 { return 13 }
26 if nx_gr_kind_is_in_perpetuity(NX_GR_KIND_LABOR_INKIND) != 0 { return 14 }
27 if nx_gr_kind_is_in_perpetuity(NX_GR_KIND_GENERATION_SKIPPING) != 0 { return 15 }
28
29 if nx_gr_kind_is_in_kind(NX_GR_KIND_LABOR_INKIND) != 1 { return 16 }
30 if nx_gr_kind_is_in_kind(NX_GR_KIND_TEK_CONTRIBUTION) != 1 { return 17 }
31 if nx_gr_kind_is_in_kind(NX_GR_KIND_ENDOWMENT_PRINCIPAL) != 0 { return 18 }
32
33 // 3: refuse extractive discount rate at construction
34 // Q10 51 = ~5%; rates >=51 must refuse
35 if nx_gr_new(1, 4, 51, 5, now) != (0 as *NxGrove) { return 19 }
36 if nx_gr_new(1, 4, 100, 5, now) != (0 as *NxGrove) { return 20 } // ~10%
37 if nx_gr_new(1, 4, 200, 5, now) != (0 as *NxGrove) { return 21 } // ~20%
38
39 // 4: valid construction with patient discount (Q10 10 = ~1%) ok
40 let g: *NxGrove = nx_gr_new(1, 8, 10, 50, now)
41 if g.grove_id != 1 { return 22 }
42 if g.capacity != 8 { return 23 }
43 if g.minimum_horizon_years != 50 { return 24 }
44 if g.discount_rate_q10 != 10 { return 25 }
45 if g.n_contributions != 0 { return 26 }
46
47 // 5: zero discount (rate=0) also ok -- pure perpetuity capital
48 let g0: *NxGrove = nx_gr_new(2, 4, 0, 100, now)
49 if g0.discount_rate_q10 != 0 { return 27 }
50
51 // 6: refuse short horizon
52 let short_result: nx_int = nx_gr_add_contribution(g, 100, NX_GR_KIND_LAND_TRUST, 1000, 4, 0xCAFE, now)
53 if short_result != NX_GR_V_REFUSED_SHORT_HORIZON { return 28 }
54
55 // 7: refuse below minimum_horizon_years
56 let below_min: nx_int = nx_gr_add_contribution(g, 100, NX_GR_KIND_LAND_TRUST, 1000, 30, 0xCAFE, now)
57 if below_min != NX_GR_V_REFUSED_SHORT_HORIZON { return 29 }
58
59 // 8: add valid contributions
60 let r1: nx_int = nx_gr_add_contribution(g, 100, NX_GR_KIND_LAND_TRUST, 1000, 100, 0xCAFE, now)
61 if r1 != NX_GR_V_OK { return 30 }
62 let r2: nx_int = nx_gr_add_contribution(g, 200, NX_GR_KIND_LABOR_INKIND, 250, 50, 0xBEEF, now)
63 if r2 != NX_GR_V_OK { return 31 }
64 let r3: nx_int = nx_gr_add_contribution(g, 300, NX_GR_KIND_LAND_TRUST, 500, 75, 0xFADE, now)
65 if r3 != NX_GR_V_OK { return 32 }
66 let r4: nx_int = nx_gr_add_contribution(g, 400, NX_GR_KIND_TEK_CONTRIBUTION, 100, 200, 0xDEAD, now)
67 if r4 != NX_GR_V_OK { return 33 }
68
69 if g.n_contributions != 4 { return 34 }
70
71 // 9: total by kind
72 if nx_gr_total_units_by_kind(g, NX_GR_KIND_LAND_TRUST) != 1500 { return 35 }
73 if nx_gr_total_units_by_kind(g, NX_GR_KIND_LABOR_INKIND) != 250 { return 36 }
74 if nx_gr_total_units_by_kind(g, NX_GR_KIND_TEK_CONTRIBUTION) != 100 { return 37 }
75 if nx_gr_total_units_by_kind(g, NX_GR_KIND_ENDOWMENT_PRINCIPAL) != 0 { return 38 }
76
77 // 10: count by kind
78 if nx_gr_count_by_kind(g, NX_GR_KIND_LAND_TRUST) != 2 { return 39 }
79 if nx_gr_count_by_kind(g, NX_GR_KIND_LABOR_INKIND) != 1 { return 40 }
80 if nx_gr_count_by_kind(g, NX_GR_KIND_TEK_CONTRIBUTION) != 1 { return 41 }
81 if nx_gr_count_by_kind(g, NX_GR_KIND_CONSERVATION_EASEMENT) != 0 { return 42 }
82
83 // 11: longest horizon
84 if nx_gr_longest_horizon_years(g) != 200 { return 43 }
85
86 // 12: invalid kind refused
87 let bad_kind: nx_int = nx_gr_add_contribution(g, 500, 99, 100, 50, 0, now)
88 if bad_kind != NX_GR_V_ERR_INVALID_KIND { return 44 }
89
90 // 13: null guard
91 let null_g: *NxGrove = (0 as i64) as *NxGrove
92 if nx_gr_add_contribution(null_g, 1, NX_GR_KIND_LAND_TRUST, 100, 50, 0, now) != NX_GR_V_NULL { return 45 }
93 if nx_gr_total_units_by_kind(null_g, NX_GR_KIND_LAND_TRUST) != 0 { return 46 }
94 if nx_gr_longest_horizon_years(null_g) != 0 { return 47 }
95 if nx_gr_count_by_kind(null_g, NX_GR_KIND_LAND_TRUST) != 0 { return 48 }
96
97 // 14: invalid capacity rejected
98 if nx_gr_new(1, 0, 10, 5, now) != (0 as *NxGrove) { return 49 }
99 if nx_gr_new(1, -1, 10, 5, now) != (0 as *NxGrove) { return 50 }
100
101 return 0
102}