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 SendOperator
17 =begin
18 <send-expression> ::=
19 <apply-expression> { <message> } ;
20
21 <message> ::=
22 <basic-message>
23 | <infix-message>
24 | <apply-message>
25 | <keyword-message>
26 ;
27 =end
28
29 class BasicMessageTest < Minitest::Test
30 =begin
31 <basic-message> ::=
32 MSG { <product-expression> }
33 | ".(" ID { <product-expression> } ")"
34 ;
35 =end
36 def setup
37 @interp = Api.setup_interpreter
38 end
39
40
41 def test_basic_message_1
42 value = Api.eval_expr @interp, "3.show"
43 assert_instance_of VCA::String, value
44 assert_equal "3", value.val
45
46 value = Api.eval_expr @interp, "1.to 9"
47 assert_instance_of VCM::Interval, value
48 assert_equal 1, value.current_value.val
49 assert_equal 9, value.stop_value.val
50
51 value = Api.eval_expr @interp, "1.to-by 9 2"
52 assert_instance_of VCM::Interval, value
53 assert_equal 1, value.current_value.val
54 assert_equal 9, value.stop_value.val
55 assert_equal 2, value.step_value.val
56 end
57
58
59 def test_basic_message_2
60 value = Api.eval_expr @interp, "3.(show)"
61 assert_instance_of VCA::String, value
62 assert_equal "3", value.val
63
64 value = Api.eval_expr @interp, "1.(to 9)"
65 assert_instance_of VCM::Interval, value
66 assert_equal 1, value.current_value.val
67 assert_equal 9, value.stop_value.val
68
69 value = Api.eval_expr @interp, "1.(to-by 9 2)"
70 assert_instance_of VCM::Interval, value
71 assert_equal 1, value.current_value.val
72 assert_equal 9, value.stop_value.val
73 assert_equal 2, value.step_value.val
74 end
75
76
77 def test_message_parameters_should_follow_the_signature
78 assert_raises(X::TypeError) do
79 Api.eval_expr @interp, "1.(to @foo)"
80 end
81
82 assert_raises(X::TypeError) do
83 Api.eval_expr @interp, "1.(to-by @foo @bar)"
84 end
85 end
86 end
87
88
89
90 class InfixMessageTest < Minitest::Test
91 =begin
92 <basic-message> ::=
93 "." <redefinable-infix-operator> <product-expression>
94 | ".(" <redefinable-infix-operator> <product-expression> ")"
95 ;
96 =end
97 def setup
98 @interp = Api.setup_interpreter
99 end
100
101
102 def test_infix_oprrator_message_1
103 value = Api.eval_expr @interp, "3.+ 4"
104 assert_instance_of VCAN::Int, value
105 assert_equal 7, value.val
106 end
107
108
109 def test_infix_oprrator_message_2
110 value = Api.eval_expr @interp, "3.(+ 4)"
111 assert_instance_of VCAN::Int, value
112 assert_equal 7, value.val
113 end
114
115
116 def test_message_parameters_should_follow_the_signature
117 assert_raises(X::TypeError) do
118 Api.eval_expr @interp, "3.+ @foo"
119 end
120 end
121 end
122
123
124
125 class ApplyMessageTest < Minitest::Test
126 =begin
127 <basic-message> ::=
128 ".[" <expression> { "," <expression> "]" ;
129 =end
130 def setup
131 @interp = Api.setup_interpreter
132 end
133
134
135 def test_apply_message_unary
136 interp = Api.eval_decls @interp, "val xs = [3, 4, 5]"
137
138 value = Api.eval_expr interp, "xs.[1]"
139 assert_instance_of VCAN::Int, value
140 assert_equal 4, value.val
141 end
142
143
144 def test_apply_message_binary
145 value = Api.eval_expr @interp, "(+).[3, 4]"
146 assert_instance_of VCAN::Int, value
147 assert_equal 7, value.val
148 end
149
150
151 def test_message_parameters_should_follow_the_signature
152 interp = Api.eval_decls @interp, "val xs = [3, 4, 5]"
153
154 assert_raises(X::TypeError) do
155 Api.eval_expr interp, "xs.[@foo]"
156 end
157
158 assert_raises(X::TypeError) do
159 Api.eval_expr interp, "(+).[@foo, @bar]"
160 end
161 end
162 end
163
164
165
166 class KeywordMessageTest < Minitest::Test
167 =begin
168 <basic-message> ::=
169 ".(" <named-field> { <named-field> } ")" ;
170
171 /* <named-field> ::= ... ; See NamedTupleExpressionTest */
172 =end
173 def setup
174 @interp = Api.setup_interpreter
175 end
176
177
178 def test_keyword_message
179 value = Api.eval_expr @interp, "1.(to:9)"
180 assert_instance_of VCM::Interval, value
181 assert_equal 1, value.current_value.val
182 assert_equal 9, value.stop_value.val
183
184 value = Api.eval_expr @interp, "1.(to:9 by:2)"
185 assert_instance_of VCM::Interval, value
186 assert_equal 1, value.current_value.val
187 assert_equal 9, value.stop_value.val
188 assert_equal 2, value.step_value.val
189 end
190
191
192 def test_message_parameters_should_follow_the_signature
193 assert_raises(X::TypeError) do
194 Api.eval_expr @interp, "1.(to:@foo)"
195 end
196
197 assert_raises(X::TypeError) do
198 Api.eval_expr @interp, "1.(to:@foo by:@bar)"
199 end
200 end
201 end
202
203 end # Umu::Test::Grammar::CoreLanguage::Expression::SendOperator
204
205 end # Umu::Test::Grammar::CoreLanguage::Expression
206
207 end # Umu::Test::Grammar::CoreLanguage
208
209 end # Umu::Test::Grammar
210
211 end # Umu::Test
212
213 end # Umu