nx_math_games_test.nx source
↩ module page · 117 lines · 5333 B
1// nx_math_games_test.nx -- smoke for the pedagogy primitives.
2// Refactored to use Result for fallible operations.
3
4import "nx_syscalls.nx"
5import "nx_runtime.nx"
6import "nx_tier.nx"
7import "nx_result.nx"
8import "nx_math_games.nx"
9
10func nx_assert_eq(label: *u8, got: nx_int, want: nx_int, pass_n: *nx_int, fail_n: *nx_int) {
11 print(label); print(": got=" as *u8); print_i64(got); print(" want=" as *u8); print_i64(want)
12 if got == want {
13 println(" PASS" as *u8)
14 pass_n[0] = pass_n[0] + 1
15 return
16 }
17 println(" FAIL" as *u8)
18 fail_n[0] = fail_n[0] + 1
19}
20
21func nx_assert_result_ok(label: *u8, r: *NxResult, want: nx_int,
22 pass_n: *nx_int, fail_n: *nx_int) {
23 print(label)
24 if nx_result_is_ok(r) != 1 {
25 print(": expected OK got ERR=" as *u8); print(nx_err_name(nx_result_err_code(r)))
26 println(" FAIL" as *u8)
27 fail_n[0] = fail_n[0] + 1
28 return
29 }
30 let got: nx_int = nx_result_unwrap(r)
31 print(": got=" as *u8); print_i64(got); print(" want=" as *u8); print_i64(want)
32 if got == want {
33 println(" PASS" as *u8)
34 pass_n[0] = pass_n[0] + 1
35 return
36 }
37 println(" FAIL" as *u8)
38 fail_n[0] = fail_n[0] + 1
39}
40
41func nx_assert_result_err(label: *u8, r: *NxResult, want_code: nx_int,
42 pass_n: *nx_int, fail_n: *nx_int) {
43 print(label)
44 if nx_result_is_err(r) != 1 {
45 println(": expected ERR got OK FAIL" as *u8)
46 fail_n[0] = fail_n[0] + 1
47 return
48 }
49 let got: nx_int = nx_result_err_code(r)
50 print(": err=" as *u8); print(nx_err_name(got)); print(" want=" as *u8); print(nx_err_name(want_code))
51 if got == want_code {
52 println(" PASS" as *u8)
53 pass_n[0] = pass_n[0] + 1
54 return
55 }
56 println(" FAIL" as *u8)
57 fail_n[0] = fail_n[0] + 1
58}
59
60func main() -> nx_exit {
61 let pass_n: *nx_int = (sys_mmap(8)) as *nx_int
62 let fail_n: *nx_int = (sys_mmap(8)) as *nx_int
63 pass_n[0] = 0
64 fail_n[0] = 0
65
66 println("=== MATH GAMES (Result-typed) smoke ===" as *u8)
67
68 // Guess-the-number (sealed: never fails)
69 nx_assert_eq("guess(50, 25) " as *u8,
70 nx_game_guess_check(50, 25), NX_GAME_GUESS_LOW, pass_n, fail_n)
71 nx_assert_eq("guess(50, 75) " as *u8,
72 nx_game_guess_check(50, 75), NX_GAME_GUESS_HIGH, pass_n, fail_n)
73 nx_assert_eq("guess(50, 50) " as *u8,
74 nx_game_guess_check(50, 50), NX_GAME_GUESS_CORRECT, pass_n, fail_n)
75
76 // Parity
77 nx_assert_eq("parity(7) " as *u8, nx_game_parity(7), NX_GAME_PARITY_ODD, pass_n, fail_n)
78 nx_assert_eq("parity(12) " as *u8, nx_game_parity(12), NX_GAME_PARITY_EVEN, pass_n, fail_n)
79
80 // Find factor with Result
81 nx_assert_result_ok("find_factor(15) " as *u8, nx_game_find_factor(15), 3, pass_n, fail_n)
82 nx_assert_result_ok("find_factor(13) " as *u8, nx_game_find_factor(13), 13, pass_n, fail_n)
83 nx_assert_result_ok("find_factor(100) " as *u8, nx_game_find_factor(100), 2, pass_n, fail_n)
84 nx_assert_result_err("find_factor(1) " as *u8, nx_game_find_factor(1), NX_ERR_OUT_OF_RANGE, pass_n, fail_n)
85 nx_assert_result_err("find_factor(0) " as *u8, nx_game_find_factor(0), NX_ERR_OUT_OF_RANGE, pass_n, fail_n)
86
87 // Pattern next with Result
88 nx_assert_result_ok("pattern(2,5,8) " as *u8, nx_game_pattern_next(2, 5, 8), 11, pass_n, fail_n)
89 nx_assert_result_ok("pattern(2,4,8) " as *u8, nx_game_pattern_next(2, 4, 8), 16, pass_n, fail_n)
90 nx_assert_result_err("pattern(1,2,5) no rule " as *u8, nx_game_pattern_next(1, 2, 5), NX_ERR_INVALID_INPUT, pass_n, fail_n)
91
92 // Pigeonhole with Result
93 nx_assert_result_ok("pigeon(10, 3) " as *u8, nx_riddle_pigeonhole(10, 3), 4, pass_n, fail_n)
94 nx_assert_result_ok("pigeon(12, 4) " as *u8, nx_riddle_pigeonhole(12, 4), 3, pass_n, fail_n)
95 nx_assert_result_err("pigeon(10, 0) /0 " as *u8, nx_riddle_pigeonhole(10, 0), NX_ERR_DIVIDE_BY_ZERO, pass_n, fail_n)
96
97 // Triangle with Result
98 nx_assert_result_ok("triangle(100) " as *u8, nx_riddle_triangle_n(100), 5050, pass_n, fail_n)
99 nx_assert_result_err("triangle(-5) " as *u8, nx_riddle_triangle_n(-5), NX_ERR_OUT_OF_RANGE, pass_n, fail_n)
100
101 // Hanoi + coin flips
102 nx_assert_result_ok("hanoi(3) " as *u8, nx_riddle_hanoi_moves(3), 7, pass_n, fail_n)
103 nx_assert_result_ok("hanoi(8) " as *u8, nx_riddle_hanoi_moves(8), 255, pass_n, fail_n)
104 nx_assert_result_ok("coin_flips(4) " as *u8, nx_riddle_coin_flip_outcomes(4), 16, pass_n, fail_n)
105
106 // Caesar + magic + fib (no Result -- can't fail)
107 nx_assert_eq("caesar('d',3)='a' " as *u8, nx_puzzle_caesar_decrypt(100, 3), 97, pass_n, fail_n)
108 nx_assert_eq("magic(2,7,6)=15 " as *u8, nx_puzzle_magic_3x3_check(2, 7, 6), 1, pass_n, fail_n)
109 nx_assert_eq("magic(1,2,3) NOT 15 " as *u8, nx_puzzle_magic_3x3_check(1, 2, 3), 0, pass_n, fail_n)
110 nx_assert_eq("fib(10) " as *u8, nx_puzzle_fib(10), 55, pass_n, fail_n)
111
112 println("" as *u8)
113 print("PASS=" as *u8); print_i64(pass_n[0])
114 print(" FAIL=" as *u8); print_i64(fail_n[0]); println("" as *u8)
115 if fail_n[0] > 0 { return 1 }
116 return 0
117}