1 # frozen_string_literal: true
2
3 require "test_helper"
4
5
6 module Umu
7
8 module Test
9
10 module Grammar
11
12 module CoreLanguage
13
14 module Expression
15
16 module Atomic
17
18 module Brackets
19 =begin
20 <round-braket-expression> ::=
21 <unit-expression>
22 | <expression-in-expression>
23 | <prefixed-operator-expression>
24 | <tuple-expression>
25 | <named-tuple-expression>
26 | <functionalized-message-expression>
27 ;
28 =end
29
30 class UnitTest < Minitest::Test
31 =begin
32 <unit-expression> ::= "(" ")" ;
33 =end
34
35 def setup
36 @interp = Api.setup_interpreter
37 end
38
39
40 def test_unit
41 value = Api.eval_expr @interp, "()"
42 assert_instance_of VC::Unit, value
43 end
44 end
45
46
47
48 class NestedExpressionTest < Minitest::Test
49 =begin
50 <expression-in-expression> ::= "(" <expression> ")"
51 =end
52
53 def setup
54 @interp = Api.setup_interpreter
55 end
56
57
58 def test_nested_expression
59 value = Api.eval_expr @interp, "(3)"
60 assert_instance_of VCAN::Int, value
61 assert_equal 3, value.val
62
63 value = Api.eval_expr @interp, "((3))"
64 assert_instance_of VCAN::Int, value
65 assert_equal 3, value.val
66 end
67 end
68
69
70
71 class PrefixedOperatorTest < Minitest::Test
72 =begin
73 <prefixed-operator-expression> ::= "(" <infix-operator> <expression> ")" ;
74 =end
75
76 def setup
77 @interp = Api.setup_interpreter
78 end
79
80
81 def test_prefixed_operator
82 value = Api.eval_expr @interp, "(- 3)"
83 assert_instance_of VC::Fun, value
84
85 value = Api.eval_expr @interp, "(- 3) 4"
86 assert_instance_of VCAN::Int, value
87 assert_equal 1, value.val
88 end
89 end
90
91
92
93 class TupleTest < Minitest::Test
94 =begin
95 <tuple-expression> ::=
96 "(" <expression> "," <expression> { "," <expression> } ")" ;
97 =end
98
99 def setup
100 @interp = Api.setup_interpreter
101 end
102
103
104 def test_pair
105 value = Api.eval_expr @interp, "(@apple, 100)"
106 assert_instance_of VCP::Tuple, value
107 assert_equal 2, value.arity
108 assert_instance_of VCA::Symbol, value.values[0]
109 assert_equal :apple, value.values[0].val
110 assert_instance_of VCAN::Int, value.values[1]
111 assert_equal 100, value.values[1].val
112 end
113
114
115 def test_triple
116 value = Api.eval_expr @interp, '(@apple, 100, "APPLE")'
117 assert_instance_of VCP::Tuple, value
118 assert_equal 3, value.arity
119 assert_instance_of VCA::Symbol, value.values[0]
120 assert_equal :apple, value.values[0].val
121 assert_instance_of VCAN::Int, value.values[1]
122 assert_equal 100, value.values[1].val
123 assert_instance_of VCA::String, value.values[2]
124 assert_equal "APPLE", value.values[2].val
125 end
126 end
127
128
129
130 class NamedTupleTest < Minitest::Test
131 =begin
132 <named-tuple-expression> ::=
133 "(" <named-field> <named-field> { <named-field> } ")" ;
134
135 <named-field> ::= LABEL [ <expression> ] ;
136 =end
137
138 def setup
139 @interp = Api.setup_interpreter
140 end
141
142
143 def test_pair
144 value = Api.eval_expr(
145 @interp,
146 "(key:@apple price:100)"
147 )
148 assert_instance_of VCP::Named, value
149 assert_equal 2, value.arity
150 assert_instance_of VCA::Symbol, value.values[0]
151 assert_equal :apple, value.values[0].val
152 assert_instance_of VCAN::Int, value.values[1]
153 assert_equal 100, value.values[1].val
154 end
155
156
157 def test_triple
158 value = Api.eval_expr(
159 @interp,
160 '(key:@apple price:100 name:"APPLE")'
161 )
162 assert_instance_of VCP::Named, value
163 assert_equal 3, value.arity
164 assert_instance_of VCA::Symbol, value.values[0]
165 assert_equal :apple, value.values[0].val
166 assert_instance_of VCAN::Int, value.values[1]
167 assert_equal 100, value.values[1].val
168 assert_instance_of VCA::String, value.values[2]
169 assert_equal "APPLE", value.values[2].val
170 end
171
172
173 def test_should_not_be_duplicated_labels
174 assert_raises(X::SyntaxError) do
175 Api.eval_expr(
176 @interp,
177 "(key:@apple key:@banana)"
178 )
179 end
180 end
181 end
182
183
184
185 class FunctionalizedMessageTest < Minitest::Test
186 =begin
187 <functionalized-message-expression> ::=
188 "&(" ID ")"
189 | "&(" ID MSG ")"
190 | "&(" <redefinable-infix-operator> ")"
191 =end
192
193 def setup
194 @interp = Api.setup_interpreter
195 end
196
197
198 def test_generic
199 value = Api.eval_expr @interp, "&(show)"
200 assert_instance_of VC::Fun, value
201
202 value = Api.eval_expr @interp, "&(show) 3"
203 assert_instance_of VCA::String, value
204 assert_equal "3", value.val
205 end
206
207
208 def test_specific
209 value = Api.eval_expr @interp, "&(Int.negate)"
210 assert_instance_of VC::Fun, value
211
212 value = Api.eval_expr @interp, "&(Int.negate) 3"
213 assert_instance_of VCAN::Int, value
214 assert_equal( -3, value.val)
215 end
216 end
217
218 end # Umu::Test::Grammar::CoreLanguage::Expression::Atomic::Parentheses
219
220 end # Umu::Test::Grammar::CoreLanguage::Expression::Atomic
221
222 end # Umu::Test::Grammar::CoreLanguage::Expression
223
224 end # Umu::Test::Grammar::CoreLanguage
225
226 end # Umu::Test::Grammar
227
228 end # Umu::Test
229
230 end # Umu