code wiki / (root) / nx_math_games_test.nx

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}