nx_cell_test.nx source
↩ module page · 88 lines · 3940 B
1// nx_cell_test.nx -- smoke for nx_cell.
2
3import "nx_syscalls.nx"
4import "nx_budget.nx"
5import "nx_attention_class.nx"
6import "nx_methyl.nx"
7import "nx_cell.nx"
8
9func main() -> i64 {
10 let sig: *u8 = (sys_mmap(96)) as *u8
11 sig[0] = 1 as u8
12 let mark: *NxMethylMark = nx_methyl_new(7, 0xcafe, 1000, sig, 96)
13 let b: *NxBudget = nx_budget_new(7, 1000000, 0, 0, 0, 0)
14
15 // 1: state enum sealed
16 if NX_CL_N_STATES != 6 { return 1 }
17 if nx_cl_state_is_valid(NX_CL_RUNNING) != 1 { return 2 }
18 if nx_cl_state_is_valid(NX_CL_TERMINATED) != 1 { return 3 }
19 if nx_cl_state_is_valid(6) != 0 { return 4 }
20 if nx_cl_state_accepts_work(NX_CL_RUNNING) != 1 { return 5 }
21 if nx_cl_state_accepts_work(NX_CL_SUSPENDED) != 0 { return 6 }
22 if nx_cl_state_is_terminal(NX_CL_TERMINATED) != 1 { return 7 }
23 if nx_cl_state_is_terminal(NX_CL_ABORTIVE) != 0 { return 8 }
24
25 // 2: construction starts NASCENT
26 let c: *NxCell = nx_cell_new(100, NX_AC_INTERACTIVE_FOREGROUND_GAME,
27 500, mark, b, 1000)
28 if (c as i64) == 0 { return 9 }
29 if c.cell_id != 100 { return 10 }
30 if c.state != NX_CL_NASCENT { return 11 }
31 if nx_cell_can_work(c) != 0 { return 12 }
32
33 // 3: bad attention class refused
34 let bad_c: *NxCell = nx_cell_new(101, 99, 500, mark, b, 1000)
35 if (bad_c as i64) != 0 { return 13 }
36
37 // 4: transition NASCENT -> RUNNING allowed
38 if nx_cell_transition(c, NX_CL_RUNNING, 2000) != NX_CELL_OK { return 14 }
39 if nx_cell_can_work(c) != 1 { return 15 }
40 if c.state_change_count != 1 { return 16 }
41
42 // 5: invalid transition NASCENT -> YIELDING refused
43 let c2: *NxCell = nx_cell_new(200, NX_AC_DEV, 500, mark, b, 1000)
44 if nx_cell_transition(c2, NX_CL_YIELDING, 2000) != NX_CELL_ERR_BAD_TRANSITION { return 17 }
45 if c2.state != NX_CL_NASCENT { return 18 }
46
47 // 6: RUNNING -> YIELDING -> RUNNING (yield + resume)
48 if nx_cell_transition(c, NX_CL_YIELDING, 3000) != NX_CELL_OK { return 19 }
49 if nx_cell_transition(c, NX_CL_RUNNING, 4000) != NX_CELL_OK { return 20 }
50
51 // 7: RUNNING -> SUSPENDED -> RUNNING
52 if nx_cell_transition(c, NX_CL_SUSPENDED, 5000) != NX_CELL_OK { return 21 }
53 if nx_cell_can_work(c) != 0 { return 22 }
54 if nx_cell_transition(c, NX_CL_RUNNING, 6000) != NX_CELL_OK { return 23 }
55
56 // 8: terminal path -- RUNNING -> ABORTIVE -> TERMINATED
57 if nx_cell_transition(c, NX_CL_ABORTIVE, 7000) != NX_CELL_OK { return 24 }
58 if nx_cell_transition(c, NX_CL_TERMINATED, 8000) != NX_CELL_OK { return 25 }
59 if nx_cell_is_terminal(c) != 1 { return 26 }
60
61 // 9: no exit from TERMINATED
62 if nx_cell_transition(c, NX_CL_RUNNING, 9000) != NX_CELL_ERR_BAD_TRANSITION { return 27 }
63 if nx_cell_transition(c, NX_CL_NASCENT, 9000) != NX_CELL_ERR_BAD_TRANSITION { return 28 }
64
65 // 10: attach brane (opaque pointer) works in NASCENT or RUNNING
66 let dummy_ptr: *u8 = (sys_mmap(16)) as *u8
67 let c3: *NxCell = nx_cell_new(300, NX_AC_DEV, 500, mark, b, 1000)
68 if nx_cell_attach_brane(c3, dummy_ptr) != NX_CELL_OK { return 29 }
69 if nx_cell_attach_vacuole(c3, dummy_ptr) != NX_CELL_OK { return 30 }
70 if nx_cell_attach_chromatin(c3, dummy_ptr) != NX_CELL_OK { return 31 }
71
72 // 11: attach to TERMINATED chromatin refused
73 let c4: *NxCell = nx_cell_new(400, NX_AC_DEV, 500, mark, b, 1000)
74 nx_cell_transition(c4, NX_CL_ABORTIVE, 1000)
75 nx_cell_transition(c4, NX_CL_TERMINATED, 1100)
76 if nx_cell_attach_chromatin(c4, dummy_ptr) != NX_CELL_ERR_TERMINATED { return 32 }
77
78 // 12: is_self validates via methyl
79 let c5: *NxCell = nx_cell_new(500, NX_AC_DEV, 500, mark, b, 1000)
80 if nx_cell_is_self(c5, 2000, 5000, 7) != 1 { return 33 }
81 if nx_cell_is_self(c5, 2000, 5000, 999) != 0 { return 34 }
82
83 // 13: state_change_count is monotonic
84 let n_changes: nx_int = nx_cell_state_change_count(c)
85 if n_changes < 5 { return 35 } // RUNNING+YIELD+RUNNING+SUSPEND+RUNNING+ABORT+TERM
86
87 return 0
88}