1 # frozen_string_literal: true
2
3 require "test_helper"
4
5
6 module Umu
7
8 module Test
9
10 module Library
11
12 module Class
13
14 module Atom
15
16 module Number
17
18 class IntTest < Minitest::Test
19 def setup
20 @interp = Api.setup_interpreter
21 end
22
23
24 # Constructer
25
26 def test_imess_make_zero
27 value = Api.eval_expr @interp, "3.zero"
28 assert_instance_of VCAN::Int, value
29 assert_equal 0, value.val
30 end
31
32
33 # Classifier
34
35 def test_imess_is_zero
36 value = Api.eval_expr @interp, "0.zero?"
37 assert_instance_of VCA::Bool, value
38 assert_equal true, value.val
39
40 value = Api.eval_expr @interp, "3.zero?"
41 assert_instance_of VCA::Bool, value
42 assert_equal false, value.val
43 end
44
45
46 def test_imess_is_even
47 value = Api.eval_expr @interp, "2.even?"
48 assert_instance_of VCA::Bool, value
49 assert_equal true, value.val
50
51 value = Api.eval_expr @interp, "3.even?"
52 assert_instance_of VCA::Bool, value
53 assert_equal false, value.val
54 end
55
56
57 def test_imess_is_odd
58 value = Api.eval_expr @interp, "3.odd?"
59 assert_instance_of VCA::Bool, value
60 assert_equal true, value.val
61
62 value = Api.eval_expr @interp, "4.odd?"
63 assert_instance_of VCA::Bool, value
64 assert_equal false, value.val
65 end
66
67
68 def test_imess_is_positive
69 value = Api.eval_expr @interp, "3.positive?"
70 assert_instance_of VCA::Bool, value
71 assert_equal true, value.val
72
73 value = Api.eval_expr @interp, "0.positive?"
74 assert_instance_of VCA::Bool, value
75 assert_equal false, value.val
76 end
77
78
79 def test_imess_is_negative
80 value = Api.eval_expr @interp, "-3.negative?"
81 assert_instance_of VCA::Bool, value
82 assert_equal true, value.val
83
84 value = Api.eval_expr @interp, "0.negative?"
85 assert_instance_of VCA::Bool, value
86 assert_equal false, value.val
87 end
88
89
90 # Type converter
91
92 def test_imess_to_i
93 value = Api.eval_expr @interp, "3.to-i"
94 assert_instance_of VCAN::Int, value
95 assert_equal 3, value.val
96 end
97
98
99 def test_imess_to_f
100 value = Api.eval_expr @interp, "3.to-f"
101 assert_instance_of VCAN::Float, value
102 assert_equal 3.0, value.val
103 end
104
105
106 # Computer
107
108 def test_imess_negate
109 value = Api.eval_expr @interp, "3.negate"
110 assert_instance_of VCAN::Int, value
111 assert_equal (-3), value.val
112
113 value = Api.eval_expr @interp, "-3.negate"
114 assert_instance_of VCAN::Int, value
115 assert_equal 3, value.val
116 end
117
118
119 def test_imess_abs
120 value = Api.eval_expr @interp, "3.abs"
121 assert_instance_of VCAN::Int, value
122 assert_equal 3, value.val
123
124 value = Api.eval_expr @interp, "-3.negate"
125 assert_instance_of VCAN::Int, value
126 assert_equal 3, value.val
127 end
128
129
130 def test_imess_succ
131 value = Api.eval_expr @interp, "3.succ"
132 assert_instance_of VCAN::Int, value
133 assert_equal 4, value.val
134 end
135
136
137 def test_imess_pred
138 value = Api.eval_expr @interp, "3.pred"
139 assert_instance_of VCAN::Int, value
140 assert_equal 2, value.val
141 end
142
143
144 def test_imess_add
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_imess_sub
152 value = Api.eval_expr @interp, "3.- 4"
153 assert_instance_of VCAN::Int, value
154 assert_equal (-1), value.val
155 end
156
157
158 def test_imess_multiply
159 value = Api.eval_expr @interp, "3.* 4"
160 assert_instance_of VCAN::Int, value
161 assert_equal 12, value.val
162 end
163
164
165 def test_imess_divide
166 value = Api.eval_expr @interp, "7./ 3"
167 assert_instance_of VCAN::Int, value
168 assert_equal 2, value.val
169 end
170
171
172 def test_integer_should_be_not_devide_by_zero
173 assert_raises(X::ZeroDivisionError) do
174 Api.eval_expr @interp, "7./ 0"
175 end
176 end
177
178
179 def test_imess_mod
180 value = Api.eval_expr @interp, "7.mod 3"
181 assert_instance_of VCAN::Int, value
182 assert_equal 1, value.val
183 end
184
185
186 def test_imess_pow
187 value = Api.eval_expr @interp, "2.pow 3"
188 assert_instance_of VCAN::Int, value
189 assert_equal 8, value.val
190 end
191
192
193 def test_imess_random
194 assert (
195 Api.eval_expr @interp, "10.random"
196 )
197 end
198
199
200 def test_parameter_value_should_not_be_negative_number
201 assert_raises(X::ArgumentError) do
202 Api.eval_expr @interp, "-10.random"
203 end
204 end
205
206
207 def test_imess_to
208 value = Api.eval_expr @interp, "3.to 10"
209 assert_instance_of VCM::Interval, value
210 assert_instance_of VCAN::Int, value.current_value
211 assert_equal 3, value.current_value.val
212 assert_instance_of VCAN::Int, value.step_value
213 assert_equal 1, value.step_value.val
214 assert_instance_of VCAN::Int, value.stop_value
215 assert_equal 10, value.stop_value.val
216 end
217
218
219 def test_kw_imess_to
220 value = Api.eval_expr @interp, "3.(to:10)"
221 assert_instance_of VCM::Interval, value
222 assert_instance_of VCAN::Int, value.current_value
223 assert_equal 3, value.current_value.val
224 assert_instance_of VCAN::Int, value.step_value
225 assert_equal 1, value.step_value.val
226 assert_instance_of VCAN::Int, value.stop_value
227 assert_equal 10, value.stop_value.val
228 end
229
230
231 def test_imess_to_by
232 value = Api.eval_expr @interp, "3.to-by 10 2"
233 assert_instance_of VCM::Interval, value
234 assert_instance_of VCAN::Int, value.current_value
235 assert_equal 3, value.current_value.val
236 assert_instance_of VCAN::Int, value.step_value
237 assert_equal 2, value.step_value.val
238 assert_instance_of VCAN::Int, value.stop_value
239 assert_equal 10, value.stop_value.val
240 end
241
242
243 def test_kw_imess_to_by
244 value = Api.eval_expr @interp, "3.(to:10 by:2)"
245 assert_instance_of VCM::Interval, value
246 assert_instance_of VCAN::Int, value.current_value
247 assert_equal 3, value.current_value.val
248 assert_instance_of VCAN::Int, value.step_value
249 assert_equal 2, value.step_value.val
250 assert_instance_of VCAN::Int, value.stop_value
251 assert_equal 10, value.stop_value.val
252 end
253
254
255 def test_step_value_should_be_positive_if_upto_interval
256 assert_raises(X::ValueError) do
257 Api.eval_expr @interp, "3.to-by 10 -2"
258 end
259 end
260
261
262 def test_step_value_should_be_negative_if_downto_interval
263 assert_raises(X::ValueError) do
264 Api.eval_expr @interp, "10.to-by 3 2"
265 end
266 end
267
268
269 # Type Error
270
271 def test_parameter_of_computer_should_be_a_int
272 assert_raises(X::TypeError) do
273 Api.eval_expr @interp, "3.+ ()"
274 end
275
276 assert_raises(X::TypeError) do
277 Api.eval_expr @interp, "3.+ @Apple"
278 end
279
280 assert_raises(X::TypeError) do
281 Api.eval_expr @interp, "3.+ 4.0"
282 end
283 end
284
285
286 def test_parameter_of_relation_operator_should_be_a_int
287 assert_raises(X::TypeError) do
288 Api.eval_expr @interp, "3.< ()"
289 end
290
291 assert_raises(X::TypeError) do
292 Api.eval_expr @interp, "3.< @Apple"
293 end
294
295 assert_raises(X::TypeError) do
296 Api.eval_expr @interp, "3.< 4.0"
297 end
298
299 assert_raises(X::TypeError) do
300 Api.eval_expr @interp, "3.<= ()"
301 end
302
303 assert_raises(X::TypeError) do
304 Api.eval_expr @interp, "3.<= @Apple"
305 end
306
307 assert_raises(X::TypeError) do
308 Api.eval_expr @interp, "3.<= 4.0"
309 end
310 end
311 end
312
313 end # Umu::Test::Library::Class::Atom::Number
314
315 end # Umu::Test::Library::Class::Atom
316
317 end # Umu::Test::Library::Class
318
319 end # Umu::Test::Library
320
321 end # Umu::Test
322
323 end # Umu