OSDN Git Service

ruby-1.9.1-rc1
[splhack/AndroidRuby.git] / lib / ruby-1.9.1-rc1 / test / ruby / test_numeric.rb
1 require 'test/unit'
2
3 class TestNumeric < Test::Unit::TestCase
4   class DummyNumeric < Numeric
5   end
6
7   def test_coerce
8     a, b = 1.coerce(2)
9     assert_equal(Fixnum, a.class)
10     assert_equal(Fixnum, b.class)
11
12     a, b = 1.coerce(2.0)
13     assert_equal(Float, a.class)
14     assert_equal(Float, b.class)
15
16     assert_raise(TypeError) { -Numeric.new }
17   end
18
19   def test_dummynumeric
20     a = DummyNumeric.new
21
22     DummyNumeric.class_eval do
23       def coerce(x); nil; end
24     end
25     assert_raise(TypeError) { -a }
26     assert_nil(1 <=> a)
27     assert_raise(ArgumentError) { 1 <= a }
28
29     DummyNumeric.class_eval do
30       def coerce(x); 1.coerce(x); end
31     end
32     assert_equal(2, 1 + a)
33     assert_equal(0, 1 <=> a)
34     assert(1 <= a)
35
36     DummyNumeric.class_eval do
37       def coerce(x); [x, 1]; end
38     end
39     assert_equal(-1, -a)
40
41   ensure
42     DummyNumeric.class_eval do
43       remove_method :coerce
44     end
45   end
46
47   def test_numeric
48     a = Numeric.new
49     assert_raise(TypeError) { def a.foo; end }
50     assert_raise(TypeError) { a.dup }
51   end
52
53   def test_quo
54     assert_raise(ArgumentError) {DummyNumeric.new.quo(1)}
55   end
56
57   def test_divmod
58     DummyNumeric.class_eval do
59       def /(x); 42.0; end
60       def %(x); :mod; end
61     end
62
63     assert_equal(42, DummyNumeric.new.div(1))
64     assert_equal(:mod, DummyNumeric.new.modulo(1))
65     assert_equal([42, :mod], DummyNumeric.new.divmod(1))
66
67     assert_kind_of(Integer, 11.divmod(3.5).first, '[ruby-dev:34006]')
68
69   ensure
70     DummyNumeric.class_eval do
71       remove_method :/, :%
72     end
73   end
74
75   def test_real_p
76     assert(Numeric.new.real?)
77   end
78
79   def test_integer_p
80     assert(!Numeric.new.integer?)
81   end
82
83   def test_abs
84     a = DummyNumeric.new
85     DummyNumeric.class_eval do
86       def -@; :ok; end
87       def <(x); true; end
88     end
89
90     assert_equal(:ok, a.abs)
91
92     DummyNumeric.class_eval do
93       def <(x); false; end
94     end
95
96     assert_equal(a, a.abs)
97
98   ensure
99     DummyNumeric.class_eval do
100       remove_method :-@, :<
101     end
102   end
103
104   def test_zero_p
105     DummyNumeric.class_eval do
106       def ==(x); true; end
107     end
108
109     assert(DummyNumeric.new.zero?)
110
111   ensure
112     DummyNumeric.class_eval do
113       remove_method :==
114     end
115   end
116
117   def test_to_int
118     DummyNumeric.class_eval do
119       def to_i; :ok; end
120     end
121
122     assert_equal(:ok, DummyNumeric.new.to_int)
123
124   ensure
125     DummyNumeric.class_eval do
126       remove_method :to_i
127     end
128   end
129
130   def test_cmp
131     a = Numeric.new
132     assert_equal(0, a <=> a)
133     assert_nil(a <=> :foo)
134   end
135
136   def test_floor_ceil_round_truncate
137     DummyNumeric.class_eval do
138       def to_f; 1.5; end
139     end
140
141     a = DummyNumeric.new
142     assert_equal(1, a.floor)
143     assert_equal(2, a.ceil)
144     assert_equal(2, a.round)
145     assert_equal(1, a.truncate)
146
147     DummyNumeric.class_eval do
148       def to_f; 1.4; end
149     end
150
151     a = DummyNumeric.new
152     assert_equal(1, a.floor)
153     assert_equal(2, a.ceil)
154     assert_equal(1, a.round)
155     assert_equal(1, a.truncate)
156
157     DummyNumeric.class_eval do
158       def to_f; -1.5; end
159     end
160
161     a = DummyNumeric.new
162     assert_equal(-2, a.floor)
163     assert_equal(-1, a.ceil)
164     assert_equal(-2, a.round)
165     assert_equal(-1, a.truncate)
166
167   ensure
168     DummyNumeric.class_eval do
169       remove_method :to_f
170     end
171   end
172
173   def test_step
174     a = []
175     1.step(10) {|x| a << x }
176     assert_equal([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], a)
177
178     a = []
179     1.step(10, 2) {|x| a << x }
180     assert_equal([1, 3, 5, 7, 9], a)
181
182     assert_raise(ArgumentError) { 1.step(10, 1, 0) { } }
183     assert_raise(ArgumentError) { 1.step(10, 0) { } }
184
185     a = []
186     10.step(1, -2) {|x| a << x }
187     assert_equal([10, 8, 6, 4, 2], a)
188
189     a = []
190     1.0.step(10.0, 2.0) {|x| a << x }
191     assert_equal([1.0, 3.0, 5.0, 7.0, 9.0], a)
192
193     a = []
194     1.step(10, 2**32) {|x| a << x }
195     assert_equal([1], a)
196
197     a = []
198     10.step(1, -(2**32)) {|x| a << x }
199     assert_equal([10], a)
200   end
201
202   def test_num2long
203     assert_raise(TypeError) { 1 & nil }
204     assert_raise(TypeError) { 1 & 1.0 }
205     assert_raise(TypeError) { 1 & 2147483648.0 }
206     assert_raise(TypeError) { 1 & 9223372036854777856.0 }
207     o = Object.new
208     def o.to_int; 1; end
209     assert_equal(1, 1 & o)
210   end
211
212   def test_eql
213     assert(1 == 1.0)
214     assert(!(1.eql?(1.0)))
215     assert(!(1.eql?(2)))
216   end
217 end