nx_event_queue_test.nx source
↩ module page · 67 lines · 2706 B
1// nx_event_queue_test.nx -- smoke for nx_event_queue.
2
3import "nx_syscalls.nx"
4import "nx_event_queue.nx"
5
6func main() -> i64 {
7 if NX_EV_N_KINDS != 9 { return 1 }
8 if nx_ev_kind_is_known(NX_EV_XENO_OBSERVATION) != 1 { return 2 }
9 if nx_ev_kind_is_known(NX_EV_RECOVERY_TRIGGERED) != 1 { return 3 }
10 if nx_ev_kind_is_known(9) != 0 { return 4 }
11
12 let q: *NxEventQueue = nx_event_queue_new(4)
13 if q.capacity != 4 { return 5 }
14 if q.count != 0 { return 6 }
15
16 // Empty: peek returns -1
17 if nx_event_queue_peek_kind(q) != -1 { return 7 }
18 let out_k: *i64 = (sys_mmap(8)) as *i64
19 let out_s: *i64 = (sys_mmap(8)) as *i64
20 let out_p: *i64 = (sys_mmap(8)) as *i64
21 let out_t: *i64 = (sys_mmap(8)) as *i64
22 if nx_event_queue_drain_one(q, out_k, out_s, out_p, out_t) != NX_EQ_ERR_EMPTY { return 8 }
23
24 // Emit 3 events
25 nx_event_queue_emit(q, 1000, NX_EV_XENO_OBSERVATION, 100, 0xaa, 200)
26 nx_event_queue_emit(q, 1100, NX_EV_TREATY_BREACHED, 200, 0xbb, 100)
27 nx_event_queue_emit(q, 1200, NX_EV_HEALTH_TRANSITION, 300, 0xcc, 100)
28 if q.count != 3 { return 9 }
29 if nx_event_queue_total_emitted(q) != 3 { return 10 }
30
31 // Peek next (oldest)
32 if nx_event_queue_peek_kind(q) != NX_EV_XENO_OBSERVATION { return 11 }
33
34 // Drain one -> FIFO oldest first
35 nx_event_queue_drain_one(q, out_k, out_s, out_p, out_t)
36 if out_k[0] != NX_EV_XENO_OBSERVATION { return 12 }
37 if out_s[0] != 100 { return 13 }
38 if out_p[0] != 0xaa { return 14 }
39 if out_t[0] != 1000 { return 15 }
40 if q.count != 2 { return 16 }
41
42 // count_by_kind
43 if nx_event_queue_count_by_kind(q, NX_EV_TREATY_BREACHED) != 1 { return 17 }
44 if nx_event_queue_count_by_kind(q, NX_EV_XENO_OBSERVATION) != 0 { return 18 } // already drained
45
46 // FULL behavior
47 nx_event_queue_emit(q, 1300, NX_EV_SCAM_FLAGGED, 400, 0, 100)
48 nx_event_queue_emit(q, 1400, NX_EV_VESICLE_DELIVERED, 500, 0, 100)
49 if q.count != 4 { return 19 }
50 if nx_event_queue_emit(q, 1500, NX_EV_SCAM_FLAGGED, 600, 0, 100) != NX_EQ_ERR_FULL { return 20 }
51
52 // Drain remaining
53 nx_event_queue_drain_one(q, out_k, out_s, out_p, out_t)
54 if out_k[0] != NX_EV_TREATY_BREACHED { return 21 }
55 nx_event_queue_drain_one(q, out_k, out_s, out_p, out_t)
56 if out_k[0] != NX_EV_HEALTH_TRANSITION { return 22 }
57 nx_event_queue_drain_one(q, out_k, out_s, out_p, out_t)
58 if out_k[0] != NX_EV_SCAM_FLAGGED { return 23 }
59 nx_event_queue_drain_one(q, out_k, out_s, out_p, out_t)
60 if out_k[0] != NX_EV_VESICLE_DELIVERED { return 24 }
61 if q.count != 0 { return 25 }
62
63 // total_emitted monotonic across drains
64 if nx_event_queue_total_emitted(q) != 5 { return 26 }
65
66 return 0
67}