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 module Variable
17 =begin
18 <variable-pattern> ::=
19 <basic-variable-pattern>
20 | <wildcard-pattern>
21 | <braket-variable-pattern>
22 | <infix-operator-pattern>
23 ;
24 =end
25
26 class BasicTest < Minitest::Test
27 =begin
28 <basic-variable-pattern> ::= ID [ ":" ID ] ; ;
29 =end
30 def setup
31 @interp = Api.setup_interpreter
32 end
33
34
35 def test_value
36 interp = Api.eval_decls @interp, "val x = 3"
37
38 value = Api.eval_expr interp, "x"
39 assert_instance_of VCAN::Int, value
40 assert_equal 3, value.val
41 end
42
43
44 def test_value_with_type
45 interp = Api.eval_decls @interp, "val x : Int = 3"
46
47 value = Api.eval_expr interp, "x"
48 assert_instance_of VCAN::Int, value
49 assert_equal 3, value.val
50 end
51
52
53 def test_should_be_kind_of_specified_type_in_declaration
54 assert_raises(X::TypeError) do
55 Api.eval_decls @interp, "val x : String = 3"
56 end
57 end
58
59
60 def test_lambda
61 value = Api.eval_expr @interp, "{ x -> x + 4 } 3"
62 assert_instance_of VCAN::Int, value
63 assert_equal 7, value.val
64 end
65
66
67 def test_lambda_with_type
68 value = Api.eval_expr @interp, "{ x : Int -> x + 4 } 3"
69 assert_instance_of VCAN::Int, value
70 assert_equal 7, value.val
71 end
72
73
74 def test_should_be_kind_of_specified_type_in_lambda
75 assert_raises(X::TypeError) do
76 Api.eval_expr @interp, "{ x : String -> x + 4 } 3"
77 end
78 end
79 end
80
81
82
83 class WildcardTest < Minitest::Test
84 =begin
85 <wildcard-pattern> ::= "_" [ ":" ID ] ;
86 =end
87 def setup
88 @interp = Api.setup_interpreter
89 end
90
91
92 def test_value
93 assert (
94 Api.eval_decls @interp, "val _ = 3"
95 )
96 end
97
98
99 def test_value_with_type
100 assert (
101 Api.eval_decls @interp, "val _ : Int = 3"
102 )
103 end
104
105
106 def test_should_be_kind_of_specified_type_in_declaration
107 assert_raises(X::TypeError) do
108 Api.eval_decls @interp, "val _ : String = 3"
109 end
110 end
111
112
113 def test_lambda
114 value = Api.eval_expr @interp, "{ _ -> 4 } 3"
115 assert_instance_of VCAN::Int, value
116 assert_equal 4, value.val
117 end
118
119
120 def test_lambda_with_type
121 value = Api.eval_expr @interp, "{ _ : Int -> 4 } 3"
122 assert_instance_of VCAN::Int, value
123 assert_equal 4, value.val
124 end
125
126
127 def test_should_be_kind_of_specified_type_in_lambda
128 assert_raises(X::TypeError) do
129 Api.eval_expr @interp, "{ _ : String -> 4 } 3"
130 end
131 end
132 end
133
134
135
136 class BraketTest < Minitest::Test
137 =begin
138 <basic-variable-pattern> ::= ID [ ":" ID ] ; ;
139 =end
140 def setup
141 @interp = Api.setup_interpreter
142 end
143
144
145 def test_value
146 interp = Api.eval_decls @interp, "val (x) = 3"
147
148 value = Api.eval_expr interp, "x"
149 assert_instance_of VCAN::Int, value
150 assert_equal 3, value.val
151 end
152
153
154 def test_lambda
155 value = Api.eval_expr @interp, "{ (x) -> x + 4 } 3"
156 assert_instance_of VCAN::Int, value
157 assert_equal 7, value.val
158 end
159 end
160
161
162
163 class InfixOperatorTest < Minitest::Test
164 =begin
165 <infix-operator-pattern> ::= "(" <infix-operator> ")" ;
166
167 /* <infix-operator> ::= ... ;
168 See IdentifierTest (Expression::Atomic) */
169 =end
170 def setup
171 @interp = Api.setup_interpreter
172 end
173
174
175 def test_value
176 interp = Api.eval_decls @interp, "val (*) = (+)"
177
178 value = Api.eval_expr interp, "3 * 4"
179 assert_instance_of VCAN::Int, value
180 assert_equal 7, value.val
181 end
182
183
184 def test_lambda
185 value = Api.eval_expr @interp, "{ (*) -> 3 * 4 } (+)"
186 assert_instance_of VCAN::Int, value
187 assert_equal 7, value.val
188 end
189 end
190
191 end # Umu::Test::Grammar::CoreLanguage::Pattern::Variable
192
193 end # Umu::Test::Grammar::CoreLanguage::Pattern
194
195 end # Umu::Test::Grammar::CoreLanguage
196
197 end # Umu::Test::Grammar
198
199 end # Umu::Test
200
201 end # Umu