-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest_iterators.lang
77 lines (62 loc) · 1.66 KB
/
test_iterators.lang
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
lang.name = Lang Tests (Iterators)
lang.version = v1.0.0
lang.test = 1
# Load helper library
linker.bindLibrary(helper_lib.lang)
# Preparation
$array $= [1, 2, 3, 4]
$text $= "ABC"
struct &Data {
$a
$b
$c
$d
$e
}
$data $= &Data(1, "test", [0, 1], "val", 4.2f)
class &LoopingIterator {
-final:$value{ARRAY}
-$index{INT}
+construct = ($value{ARRAY}):{VOID} -> {
::$value $= $value
::$index $= 0
}
+op:iter = ():{OBJECT} -> {
return &this
}
+op:hasNext = ():{INT} -> {
return 1
}
+op:next = () -> {
if(::$index >= @::$value) {
::$index $= 0
}
$value
if(::$value ~~ $LANG_TYPE_STRUCT) {
$members $= fn.structGetMemberNames(::$value)
if(fn.structIsDefinition(::$value)) {
$value $= $members[::$index]
}else {
$member $= $members[::$index]
$value $= &Pair($member, ::$value[$member])
}
}else {
$value $= ::$value[::$index]
}
::$index += 1
return $value
}
}
# Tests
fn.testUnit(Iterators)
{
fn.testSubUnit("&BasicIterator")
parser.op(fp.testAssertIterator($array, [1, 2, 3, 4]))
parser.op(fp.testAssertIterator($text, [A, B, C]))
parser.op(fp.testAssertIterator(&Data, ["$a", "$b", "$c", "$d", "$e"]))
parser.op(fp.testAssertIterator($data, [&Pair("$a", 1), &Pair("$b", "test"), &Pair("$c", [0, 1]), &Pair("$d", "val"), &Pair("$e", 4.2f)]))
}
{
fn.testSubUnit("Custom infinite looping iterator")
parser.op(fp.testAssertIterator(&LoopingIterator([1, 2, 3]), [1, 2, 3, 1, 2, 3, 1], 7))
}