rltk 3.0.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Rakefile +21 -22
- data/lib/rltk/ast.rb +185 -118
- data/lib/rltk/cfg.rb +157 -103
- data/lib/rltk/cg/basic_block.rb +19 -19
- data/lib/rltk/cg/bindings.rb +16 -16
- data/lib/rltk/cg/builder.rb +129 -129
- data/lib/rltk/cg/context.rb +7 -7
- data/lib/rltk/cg/contractor.rb +7 -7
- data/lib/rltk/cg/execution_engine.rb +30 -30
- data/lib/rltk/cg/function.rb +37 -37
- data/lib/rltk/cg/generated_bindings.rb +3932 -3932
- data/lib/rltk/cg/generic_value.rb +17 -17
- data/lib/rltk/cg/instruction.rb +116 -116
- data/lib/rltk/cg/llvm.rb +22 -22
- data/lib/rltk/cg/memory_buffer.rb +7 -7
- data/lib/rltk/cg/module.rb +73 -73
- data/lib/rltk/cg/pass_manager.rb +35 -35
- data/lib/rltk/cg/target.rb +41 -41
- data/lib/rltk/cg/triple.rb +7 -7
- data/lib/rltk/cg/type.rb +75 -75
- data/lib/rltk/cg/value.rb +161 -161
- data/lib/rltk/lexer.rb +57 -57
- data/lib/rltk/lexers/calculator.rb +7 -7
- data/lib/rltk/lexers/ebnf.rb +5 -5
- data/lib/rltk/parser.rb +338 -295
- data/lib/rltk/parsers/infix_calc.rb +7 -7
- data/lib/rltk/parsers/postfix_calc.rb +3 -3
- data/lib/rltk/parsers/prefix_calc.rb +3 -3
- data/lib/rltk/token.rb +13 -13
- data/lib/rltk/version.rb +6 -6
- data/test/cg/tc_basic_block.rb +17 -17
- data/test/cg/tc_control_flow.rb +41 -41
- data/test/cg/tc_function.rb +4 -4
- data/test/cg/tc_generic_value.rb +3 -3
- data/test/cg/tc_instruction.rb +53 -53
- data/test/cg/tc_math.rb +12 -12
- data/test/cg/tc_module.rb +14 -14
- data/test/cg/tc_transforms.rb +11 -11
- data/test/cg/tc_type.rb +12 -12
- data/test/cg/tc_value.rb +35 -35
- data/test/cg/ts_cg.rb +5 -5
- data/test/tc_ast.rb +137 -60
- data/test/tc_cfg.rb +34 -34
- data/test/tc_lexer.rb +42 -42
- data/test/tc_parser.rb +250 -173
- data/test/tc_token.rb +2 -2
- data/test/ts_rltk.rb +8 -8
- metadata +84 -85
- data/lib/rltk/cg/old_generated_bindings.rb +0 -6152
data/test/cg/tc_transforms.rb
CHANGED
@@ -21,46 +21,46 @@ require 'rltk/cg/value'
|
|
21
21
|
class TransformTester < Minitest::Test
|
22
22
|
def setup
|
23
23
|
RLTK::CG::LLVM.init(:X86)
|
24
|
-
|
24
|
+
|
25
25
|
@mod = RLTK::CG::Module.new('Testing Module')
|
26
26
|
@jit = RLTK::CG::JITCompiler.new(@mod)
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
def test_gdce
|
30
30
|
fn0 = @mod.functions.add('fn0', RLTK::CG::VoidType, []) do |fun|
|
31
31
|
fun.linkage = :internal
|
32
|
-
|
32
|
+
|
33
33
|
blocks.append do
|
34
34
|
ret_void
|
35
35
|
end
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
fn1 = @mod.functions.add('fn1', RLTK::CG::VoidType, []) do |fun|
|
39
39
|
fun.linkage = :internal
|
40
|
-
|
40
|
+
|
41
41
|
blocks.append do
|
42
42
|
ret_void
|
43
43
|
end
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
main = @mod.functions.add('main', RLTK::CG::VoidType, []) do
|
47
47
|
blocks.append do
|
48
48
|
call(fn0)
|
49
49
|
ret_void
|
50
50
|
end
|
51
51
|
end
|
52
|
-
|
52
|
+
|
53
53
|
funs = @mod.functions.to_a
|
54
|
-
|
54
|
+
|
55
55
|
assert(funs.include?(fn0))
|
56
56
|
assert(funs.include?(fn1))
|
57
57
|
assert(funs.include?(main))
|
58
|
-
|
58
|
+
|
59
59
|
@mod.pass_manager << :GDCE
|
60
60
|
assert(@mod.pass_manager.run)
|
61
|
-
|
61
|
+
|
62
62
|
funs = @mod.functions.to_a
|
63
|
-
|
63
|
+
|
64
64
|
assert( funs.include?(fn0))
|
65
65
|
assert(!funs.include?(fn1))
|
66
66
|
assert( funs.include?(main))
|
data/test/cg/tc_type.rb
CHANGED
@@ -19,48 +19,48 @@ class TypeTester < Minitest::Test
|
|
19
19
|
@pointee = RLTK::CG::NativeIntType.instance
|
20
20
|
@pointer = RLTK::CG::PointerType.new(@pointee)
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
def test_deferrent_element_type_stuct_type
|
24
24
|
type = RLTK::CG::StructType.new([], 'test_struct')
|
25
25
|
type.element_types = [RLTK::CG::NativeIntType, RLTK::CG::FloatType]
|
26
|
-
|
26
|
+
|
27
27
|
assert_equal(2, type.element_types.size)
|
28
28
|
assert_equal(RLTK::CG::NativeIntType.instance, type.element_types[0])
|
29
29
|
assert_equal(RLTK::CG::FloatType.instance, type.element_types[1])
|
30
|
-
|
30
|
+
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
def test_element_type
|
34
34
|
assert_equal(@pointee, @pointer.element_type)
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
def test_equality
|
38
38
|
assert_equal(RLTK::CG::NativeIntType, RLTK::CG::NativeIntType)
|
39
39
|
refute_equal(RLTK::CG::NativeIntType, RLTK::CG::FloatType)
|
40
|
-
|
40
|
+
|
41
41
|
at0 = RLTK::CG::ArrayType.new(RLTK::CG::NativeIntType, 2)
|
42
42
|
at1 = RLTK::CG::ArrayType.new(RLTK::CG::NativeIntType, 2)
|
43
43
|
at2 = RLTK::CG::ArrayType.new(RLTK::CG::FloatType, 2)
|
44
|
-
|
44
|
+
|
45
45
|
assert_equal(at0, at1)
|
46
46
|
refute_equal(at0, at2)
|
47
47
|
end
|
48
|
-
|
48
|
+
|
49
49
|
def test_kind
|
50
50
|
assert_equal(:pointer, @pointer.kind)
|
51
51
|
assert_equal(:integer, @pointee.kind)
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
def test_named_struct_type
|
55
55
|
type = RLTK::CG::StructType.new([RLTK::CG::NativeIntType, RLTK::CG::FloatType], 'test_struct')
|
56
|
-
|
56
|
+
|
57
57
|
assert_instance_of(RLTK::CG::StructType, type)
|
58
58
|
assert_equal('test_struct', type.name)
|
59
59
|
end
|
60
|
-
|
60
|
+
|
61
61
|
def test_simple_struct_type
|
62
62
|
type = RLTK::CG::StructType.new([RLTK::CG::NativeIntType, RLTK::CG::FloatType])
|
63
|
-
|
63
|
+
|
64
64
|
assert_instance_of(RLTK::CG::StructType, type)
|
65
65
|
assert_equal(2, type.element_types.size)
|
66
66
|
assert_equal(RLTK::CG::NativeIntType.instance, type.element_types[0])
|
data/test/cg/tc_value.rb
CHANGED
@@ -21,130 +21,130 @@ require 'rltk/cg/value'
|
|
21
21
|
class ValueTester < Minitest::Test
|
22
22
|
def setup
|
23
23
|
RLTK::CG::LLVM.init(:X86)
|
24
|
-
|
24
|
+
|
25
25
|
@mod = RLTK::CG::Module.new('Testing Module')
|
26
26
|
@jit = RLTK::CG::JITCompiler.new(@mod)
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
def test_array_values
|
30
30
|
fun = @mod.functions.add('array_function_tester', RLTK::CG::NativeIntType,
|
31
31
|
[RLTK::CG::NativeIntType, RLTK::CG::NativeIntType]) do |fun|
|
32
|
-
|
32
|
+
|
33
33
|
blocks.append do
|
34
34
|
ptr = alloca(RLTK::CG::ArrayType.new(RLTK::CG::NativeIntType, 2))
|
35
|
-
|
35
|
+
|
36
36
|
array = load(ptr)
|
37
37
|
array = insert_value(array, fun.params[0], 0)
|
38
38
|
array = insert_value(array, fun.params[1], 1)
|
39
|
-
|
39
|
+
|
40
40
|
ret(add(extract_value(array, 0), extract_value(array, 1)))
|
41
41
|
end
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
assert_equal(5, @jit.run_function(fun, 2, 3).to_i)
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
def test_constant_array_from_array
|
48
48
|
array = RLTK::CG::ConstantArray.new(RLTK::CG::NativeIntType, [RLTK::CG::NativeInt.new(0), RLTK::CG::NativeInt.new(1)])
|
49
|
-
|
49
|
+
|
50
50
|
assert_instance_of(RLTK::CG::ConstantArray, array)
|
51
51
|
assert_equal(2, array.length)
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
def test_constant_array_from_size
|
55
55
|
array = RLTK::CG::ConstantArray.new(RLTK::CG::NativeIntType, 2) { |i| RLTK::CG::NativeInt.new(i) }
|
56
|
-
|
56
|
+
|
57
57
|
assert_instance_of(RLTK::CG::ConstantArray, array)
|
58
58
|
assert_equal(2, array.length)
|
59
59
|
end
|
60
|
-
|
60
|
+
|
61
61
|
def test_constant_vector_elements
|
62
62
|
fun = @mod.functions.add('constant_vector_elements_tester', RLTK::CG::NativeIntType,
|
63
63
|
[RLTK::CG::NativeIntType, RLTK::CG::NativeIntType]) do |fun|
|
64
|
-
|
64
|
+
|
65
65
|
blocks.append do
|
66
66
|
ptr = alloca(RLTK::CG::VectorType.new(RLTK::CG::NativeIntType, 2))
|
67
|
-
|
67
|
+
|
68
68
|
vector = load(ptr)
|
69
69
|
vector = insert_element(vector, fun.params[0], RLTK::CG::NativeInt.new(0))
|
70
70
|
vector = insert_element(vector, fun.params[1], RLTK::CG::NativeInt.new(1))
|
71
|
-
|
71
|
+
|
72
72
|
ret(add(extract_element(vector, RLTK::CG::NativeInt.new(0)), extract_element(vector, RLTK::CG::NativeInt.new(1))))
|
73
73
|
end
|
74
74
|
end
|
75
|
-
|
75
|
+
|
76
76
|
assert_equal(5, @jit.run_function(fun, 2, 3).to_i)
|
77
77
|
end
|
78
|
-
|
78
|
+
|
79
79
|
def test_constant_vector_from_array
|
80
80
|
vector = RLTK::CG::ConstantVector.new([RLTK::CG::NativeInt.new(0), RLTK::CG::NativeInt.new(1)])
|
81
|
-
|
81
|
+
|
82
82
|
assert_instance_of(RLTK::CG::ConstantVector, vector)
|
83
83
|
assert_equal(2, vector.size)
|
84
84
|
end
|
85
|
-
|
85
|
+
|
86
86
|
def test_constant_vector_from_size
|
87
87
|
vector = RLTK::CG::ConstantVector.new(2) { |i| RLTK::CG::NativeInt.new(i) }
|
88
|
-
|
88
|
+
|
89
89
|
assert_instance_of(RLTK::CG::ConstantVector, vector)
|
90
90
|
assert_equal(2, vector.size)
|
91
91
|
end
|
92
|
-
|
92
|
+
|
93
93
|
def test_constant_vector_shuffle
|
94
94
|
fun = @mod.functions.add('constant_vector_shuffle_tester', RLTK::CG::NativeIntType, Array.new(4, RLTK::CG::NativeIntType)) do |fun|
|
95
95
|
blocks.append do
|
96
96
|
vec_type = RLTK::CG::VectorType.new(RLTK::CG::NativeIntType, 2)
|
97
|
-
|
97
|
+
|
98
98
|
v0 = load(alloca(vec_type))
|
99
99
|
v0 = insert_element(v0, fun.params[0], RLTK::CG::NativeInt.new(0))
|
100
100
|
v0 = insert_element(v0, fun.params[1], RLTK::CG::NativeInt.new(1))
|
101
|
-
|
101
|
+
|
102
102
|
v1 = load(alloca(vec_type))
|
103
103
|
v1 = insert_element(v1, fun.params[2], RLTK::CG::NativeInt.new(0))
|
104
104
|
v1 = insert_element(v1, fun.params[3], RLTK::CG::NativeInt.new(1))
|
105
|
-
|
105
|
+
|
106
106
|
v2 = shuffle_vector(v0, v1, RLTK::CG::ConstantVector.new([RLTK::CG::NativeInt.new(0), RLTK::CG::NativeInt.new(3)]))
|
107
|
-
|
107
|
+
|
108
108
|
ret(add(extract_element(v2, RLTK::CG::NativeInt.new(0)), extract_element(v2, RLTK::CG::NativeInt.new(1))))
|
109
109
|
end
|
110
110
|
end
|
111
|
-
|
111
|
+
|
112
112
|
assert_equal(5, @jit.run_function(fun, 1, 2, 3, 4).to_i)
|
113
113
|
end
|
114
|
-
|
114
|
+
|
115
115
|
def test_constant_struct_from_size_packed
|
116
116
|
struct = RLTK::CG::ConstantStruct.new(2, true) { |i| RLTK::CG::NativeInt.new(i) }
|
117
|
-
|
117
|
+
|
118
118
|
assert_instance_of(RLTK::CG::ConstantStruct, struct)
|
119
119
|
assert_equal(2, struct.operands.size)
|
120
120
|
end
|
121
|
-
|
121
|
+
|
122
122
|
def test_constant_struct_from_size_unpacked
|
123
123
|
struct = RLTK::CG::ConstantStruct.new(2, false) { |i| RLTK::CG::NativeInt.new(i) }
|
124
|
-
|
124
|
+
|
125
125
|
assert_instance_of(RLTK::CG::ConstantStruct, struct)
|
126
126
|
assert_equal(2, struct.operands.size)
|
127
127
|
end
|
128
|
-
|
128
|
+
|
129
129
|
def test_constant_struct_from_values_packed
|
130
130
|
struct = RLTK::CG::ConstantStruct.new([RLTK::CG::NativeInt.new(0), RLTK::CG::NativeInt.new(1)], true)
|
131
|
-
|
131
|
+
|
132
132
|
assert_instance_of(RLTK::CG::ConstantStruct, struct)
|
133
133
|
assert_equal(2, struct.operands.size)
|
134
134
|
end
|
135
|
-
|
135
|
+
|
136
136
|
def test_constant_struct_from_values_unpacked
|
137
137
|
struct = RLTK::CG::ConstantStruct.new([RLTK::CG::NativeInt.new(0), RLTK::CG::NativeInt.new(1)], false)
|
138
|
-
|
138
|
+
|
139
139
|
assert_instance_of(RLTK::CG::ConstantStruct, struct)
|
140
140
|
assert_equal(2, struct.operands.size)
|
141
141
|
end
|
142
|
-
|
142
|
+
|
143
143
|
def test_equality
|
144
144
|
v0 = RLTK::CG::NativeInt.new(0)
|
145
145
|
v1 = RLTK::CG::NativeInt.new(1)
|
146
146
|
v2 = RLTK::CG::NativeInt.new(v0.ptr)
|
147
|
-
|
147
|
+
|
148
148
|
assert_equal(v0, v2)
|
149
149
|
refute_equal(v0, v1)
|
150
150
|
end
|
data/test/cg/ts_cg.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
# Author:
|
2
|
-
# Project:
|
3
|
-
# Date:
|
4
|
-
# Description:
|
5
|
-
#
|
1
|
+
# Author: Chris Wailes <chris.wailes@gmail.com>
|
2
|
+
# Project: Ruby Language Toolkit
|
3
|
+
# Date: 2012/05/04
|
4
|
+
# Description: This file contains test suit for the RLTK LLVM bindigns. It
|
5
|
+
# requires the individual tests from their respective files.
|
6
6
|
|
7
7
|
############
|
8
8
|
# Requires #
|
data/test/tc_ast.rb
CHANGED
@@ -27,35 +27,71 @@ class ASTNodeTester < Minitest::Test
|
|
27
27
|
class CNode < ANode; end
|
28
28
|
|
29
29
|
class DNode < RLTK::ASTNode; end
|
30
|
-
|
30
|
+
|
31
31
|
class ENode < RLTK::ASTNode
|
32
32
|
value :str, String
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
class FNode < ENode
|
36
36
|
child :c, [ENode]
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
class SNode < RLTK::ASTNode
|
40
40
|
value :string, String
|
41
|
-
|
41
|
+
|
42
42
|
child :left, SNode
|
43
43
|
child :right, SNode
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
class VNode < RLTK::ASTNode
|
47
47
|
value :a, Integer
|
48
48
|
value :b, Integer
|
49
49
|
end
|
50
|
-
|
50
|
+
|
51
|
+
class ONode < RLTK::ASTNode
|
52
|
+
value :a, Integer
|
53
|
+
value :b, Integer, true
|
54
|
+
value :c, Integer
|
55
|
+
end
|
56
|
+
|
57
|
+
class ValuesFirstNode < RLTK::ASTNode
|
58
|
+
child :b, ValuesFirstNode
|
59
|
+
value :a, Integer
|
60
|
+
end
|
61
|
+
|
62
|
+
class ChildrenFirstNode < RLTK::ASTNode
|
63
|
+
order :children
|
64
|
+
|
65
|
+
value :b, Integer
|
66
|
+
child :a, ChildrenFirstNode
|
67
|
+
end
|
68
|
+
|
69
|
+
class DefOrderNode < RLTK::ASTNode
|
70
|
+
order :def
|
71
|
+
|
72
|
+
value :a, Integer
|
73
|
+
child :b, DefOrderNode
|
74
|
+
value :c, Float
|
75
|
+
end
|
76
|
+
|
77
|
+
class CustomOrderNode < RLTK::ASTNode
|
78
|
+
custom_order :a, :b, :c, :d
|
79
|
+
|
80
|
+
child :b, CustomOrderNode
|
81
|
+
child :d, CustomOrderNode
|
82
|
+
|
83
|
+
value :a, Integer
|
84
|
+
value :c, String
|
85
|
+
end
|
86
|
+
|
51
87
|
def setup
|
52
88
|
@leaf0 = CNode.new
|
53
89
|
@tree0 = ANode.new(BNode.new(@leaf0), BNode.new)
|
54
|
-
|
90
|
+
|
55
91
|
@tree1 = ANode.new(BNode.new(CNode.new), BNode.new)
|
56
92
|
@tree2 = ANode.new(BNode.new, BNode.new(CNode.new))
|
57
93
|
@tree3 = ANode.new(CNode.new(BNode.new), CNode.new)
|
58
|
-
|
94
|
+
|
59
95
|
@tree4 = SNode.new('F',
|
60
96
|
SNode.new('B',
|
61
97
|
SNode.new('A'),
|
@@ -71,22 +107,22 @@ class ASTNodeTester < Minitest::Test
|
|
71
107
|
)
|
72
108
|
)
|
73
109
|
)
|
74
|
-
|
110
|
+
|
75
111
|
@tree5 = FNode.new('one',
|
76
112
|
[FNode.new('two',
|
77
113
|
[ENode.new('three')]),
|
78
114
|
ENode.new('four')])
|
79
|
-
|
115
|
+
|
80
116
|
@tree6 = FNode.new('one',
|
81
117
|
[FNode.new('two',
|
82
118
|
[ENode.new('three')]),
|
83
119
|
ENode.new('four')])
|
84
|
-
|
120
|
+
|
85
121
|
@tree7 = FNode.new('one!',
|
86
122
|
[FNode.new('two!',
|
87
123
|
[ENode.new('three!')]),
|
88
124
|
ENode.new('four!')])
|
89
|
-
|
125
|
+
|
90
126
|
@bc_proc = Proc.new do |n|
|
91
127
|
case n
|
92
128
|
when BNode then CNode.new(n.left, n.right)
|
@@ -95,125 +131,125 @@ class ASTNodeTester < Minitest::Test
|
|
95
131
|
end
|
96
132
|
end
|
97
133
|
end
|
98
|
-
|
134
|
+
|
99
135
|
def test_children
|
100
136
|
node = ANode.new
|
101
|
-
|
137
|
+
|
102
138
|
assert_equal(node.children, [nil, nil])
|
103
|
-
|
139
|
+
|
104
140
|
node.children = (expected_children = [BNode.new, CNode.new])
|
105
|
-
|
141
|
+
|
106
142
|
assert_equal(node.children, expected_children)
|
107
|
-
|
143
|
+
|
108
144
|
node.children = (expected_children = {:left => CNode.new, :right => BNode.new})
|
109
|
-
|
145
|
+
|
110
146
|
assert_equal(node.children(Hash), expected_children)
|
111
147
|
end
|
112
|
-
|
148
|
+
|
113
149
|
def test_copy
|
114
150
|
new_tree = @tree5.copy
|
115
|
-
|
151
|
+
|
116
152
|
assert_equal(@tree5, new_tree)
|
117
153
|
end
|
118
|
-
|
154
|
+
|
119
155
|
def test_dump
|
120
156
|
tree0_string = @tree0.dump
|
121
|
-
|
157
|
+
|
122
158
|
reloaded_tree = Marshal.load(tree0_string)
|
123
|
-
|
159
|
+
|
124
160
|
assert_equal(@tree0, reloaded_tree)
|
125
161
|
end
|
126
|
-
|
162
|
+
|
127
163
|
def test_each
|
128
164
|
# Test pre-order
|
129
165
|
nodes = []
|
130
166
|
expected = ['F', 'B', 'A', 'D', 'C', 'E', 'G', 'I', 'H']
|
131
167
|
@tree4.each(:pre) { |n| nodes << n.string }
|
132
|
-
|
168
|
+
|
133
169
|
assert_equal(expected, nodes)
|
134
|
-
|
170
|
+
|
135
171
|
# Test post-order
|
136
172
|
nodes = []
|
137
173
|
expected = ['A', 'C', 'E', 'D', 'B', 'H', 'I', 'G', 'F']
|
138
174
|
@tree4.each(:post) { |n| nodes << n.string }
|
139
|
-
|
175
|
+
|
140
176
|
assert_equal(expected, nodes)
|
141
|
-
|
177
|
+
|
142
178
|
# Test level-order
|
143
179
|
nodes = []
|
144
180
|
expected = ['F', 'B', 'G', 'A', 'D', 'I', 'C', 'E', 'H']
|
145
181
|
@tree4.each(:level) { |n| nodes << n.string }
|
146
|
-
|
182
|
+
|
147
183
|
assert_equal(expected, nodes)
|
148
|
-
|
184
|
+
|
149
185
|
# Test iteration with array children.
|
150
|
-
|
186
|
+
|
151
187
|
res = ''
|
152
188
|
@tree5.each(:pre) { |node| res += ' ' + node.str }
|
153
189
|
assert_equal(res, ' one two three four')
|
154
|
-
|
190
|
+
|
155
191
|
res = ''
|
156
192
|
@tree5.each(:post) { |node| res += ' ' + node.str }
|
157
193
|
assert_equal(res, ' three two four one')
|
158
|
-
|
194
|
+
|
159
195
|
res = ''
|
160
196
|
@tree5.each(:level) { |node| res += ' ' + node.str }
|
161
197
|
assert_equal(res, ' one two four three')
|
162
198
|
end
|
163
|
-
|
199
|
+
|
164
200
|
def test_equal
|
165
201
|
assert_equal(@tree0, @tree1)
|
166
202
|
refute_equal(@tree0, @tree2)
|
167
203
|
end
|
168
|
-
|
204
|
+
|
169
205
|
def test_initialize
|
170
206
|
assert_raises(AbstractClassError) { RLTK::ASTNode.new }
|
171
|
-
|
207
|
+
|
172
208
|
node = ENode.new { self.str = 'hello world' }
|
173
209
|
assert_equal('hello world', node.str)
|
174
210
|
end
|
175
|
-
|
211
|
+
|
176
212
|
def test_map
|
177
213
|
mapped_tree = @tree1.map(&@bc_proc)
|
178
|
-
|
214
|
+
|
179
215
|
assert_equal(@tree0, @tree1)
|
180
216
|
assert_equal(@tree3, mapped_tree)
|
181
|
-
|
217
|
+
|
182
218
|
mapped_tree = @tree5.map do |c|
|
183
219
|
c.str += '!'
|
184
|
-
|
220
|
+
|
185
221
|
c
|
186
222
|
end
|
187
|
-
|
223
|
+
|
188
224
|
assert_equal(@tree6, @tree5)
|
189
225
|
assert_equal(@tree7, mapped_tree)
|
190
226
|
end
|
191
|
-
|
227
|
+
|
192
228
|
def test_map!
|
193
229
|
tree1_clone = @tree1.clone
|
194
230
|
tree1_clone.map!(&@bc_proc)
|
195
|
-
|
231
|
+
|
196
232
|
refute_equal(@tree1, tree1_clone)
|
197
233
|
assert_equal(@tree3, tree1_clone)
|
198
|
-
|
234
|
+
|
199
235
|
replace_node = BNode.new
|
200
236
|
replace_node = replace_node.map!(&@bc_proc)
|
201
|
-
|
237
|
+
|
202
238
|
assert_equal(CNode.new, replace_node)
|
203
|
-
|
239
|
+
|
204
240
|
mapped_tree = @tree5.map! do |c|
|
205
241
|
c.str += '!'
|
206
|
-
|
242
|
+
|
207
243
|
c
|
208
244
|
end
|
209
|
-
|
245
|
+
|
210
246
|
refute_equal(@tree6, @tree5)
|
211
247
|
assert_equal(@tree7, @tree5)
|
212
248
|
end
|
213
|
-
|
249
|
+
|
214
250
|
def test_notes
|
215
251
|
node = ANode.new
|
216
|
-
|
252
|
+
|
217
253
|
assert_nil(node[:a])
|
218
254
|
assert_equal(node[:a] = :b, :b)
|
219
255
|
assert_equal(node.note?(:a), true)
|
@@ -221,35 +257,76 @@ class ASTNodeTester < Minitest::Test
|
|
221
257
|
assert_equal(node.delete_note(:a), :b)
|
222
258
|
assert_nil(node[:a])
|
223
259
|
end
|
224
|
-
|
260
|
+
|
261
|
+
def test_omit
|
262
|
+
onode = ONode.new(1, 3)
|
263
|
+
|
264
|
+
assert_equal(1, onode.a)
|
265
|
+
assert_nil(onode.b)
|
266
|
+
assert_equal(3, onode.c)
|
267
|
+
end
|
268
|
+
|
225
269
|
def test_one_definition_rule
|
226
270
|
asserter = self
|
227
|
-
|
271
|
+
|
228
272
|
Class.new(ANode) do
|
229
273
|
asserter.assert_raises(ArgumentError) { child :left, ANode }
|
230
274
|
end
|
231
|
-
|
275
|
+
|
232
276
|
Class.new(ENode) do
|
233
277
|
asserter.assert_raises(ArgumentError) { value :str, String }
|
234
278
|
end
|
235
279
|
end
|
236
|
-
|
280
|
+
|
281
|
+
def test_ordering
|
282
|
+
vfn = ValuesFirstNode.new(42, ValuesFirstNode.new)
|
283
|
+
|
284
|
+
a, b = vfn.destructure(2)
|
285
|
+
|
286
|
+
assert_equal(42, a)
|
287
|
+
assert_instance_of(ValuesFirstNode, b)
|
288
|
+
|
289
|
+
cfn = ChildrenFirstNode.new(ChildrenFirstNode.new, 42)
|
290
|
+
|
291
|
+
a, b = cfn.destructure(2)
|
292
|
+
|
293
|
+
assert_instance_of(ChildrenFirstNode, a)
|
294
|
+
assert_equal(42, b)
|
295
|
+
|
296
|
+
dfn = DefOrderNode.new(4, DefOrderNode.new, 2.0)
|
297
|
+
|
298
|
+
a, b, c = dfn.destructure(3)
|
299
|
+
|
300
|
+
assert_equal(4, a)
|
301
|
+
assert_instance_of(DefOrderNode, b)
|
302
|
+
assert_equal(2.0, c)
|
303
|
+
|
304
|
+
con = CustomOrderNode.new(42, CustomOrderNode.new, 'foo')
|
305
|
+
|
306
|
+
a, b, c, d = con.destructure(4)
|
307
|
+
|
308
|
+
assert_equal(42, a)
|
309
|
+
assert_instance_of(CustomOrderNode, b)
|
310
|
+
assert_equal('foo', c)
|
311
|
+
assert_nil(d)
|
312
|
+
end
|
313
|
+
|
237
314
|
def test_root
|
238
315
|
assert_same(@tree0, @tree0.root)
|
239
316
|
assert_same(@tree0, @leaf0.root)
|
240
317
|
end
|
241
|
-
|
318
|
+
|
242
319
|
def test_value
|
243
320
|
node = VNode.new
|
244
|
-
|
321
|
+
|
245
322
|
assert_equal(node.values, [nil, nil])
|
246
|
-
|
323
|
+
|
247
324
|
node.values = (expected_values = [42, 1984])
|
248
|
-
|
325
|
+
|
249
326
|
assert_equal(node.values, expected_values)
|
250
|
-
|
327
|
+
|
251
328
|
node.values = (expected_values = {:a => 1984, :b => 42})
|
252
|
-
|
329
|
+
|
253
330
|
assert_equal(node.values(Hash), expected_values)
|
254
331
|
end
|
255
332
|
end
|