code wiki / (root) / nx_moonraker_motion_parse_test.nx

nx_moonraker_motion_parse_test.nx source

↩ module page · 116 lines · 4522 B

1// nx_moonraker_motion_parse_test.nx -- motion_report -> Q14 fields. 2// 3// Closed-form invariants: 4// (a) Bad inputs -> BAD_INPUT 5// (b) No motion_report -> NO_OBJECT, outputs untouched 6// (c) Canonical motion_report -> OK, all 5 outputs populated 7// (d) Float-to-Q14 precision: 120.5 -> 1974272 8// (e) live_extruder_position overrides position[3] 9// (f) Negative position handled (e.g. retracted extruder) 10// (g) Integer-only number (no fraction) handled 11// (h) Three-digit fractional precision (0.125 -> 2048) 12// 13// expect_exit: 0 14// license_tier: ORIGINAL 15 16import "nx_syscalls.nx" 17import "nx_moonraker_telemetry_parse.nx" 18 19const Q14: i64 = 16384 20 21func cstr_len(s: *u8) -> i64 { 22 var n: i64 = 0 23 while s[n] != 0 { n = n + 1 } 24 return n 25} 26 27func mk_box() -> *i64 { 28 let b: *i64 = (sys_mmap(8)) as *i64 29 *b = MR_P_Q14_NOT_FOUND 30 return b 31} 32 33func main() -> i64 { 34 let bx: *i64 = mk_box() 35 let by: *i64 = mk_box() 36 let bz: *i64 = mk_box() 37 let be: *i64 = mk_box() 38 let bv: *i64 = mk_box() 39 40 // ===== (a) Bad inputs ===== 41 if nx_moonraker_parse_motion(0 as *u8, 100, bx, by, bz, be, bv) != NX_MR_PARSE_BAD_INPUT { return 10 } 42 if nx_moonraker_parse_motion("dummy", 0, bx, by, bz, be, bv) != NX_MR_PARSE_BAD_INPUT { return 11 } 43 44 // ===== (b) No motion_report ===== 45 let body_b: *u8 = "{\"result\":{\"status\":{\"other\":{\"foo\":1}}}}" 46 if nx_moonraker_parse_motion(body_b, cstr_len(body_b), bx, by, bz, be, bv) != NX_MR_PARSE_NO_OBJECT { return 20 } 47 if *bx != MR_P_Q14_NOT_FOUND { return 21 } 48 49 // ===== (c) Canonical ===== 50 let body_c: *u8 = 51"{\"result\":{\"status\":{\"motion_report\":{\"live_position\":[120.5,100.25,0.4,30.0],\"live_extruder_position\":30.0,\"live_velocity\":60.0}}}}" 52 if nx_moonraker_parse_motion(body_c, cstr_len(body_c), bx, by, bz, be, bv) != NX_MR_PARSE_OK { return 30 } 53 // 120.5 × 16384 = 1974272 54 if *bx != 1974272 { return 31 } 55 // 100.25 × 16384 = 1642496 56 if *by != 1642496 { return 32 } 57 // 0.4 × 16384 = 6553.6 -> truncates differently; (4 × 16384) / 10 = 6553 58 if *bz != 6553 { return 33 } 59 // 30.0 × 16384 = 491520 60 if *be != 491520 { return 34 } 61 if *bv != 60 * Q14 { return 35 } 62 63 // ===== (d) Already covered in (c) — 120.5 -> 1974272 confirmed ===== 64 65 // ===== (e) live_extruder_position overrides position[3] ===== 66 let bxe: *i64 = mk_box() 67 let bye: *i64 = mk_box() 68 let bze: *i64 = mk_box() 69 let bee: *i64 = mk_box() 70 let bve: *i64 = mk_box() 71 let body_e: *u8 = 72"{\"result\":{\"status\":{\"motion_report\":{\"live_position\":[0,0,0,99.0],\"live_extruder_position\":42.0,\"live_velocity\":10.0}}}}" 73 if nx_moonraker_parse_motion(body_e, cstr_len(body_e), bxe, bye, bze, bee, bve) != NX_MR_PARSE_OK { return 40 } 74 // live_extruder_position 42.0 should win over array's 99.0 75 if *bee != 42 * Q14 { return 41 } 76 77 // ===== (f) Negative positions ===== 78 let bxf: *i64 = mk_box() 79 let byf: *i64 = mk_box() 80 let bzf: *i64 = mk_box() 81 let bef: *i64 = mk_box() 82 let bvf: *i64 = mk_box() 83 let body_f: *u8 = 84"{\"result\":{\"status\":{\"motion_report\":{\"live_position\":[-10.5,0,0.4,-5.0],\"live_extruder_position\":-5.0,\"live_velocity\":0}}}}" 85 if nx_moonraker_parse_motion(body_f, cstr_len(body_f), bxf, byf, bzf, bef, bvf) != NX_MR_PARSE_OK { return 50 } 86 // -10.5 × Q14 = -172032 87 if *bxf != 0 - 172032 { return 51 } 88 if *bef != 0 - 5 * Q14 { return 52 } 89 90 // ===== (g) Integer-only number (no fraction) ===== 91 let bxg: *i64 = mk_box() 92 let byg: *i64 = mk_box() 93 let bzg: *i64 = mk_box() 94 let beg: *i64 = mk_box() 95 let bvg: *i64 = mk_box() 96 let body_g: *u8 = 97"{\"motion_report\":{\"live_position\":[100,200,5,30],\"live_velocity\":60}}" 98 if nx_moonraker_parse_motion(body_g, cstr_len(body_g), bxg, byg, bzg, beg, bvg) != NX_MR_PARSE_OK { return 60 } 99 if *bxg != 100 * Q14 { return 61 } 100 if *byg != 200 * Q14 { return 62 } 101 if *bzg != 5 * Q14 { return 63 } 102 103 // ===== (h) Three-digit fractional precision 0.125 -> 2048 ===== 104 let bxh: *i64 = mk_box() 105 let byh: *i64 = mk_box() 106 let bzh: *i64 = mk_box() 107 let beh: *i64 = mk_box() 108 let bvh: *i64 = mk_box() 109 let body_h: *u8 = 110"{\"motion_report\":{\"live_position\":[0,0,0.125,0],\"live_velocity\":0}}" 111 if nx_moonraker_parse_motion(body_h, cstr_len(body_h), bxh, byh, bzh, beh, bvh) != NX_MR_PARSE_OK { return 70 } 112 // 0.125 × 16384 = 2048 exact 113 if *bzh != 2048 { return 71 } 114 115 return 0 116}