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}