code wiki / (root) / nx_iterator_test.nx

nx_iterator_test.nx source

↩ module page · 123 lines · 4565 B

1// nx_iterator_test.nx -- smoke for composable iteration. 2 3import "nx_syscalls.nx" 4import "nx_tier.nx" 5import "nx_array_ops.nx" 6import "nx_iterator.nx" 7 8func main() -> nx_int { 9 let v_buf: *nx_int = (sys_mmap(NX_SIZEOF_NX_INT)) as *nx_int 10 11 // === Test 1: range iterator basic walk === 12 let r: *Iterator = nx_iter_range(0, 5) 13 var n: nx_int = 0 14 var sum: nx_int = 0 15 while nx_iter_next(r, v_buf) == 1 { 16 sum = sum + v_buf[0] 17 n = n + 1 18 } 19 if n != 5 { return 1 } 20 if sum != 10 { return 2 } // 0+1+2+3+4 21 22 // === Test 2: array iterator === 23 let arr: *nx_int = (sys_mmap(8 * NX_SIZEOF_NX_INT)) as *nx_int 24 arr[0] = 10 25 arr[1] = 20 26 arr[2] = 30 27 arr[3] = 40 28 let a_it: *Iterator = nx_iter_array(arr, 4) 29 if nx_iter_count(a_it) != 4 { return 10 } 30 31 // === Test 3: filter combinator === 32 // 0..10 filtered to evens -> [0, 2, 4, 6, 8] 33 let r3: *Iterator = nx_iter_range(0, 10) 34 let f3: *Iterator = nx_iter_filter(r3, NX_FILTER_EVEN, 0) 35 let out3: *nx_int = (sys_mmap(8 * NX_SIZEOF_NX_INT)) as *nx_int 36 let n3: nx_int = nx_iter_collect(f3, out3, 8) 37 if n3 != 5 { return 20 } 38 if out3[0] != 0 { return 21 } 39 if out3[1] != 2 { return 22 } 40 if out3[2] != 4 { return 23 } 41 if out3[3] != 6 { return 24 } 42 if out3[4] != 8 { return 25 } 43 44 // === Test 4: map combinator === 45 // 1..4 squared -> [1, 4, 9] 46 let r4: *Iterator = nx_iter_range(1, 4) 47 let m4: *Iterator = nx_iter_map(r4, NX_MAP_SQUARE, 0) 48 let out4: *nx_int = (sys_mmap(8 * NX_SIZEOF_NX_INT)) as *nx_int 49 let n4: nx_int = nx_iter_collect(m4, out4, 8) 50 if n4 != 3 { return 30 } 51 if out4[0] != 1 { return 31 } 52 if out4[1] != 4 { return 32 } 53 if out4[2] != 9 { return 33 } 54 55 // === Test 5: take combinator (early termination) === 56 let r5: *Iterator = nx_iter_range(0, 1000) 57 let t5: *Iterator = nx_iter_take(r5, 5) 58 if nx_iter_count(t5) != 5 { return 40 } 59 60 // === Test 6: skip combinator === 61 let r6: *Iterator = nx_iter_range(0, 10) 62 let s6: *Iterator = nx_iter_skip(r6, 3) 63 let out6: *nx_int = (sys_mmap(16 * NX_SIZEOF_NX_INT)) as *nx_int 64 let n6: nx_int = nx_iter_collect(s6, out6, 16) 65 if n6 != 7 { return 50 } 66 if out6[0] != 3 { return 51 } 67 if out6[6] != 9 { return 52 } 68 69 // === Test 7: chain combinator (concat two iterators) === 70 let a7: *Iterator = nx_iter_range(0, 3) // [0, 1, 2] 71 let b7: *Iterator = nx_iter_range(10, 13) // [10, 11, 12] 72 let c7: *Iterator = nx_iter_chain(a7, b7) 73 let out7: *nx_int = (sys_mmap(16 * NX_SIZEOF_NX_INT)) as *nx_int 74 let n7: nx_int = nx_iter_collect(c7, out7, 16) 75 if n7 != 6 { return 60 } 76 if out7[0] != 0 { return 61 } 77 if out7[2] != 2 { return 62 } 78 if out7[3] != 10 { return 63 } 79 if out7[5] != 12 { return 64 } 80 81 // === Test 8: pipeline -- range -> filter -> map -> take === 82 // The user's "loops within loops" anti-pattern expressed as ONE loop. 83 // 0..100 -> evens -> squared -> first 5 -> [0, 4, 16, 36, 64] 84 let p8a: *Iterator = nx_iter_range(0, 100) 85 let p8b: *Iterator = nx_iter_filter(p8a, NX_FILTER_EVEN, 0) 86 let p8c: *Iterator = nx_iter_map(p8b, NX_MAP_SQUARE, 0) 87 let p8d: *Iterator = nx_iter_take(p8c, 5) 88 let out8: *nx_int = (sys_mmap(8 * NX_SIZEOF_NX_INT)) as *nx_int 89 let n8: nx_int = nx_iter_collect(p8d, out8, 8) 90 if n8 != 5 { return 70 } 91 if out8[0] != 0 { return 71 } // 0^2 92 if out8[1] != 4 { return 72 } // 2^2 93 if out8[2] != 16 { return 73 } // 4^2 94 if out8[3] != 36 { return 74 } // 6^2 95 if out8[4] != 64 { return 75 } // 8^2 96 97 // === Test 9: consumer operations === 98 // sum of 1..6 = 15 99 let r9: *Iterator = nx_iter_range(1, 6) 100 if nx_iter_sum(r9) != 15 { return 80 } 101 102 // min/max 103 let r9b: *Iterator = nx_iter_range(5, 11) 104 if nx_iter_min(r9b) != 5 { return 81 } 105 let r9c: *Iterator = nx_iter_range(5, 11) 106 if nx_iter_max(r9c) != 10 { return 82 } 107 108 // reduce PRODUCT 1..5 = 24 109 let r9d: *Iterator = nx_iter_range(1, 5) 110 if nx_iter_reduce(r9d, NX_REDUCE_PRODUCT) != 24 { return 83 } 111 112 // === Test 10: empty range === 113 let e: *Iterator = nx_iter_range(5, 5) 114 if nx_iter_next(e, v_buf) != 0 { return 90 } 115 if nx_iter_count(e) != 0 { return 91 } 116 117 // === Test 11: sealed-enum validity === 118 if nx_iter_kind_is_valid(NX_ITER_KIND_RANGE) != 1 { return 100 } 119 if nx_iter_kind_is_valid(NX_ITER_KIND_CHAINED) != 1 { return 101 } 120 if nx_iter_kind_is_valid(99) != 0 { return 102 } 121 122 return 0 123}