nx_succession_test.nx source
↩ module page · 124 lines · 6113 B
1// nx_succession_test.nx -- smoke for nx_succession.
2
3import "nx_syscalls.nx"
4import "nx_succession.nx"
5
6func main() -> i64 {
7 let now: nx_size = 1000000
8
9 // 1: enum validity
10 if nx_su_stage_is_valid(NX_SU_STAGE_PIONEER) != 1 { return 1 }
11 if nx_su_stage_is_valid(NX_SU_STAGE_RELICT) != 1 { return 2 }
12 if nx_su_stage_is_valid(-1) != 0 { return 3 }
13 if nx_su_stage_is_valid(6) != 0 { return 4 }
14 if NX_SU_STAGE_N != 6 { return 5 }
15
16 if nx_su_v_is_valid(NX_SU_V_OK) != 1 { return 6 }
17 if nx_su_v_is_valid(NX_SU_V_REGRESSION_BLOCKED) != 1 { return 7 }
18 if nx_su_v_is_valid(NX_SU_V_N) != 0 { return 8 }
19
20 // 2: stage classification predicates
21 if nx_su_stage_is_removable(NX_SU_STAGE_PIONEER) != 1 { return 9 }
22 if nx_su_stage_is_removable(NX_SU_STAGE_EARLY) != 1 { return 10 }
23 if nx_su_stage_is_removable(NX_SU_STAGE_MID) != 0 { return 11 }
24 if nx_su_stage_is_removable(NX_SU_STAGE_CLIMAX) != 0 { return 12 }
25
26 if nx_su_stage_is_load_bearing(NX_SU_STAGE_MID) != 1 { return 13 }
27 if nx_su_stage_is_load_bearing(NX_SU_STAGE_LATE) != 1 { return 14 }
28 if nx_su_stage_is_load_bearing(NX_SU_STAGE_CLIMAX) != 1 { return 15 }
29 if nx_su_stage_is_load_bearing(NX_SU_STAGE_PIONEER) != 0 { return 16 }
30 if nx_su_stage_is_load_bearing(NX_SU_STAGE_RELICT) != 0 { return 17 }
31
32 // 3: construction
33 let reg: *NxSuccessionRegistry = nx_su_new(16, 5, 3)
34 if reg.capacity != 16 { return 18 }
35 if reg.n_records != 0 { return 19 }
36 if reg.promotion_min_pass_count != 5 { return 20 }
37 if reg.climax_min_dependents != 3 { return 21 }
38
39 // 4: invalid construction
40 if nx_su_new(0, 5, 3) != (0 as *NxSuccessionRegistry) { return 22 }
41 if nx_su_new(16, 0, 3) != (0 as *NxSuccessionRegistry) { return 23 }
42 if nx_su_new(16, 5, 0) != (0 as *NxSuccessionRegistry) { return 24 }
43
44 // 5: register valid records
45 if nx_su_register(reg, 101, NX_SU_STAGE_PIONEER, 100, 0, 3, now) != NX_SU_V_OK { return 25 }
46 if nx_su_register(reg, 102, NX_SU_STAGE_EARLY, 5000, 2, 8, now) != NX_SU_V_OK { return 26 }
47 if nx_su_register(reg, 103, NX_SU_STAGE_LATE, 100000, 4, 100, now) != NX_SU_V_OK { return 27 }
48 if nx_su_register(reg, 104, NX_SU_STAGE_CLIMAX, 500000, 10, 1000, now) != NX_SU_V_OK { return 28 }
49 if reg.n_records != 4 { return 29 }
50
51 // 6: register invalid stage
52 if nx_su_register(reg, 999, 99, 100, 0, 0, now) != NX_SU_V_INVALID { return 30 }
53
54 // 7: find
55 let r101: *NxSuccessionRecord = nx_su_find(reg, 101)
56 if r101.primitive_id != 101 { return 31 }
57 if r101.stage != NX_SU_STAGE_PIONEER { return 32 }
58 if r101.smoke_pass_count != 3 { return 33 }
59
60 let r_missing: *NxSuccessionRecord = nx_su_find(reg, 9999)
61 if (r_missing as i64) != 0 { return 34 }
62
63 // 8: promotion check -- pioneer with smoke_pass_count=3 < threshold 5 -> PREMATURE
64 if nx_su_check_promotion(reg, 101) != NX_SU_V_PREMATURE { return 35 }
65
66 // 9: early with smoke_pass_count=8 >= 5 -> PROMOTION_OK
67 if nx_su_check_promotion(reg, 102) != NX_SU_V_PROMOTION_OK { return 36 }
68
69 // 10: late but n_dependents=4 >= climax_min=3 -> PROMOTION_OK (to climax)
70 if nx_su_check_promotion(reg, 103) != NX_SU_V_PROMOTION_OK { return 37 }
71
72 // 11: climax already -> OK no-op
73 if nx_su_check_promotion(reg, 104) != NX_SU_V_OK { return 38 }
74
75 // 12: late but n_dependents below threshold -> PREMATURE
76 nx_su_register(reg, 105, NX_SU_STAGE_LATE, 100000, 1, 100, now)
77 if nx_su_check_promotion(reg, 105) != NX_SU_V_PREMATURE { return 39 }
78
79 // 13: demotion gates
80 if nx_su_check_demotion(NX_SU_STAGE_PIONEER, NX_SU_STAGE_EARLY) != NX_SU_V_OK { return 40 }
81 if nx_su_check_demotion(NX_SU_STAGE_MID, NX_SU_STAGE_EARLY) != NX_SU_V_OK { return 41 }
82 if nx_su_check_demotion(NX_SU_STAGE_LATE, NX_SU_STAGE_MID) != NX_SU_V_OK { return 42 }
83 if nx_su_check_demotion(NX_SU_STAGE_CLIMAX, NX_SU_STAGE_RELICT) != NX_SU_V_OK { return 43 }
84
85 // 14: refused regressions
86 if nx_su_check_demotion(NX_SU_STAGE_CLIMAX, NX_SU_STAGE_PIONEER) != NX_SU_V_REGRESSION_BLOCKED { return 44 }
87 if nx_su_check_demotion(NX_SU_STAGE_CLIMAX, NX_SU_STAGE_MID) != NX_SU_V_REGRESSION_BLOCKED { return 45 }
88 if nx_su_check_demotion(NX_SU_STAGE_LATE, NX_SU_STAGE_EARLY) != NX_SU_V_REGRESSION_BLOCKED { return 46 }
89 if nx_su_check_demotion(NX_SU_STAGE_LATE, NX_SU_STAGE_PIONEER) != NX_SU_V_REGRESSION_BLOCKED { return 47 }
90
91 // 15: invalid stages in demotion
92 if nx_su_check_demotion(-1, NX_SU_STAGE_PIONEER) != NX_SU_V_INVALID { return 48 }
93 if nx_su_check_demotion(NX_SU_STAGE_PIONEER, 99) != NX_SU_V_INVALID { return 49 }
94
95 // 16: count by stage
96 if nx_su_count_by_stage(reg, NX_SU_STAGE_PIONEER) != 1 { return 50 }
97 if nx_su_count_by_stage(reg, NX_SU_STAGE_EARLY) != 1 { return 51 }
98 if nx_su_count_by_stage(reg, NX_SU_STAGE_LATE) != 2 { return 52 }
99 if nx_su_count_by_stage(reg, NX_SU_STAGE_CLIMAX) != 1 { return 53 }
100 if nx_su_count_by_stage(reg, NX_SU_STAGE_MID) != 0 { return 54 }
101 if nx_su_count_by_stage(reg, NX_SU_STAGE_RELICT) != 0 { return 55 }
102
103 // 17: total dependents = 0+2+4+10+1 = 17
104 if nx_su_total_dependents(reg) != 17 { return 56 }
105
106 // 18: capacity exceeded
107 let small_reg: *NxSuccessionRegistry = nx_su_new(2, 5, 3)
108 nx_su_register(small_reg, 1, NX_SU_STAGE_PIONEER, 0, 0, 0, now)
109 nx_su_register(small_reg, 2, NX_SU_STAGE_PIONEER, 0, 0, 0, now)
110 if nx_su_register(small_reg, 3, NX_SU_STAGE_PIONEER, 0, 0, 0, now) != NX_SU_V_INVALID { return 57 }
111
112 // 19: null handling
113 let null_reg: *NxSuccessionRegistry = (0 as i64) as *NxSuccessionRegistry
114 if nx_su_register(null_reg, 1, NX_SU_STAGE_PIONEER, 0, 0, 0, now) != NX_SU_V_NULL { return 58 }
115 if (nx_su_find(null_reg, 1) as i64) != 0 { return 59 }
116 if nx_su_check_promotion(null_reg, 1) != NX_SU_V_NULL { return 60 }
117 if nx_su_count_by_stage(null_reg, NX_SU_STAGE_PIONEER) != 0 { return 61 }
118 if nx_su_total_dependents(null_reg) != 0 { return 62 }
119
120 // 20: unknown primitive in check_promotion
121 if nx_su_check_promotion(reg, 9999) != NX_SU_V_INVALID { return 63 }
122
123 return 0
124}