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 Pattern
15
16 class NamedTupleTest < Minitest::Test
17 =begin
18 <named-tuple-pattern> ::=
19 "("
20 <field-pattern> { <field-pattern> }
21 ")"
22 ;
23
24 <field-pattern> ::= LABEL [ <variable-pattern> ] ;
25
26 /* <variable-pattern> ::= ... ; See Variable */
27 =end
28 def setup
29 @interp = Api.setup_interpreter
30 end
31
32
33 def test_value
34 interp = Api.eval_decls @interp, <<-EOS
35 val (name:n price:p) = (name:@Apple price:300)
36 EOS
37
38 value = Api.eval_expr interp, "n"
39 assert_instance_of VCA::Symbol, value
40 assert_equal :Apple, value.val
41
42 value = Api.eval_expr interp, "p"
43 assert_instance_of VCAN::Int, value
44 assert_equal 300, value.val
45 end
46
47
48 def test_value_swap
49 interp = Api.eval_decls @interp, <<-EOS
50 val (price:p name:n) = (name:@Apple price:300)
51 EOS
52
53 value = Api.eval_expr interp, "p"
54 assert_instance_of VCAN::Int, value
55 assert_equal 300, value.val
56
57 value = Api.eval_expr interp, "n"
58 assert_instance_of VCA::Symbol, value
59 assert_equal :Apple, value.val
60 end
61
62
63 def test_value_less_than_rhs
64 interp = Api.eval_decls @interp, <<-EOS
65 val (name:n) = (name:@Apple price:300)
66 EOS
67
68 value = Api.eval_expr interp, "n"
69 assert_instance_of VCA::Symbol, value
70 assert_equal :Apple, value.val
71 end
72
73
74 def test_value_more_than_rhs
75 assert_raises(X::SelectionError) do
76 Api.eval_decls @interp, <<-EOS
77 val (name:n price:p area:a) = (name:@Apple price:300)
78 EOS
79 end
80 end
81
82
83 def test_value_triple
84 interp = Api.eval_decls @interp, <<-EOS
85 val (name:n price:p area:a) =
86 (name:@Apple price:300 area:"Aomori")
87 EOS
88
89 value = Api.eval_expr interp, "n"
90 assert_instance_of VCA::Symbol, value
91 assert_equal :Apple, value.val
92
93 value = Api.eval_expr interp, "p"
94 assert_instance_of VCAN::Int, value
95 assert_equal 300, value.val
96
97 value = Api.eval_expr interp, "a"
98 assert_instance_of VCA::String, value
99 assert_equal "Aomori", value.val
100 end
101
102
103 def test_value_none_variable
104 interp = Api.eval_decls @interp, <<-EOS
105 val (name: price:) = (name:@Apple price:300)
106 EOS
107
108 value = Api.eval_expr interp, "name"
109 assert_instance_of VCA::Symbol, value
110 assert_equal :Apple, value.val
111
112 value = Api.eval_expr interp, "price"
113 assert_instance_of VCAN::Int, value
114 assert_equal 300, value.val
115 end
116
117
118 def test_value_type
119 interp = Api.eval_decls @interp, <<-EOS
120 val (name:n : Symbol price:p : Int) =
121 (name:@Apple price:300)
122 EOS
123
124 value = Api.eval_expr interp, "n"
125 assert_instance_of VCA::Symbol, value
126 assert_equal :Apple, value.val
127
128 value = Api.eval_expr interp, "p"
129 assert_instance_of VCAN::Int, value
130 assert_equal 300, value.val
131 end
132
133
134 def test_should_be_kind_of_specified_type_in_declaration
135 assert_raises(X::TypeError) do
136 Api.eval_decls @interp, <<-EOS
137 val (name:n : Unit price:p : Int) =
138 (name:@Apple price:300)
139 EOS
140 end
141 end
142
143
144 def test_lambda
145 value = Api.eval_expr @interp, <<-EOS
146 { (x:x y:y) -> x + y } (x:3 y:4)
147 EOS
148 assert_instance_of VCAN::Int, value
149 assert_equal 7, value.val
150 end
151
152
153 def test_lambda_swap
154 value = Api.eval_expr @interp, <<-EOS
155 { (y:y x:x) -> x + y } (x:3 y:4)
156 EOS
157 assert_instance_of VCAN::Int, value
158 assert_equal 7, value.val
159 end
160
161
162 def test_lambda_less_than_param
163 value = Api.eval_expr @interp, <<-EOS
164 { (x:x) -> x + 5 } (x:3 y:4)
165 EOS
166 assert_instance_of VCAN::Int, value
167 assert_equal 8, value.val
168 end
169
170
171 def test_lambda_more_than_param
172 assert_raises(X::SelectionError) do
173 Api.eval_expr @interp, <<-EOS
174 { (x:x y:y z:z) -> x + y + z } (x:3 y:4)
175 EOS
176 end
177 end
178
179
180 def test_lambda_triple
181 value = Api.eval_expr @interp, <<-EOS
182 { (x:x y:y z:z) -> x + y + z } (x:3 y:4 z:5)
183 EOS
184 assert_instance_of VCAN::Int, value
185 assert_equal 12, value.val
186 end
187
188
189 def test_lambda_none_variable
190 value = Api.eval_expr @interp, <<-EOS
191 { (x: y:) -> x + y } (x:3 y:4)
192 EOS
193 assert_instance_of VCAN::Int, value
194 assert_equal 7, value.val
195 end
196
197
198 def test_lambda_type
199 value = Api.eval_expr @interp, <<-EOS
200 { (x:x : Int y:y : Int) -> x + y } (x:3 y:4)
201 EOS
202 assert_instance_of VCAN::Int, value
203 assert_equal 7, value.val
204 end
205
206
207 def test_should_be_kind_of_specified_type_in_lambda
208 assert_raises(X::TypeError) do
209 Api.eval_expr @interp, <<-EOS
210 { (x:x : String y:y : Int) -> x + y } (x:3 y:4)
211 EOS
212 end
213 end
214 end
215
216 end # Umu::Test::Grammar::CoreLanguage::Pattern
217
218 end # Umu::Test::Grammar::CoreLanguage
219
220 end # Umu::Test::Grammar
221
222 end # Umu::Test
223
224 end # Umu