nx_race_timing_test.nx source
↩ module page · 86 lines · 3815 B
1// nx_race_timing_test.nx -- smoke for nx_race_timing sealed enum.
2//
3// expect_exit: 0
4//
5// license_tier: ORIGINAL
6
7import "nx_race_timing.nx"
8
9// strncmp-style byte equality.
10func bytes_eq(a: *u8, b: *u8, n: i64) -> i64 {
11 var i: i64 = 0
12 while i < n {
13 if a[i] != b[i] { return 0 }
14 i = i + 1
15 }
16 return 1
17}
18
19func main() -> i64 {
20 // ---- Validity gate ----
21 if nx_race_timing_is_valid(NX_RACE_MANUAL) != 1 { return 1 }
22 if nx_race_timing_is_valid(NX_RACE_EVENT) != 1 { return 2 }
23 if nx_race_timing_is_valid(NX_RACE_SCHEDULED) != 1 { return 3 }
24 if nx_race_timing_is_valid(NX_RACE_CONTINUOUS) != 1 { return 4 }
25 if nx_race_timing_is_valid(NX_RACE_IDLE) != 1 { return 5 }
26 if nx_race_timing_is_valid(NX_RACE_THRESHOLD) != 1 { return 6 }
27 if nx_race_timing_is_valid(NX_RACE_PROBABILISTIC) != 1 { return 7 }
28 if nx_race_timing_is_valid(NX_RACE_QUORUM) != 1 { return 8 }
29 if nx_race_timing_is_valid(NX_RACE_TIMING_N) != 0 { return 9 }
30 if nx_race_timing_is_valid(-1) != 0 { return 10 }
31 if nx_race_timing_is_valid(100) != 0 { return 11 }
32
33 // ---- Name lookup ----
34 let manual_name: *u8 = nx_race_timing_name(NX_RACE_MANUAL)
35 if bytes_eq(manual_name, "MANUAL" as *u8, 6) != 1 { return 20 }
36 if nx_race_timing_name_len(NX_RACE_MANUAL) != 6 { return 21 }
37
38 let cont_name: *u8 = nx_race_timing_name(NX_RACE_CONTINUOUS)
39 if bytes_eq(cont_name, "CONTINUOUS" as *u8, 10) != 1 { return 22 }
40 if nx_race_timing_name_len(NX_RACE_CONTINUOUS) != 10 { return 23 }
41
42 let prob_name: *u8 = nx_race_timing_name(NX_RACE_PROBABILISTIC)
43 if bytes_eq(prob_name, "PROBABILISTIC" as *u8, 13) != 1 { return 24 }
44 if nx_race_timing_name_len(NX_RACE_PROBABILISTIC) != 13 { return 25 }
45
46 let invalid_name: *u8 = nx_race_timing_name(-1)
47 if bytes_eq(invalid_name, "INVALID" as *u8, 7) != 1 { return 26 }
48
49 // ---- Round-trip parse ----
50 var i: i64 = 0
51 while i < NX_RACE_TIMING_N {
52 let nm: *u8 = nx_race_timing_name(i)
53 let ln: i64 = nx_race_timing_name_len(i)
54 let parsed: i64 = nx_race_timing_parse(nm, ln)
55 if parsed != i { return 30 + i }
56 i = i + 1
57 }
58
59 // ---- Parse failure paths ----
60 if nx_race_timing_parse("ZZZNOTAMODE" as *u8, 11) != NX_RACE_TIMING_N { return 50 }
61 if nx_race_timing_parse(0 as *u8, 6) != NX_RACE_TIMING_N { return 51 }
62 if nx_race_timing_parse("MANUAL" as *u8, 0) != NX_RACE_TIMING_N { return 52 }
63 if nx_race_timing_parse("MANUA" as *u8, 5) != NX_RACE_TIMING_N { return 53 } // short-substring rejection
64
65 // ---- Reactive classification ----
66 if nx_race_timing_is_reactive(NX_RACE_MANUAL) != 0 { return 60 }
67 if nx_race_timing_is_reactive(NX_RACE_EVENT) != 1 { return 61 }
68 if nx_race_timing_is_reactive(NX_RACE_SCHEDULED) != 0 { return 62 }
69 if nx_race_timing_is_reactive(NX_RACE_CONTINUOUS) != 0 { return 63 }
70 if nx_race_timing_is_reactive(NX_RACE_IDLE) != 1 { return 64 }
71 if nx_race_timing_is_reactive(NX_RACE_THRESHOLD) != 1 { return 65 }
72 if nx_race_timing_is_reactive(NX_RACE_PROBABILISTIC) != 0 { return 66 }
73 if nx_race_timing_is_reactive(NX_RACE_QUORUM) != 1 { return 67 }
74
75 // ---- Needs-config classification ----
76 if nx_race_timing_needs_config(NX_RACE_MANUAL) != 0 { return 70 }
77 if nx_race_timing_needs_config(NX_RACE_EVENT) != 0 { return 71 }
78 if nx_race_timing_needs_config(NX_RACE_SCHEDULED) != 1 { return 72 }
79 if nx_race_timing_needs_config(NX_RACE_CONTINUOUS) != 1 { return 73 }
80 if nx_race_timing_needs_config(NX_RACE_IDLE) != 0 { return 74 }
81 if nx_race_timing_needs_config(NX_RACE_THRESHOLD) != 1 { return 75 }
82 if nx_race_timing_needs_config(NX_RACE_PROBABILISTIC) != 1 { return 76 }
83 if nx_race_timing_needs_config(NX_RACE_QUORUM) != 1 { return 77 }
84
85 return 0
86}