code wiki / (root) / nx_cell_test.nx

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}