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 FloatTest < Minitest::Test
19 def setup
20 @interp = Api.setup_interpreter
21 end
22
23
24 # Constructer
25
26 def test_cmess_make_nan
27 value = Api.eval_expr @interp, "&Float.nan"
28 assert_instance_of VCAN::Float, value
29 assert value.val.nan?
30 end
31
32
33 def test_cmess_make_infinity
34 value = Api.eval_expr @interp, "&Float.infinity"
35 assert_instance_of VCAN::Float, value
36 assert value.val.infinite?
37 end
38
39
40 # Classifier
41
42 def test_imess_is_zero
43 value = Api.eval_expr @interp, "0.0.zero?"
44 assert_instance_of VCA::Bool, value
45 assert_equal true, value.val
46
47 value = Api.eval_expr @interp, "3.0.zero?"
48 assert_instance_of VCA::Bool, value
49 assert_equal false, value.val
50 end
51
52
53 def test_imess_is_positive
54 value = Api.eval_expr @interp, "3.0.positive?"
55 assert_instance_of VCA::Bool, value
56 assert_equal true, value.val
57
58 value = Api.eval_expr @interp, "0.0.positive?"
59 assert_instance_of VCA::Bool, value
60 assert_equal false, value.val
61 end
62
63
64 def test_imess_is_negative
65 value = Api.eval_expr @interp, "-3.0.negative?"
66 assert_instance_of VCA::Bool, value
67 assert_equal true, value.val
68
69 value = Api.eval_expr @interp, "0.0.negative?"
70 assert_instance_of VCA::Bool, value
71 assert_equal false, value.val
72 end
73
74
75 # Formater
76
77 def test_imess_show_finite
78 value = Api.eval_expr @interp, "3.0.show"
79 assert_instance_of VCA::String, value
80 assert_equal "3.0", value.val
81 end
82
83
84 def test_imess_finite_to_s
85 value = Api.eval_expr @interp, "3.0.to-s"
86 assert_instance_of VCA::String, value
87 assert_equal "3.0", value.val
88 end
89
90
91 def test_imess_show_nan
92 value = Api.eval_expr @interp, "NAN.show"
93 assert_instance_of VCA::String, value
94 assert_equal "NAN", value.val
95 end
96
97
98 def test_imess_nan_to_s
99 value = Api.eval_expr @interp, "NAN.to-s"
100 assert_instance_of VCA::String, value
101 assert_equal "NAN", value.val
102 end
103
104
105 def test_imess_show_positive_infinite
106 value = Api.eval_expr @interp, "INFINITY.show"
107 assert_instance_of VCA::String, value
108 assert_equal "INFINITY", value.val
109 end
110
111
112 def test_imess_positive_infinite_to_s
113 value = Api.eval_expr @interp, "INFINITY.to-s"
114 assert_instance_of VCA::String, value
115 assert_equal "INFINITY", value.val
116 end
117
118
119 def test_imess_show_negative_infinite
120 value = Api.eval_expr @interp, "INFINITY.negate.show"
121 assert_instance_of VCA::String, value
122 assert_equal "-INFINITY", value.val
123 end
124
125
126 def test_imess_negative_infinite_to_s
127 value = Api.eval_expr @interp, "INFINITY.negate.to-s"
128 assert_instance_of VCA::String, value
129 assert_equal "-INFINITY", value.val
130 end
131
132
133 # Type converter
134
135 def test_imess_to_i
136 value = Api.eval_expr @interp, "3.0.to-i"
137 assert_instance_of VCAN::Int, value
138 assert_equal 3, value.val
139 end
140
141
142 def test_imess_to_f
143 value = Api.eval_expr @interp, "3.to-f"
144 assert_instance_of VCAN::Float, value
145 assert_equal 3.0, value.val
146 end
147
148
149 # Computer
150
151 def test_imess_negate
152 value = Api.eval_expr @interp, "3.0.negate"
153 assert_instance_of VCAN::Float, value
154 assert_equal (-3.0), value.val
155
156 value = Api.eval_expr @interp, "-3.0.negate"
157 assert_instance_of VCAN::Float, value
158 assert_equal 3.0, value.val
159 end
160
161
162 def test_imess_abs
163 value = Api.eval_expr @interp, "3.0.abs"
164 assert_instance_of VCAN::Float, value
165 assert_equal 3.0, value.val
166
167 value = Api.eval_expr @interp, "-3.0.negate"
168 assert_instance_of VCAN::Float, value
169 assert_equal 3.0, value.val
170 end
171
172
173 def test_imess_add
174 value = Api.eval_expr @interp, "3.0.+ 4.0"
175 assert_instance_of VCAN::Float, value
176 assert_equal 7.0, value.val
177 end
178
179
180 def test_imess_sub
181 value = Api.eval_expr @interp, "3.0.- 4.0"
182 assert_instance_of VCAN::Float, value
183 assert_equal (-1.0), value.val
184 end
185
186
187 def test_imess_multiply
188 value = Api.eval_expr @interp, "3.0.* 4.0"
189 assert_instance_of VCAN::Float, value
190 assert_equal 12.0, value.val
191 end
192
193
194 def test_imess_divide
195 value = Api.eval_expr @interp, "7.0./ 2.0"
196 assert_instance_of VCAN::Float, value
197 assert_equal 3.5, value.val
198 end
199
200
201 def test_imess_divide_by_zero
202 value = Api.eval_expr @interp, "7.0./ 0.0"
203 assert_instance_of VCAN::Float, value
204 assert value.val.infinite?
205 end
206
207
208 def test_imess_mod
209 value = Api.eval_expr @interp, "7.0.mod 3.0"
210 assert_instance_of VCAN::Float, value
211 assert_equal 1.0, value.val
212 end
213
214
215 def test_imess_pow
216 value = Api.eval_expr @interp, "2.0.pow 3.0"
217 assert_instance_of VCAN::Float, value
218 assert_equal 8.0, value.val
219 end
220
221
222 def test_imess_random
223 assert (
224 Api.eval_expr @interp, "10.0.random"
225 )
226 end
227
228
229 def test_parameter_value_should_not_be_negative_number
230 assert_raises(X::ArgumentError) do
231 Api.eval_expr @interp, "-10.0.random"
232 end
233 end
234
235
236 # Type Error
237
238 def test_parameter_of_computer_should_be_a_float
239 assert_raises(X::TypeError) do
240 Api.eval_expr @interp, "3.0.+ ()"
241 end
242
243 assert_raises(X::TypeError) do
244 Api.eval_expr @interp, "3.0.+ @Apple"
245 end
246
247 assert_raises(X::TypeError) do
248 Api.eval_expr @interp, "3.0.+ 4"
249 end
250 end
251
252
253 def test_parameter_of_relation_operator_should_be_a_float
254 assert_raises(X::TypeError) do
255 Api.eval_expr @interp, "3.0.< ()"
256 end
257
258 assert_raises(X::TypeError) do
259 Api.eval_expr @interp, "3.0.< @Apple"
260 end
261
262 assert_raises(X::TypeError) do
263 Api.eval_expr @interp, "3.0.< 4"
264 end
265
266 assert_raises(X::TypeError) do
267 Api.eval_expr @interp, "3.0.<= ()"
268 end
269
270 assert_raises(X::TypeError) do
271 Api.eval_expr @interp, "3.0.<= @Apple"
272 end
273
274 assert_raises(X::TypeError) do
275 Api.eval_expr @interp, "3.0.<= 4"
276 end
277 end
278 end
279
280 end # Umu::Test::Library::Class::Atom::Number
281
282 end # Umu::Test::Library::Class::Atom
283
284 end # Umu::Test::Library::Class
285
286 end # Umu::Test::Library
287
288 end # Umu::Test
289
290 end # Umu