code wiki / (root) / nx_race_timing_test.nx

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}