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}