1require 'test/unit'
2
3class RationalSub < Rational; end
4
5class Rational_Test < Test::Unit::TestCase
6
7  def setup
8    @complex = defined?(Complex)
9    if @complex
10      @keiju = Complex.instance_variables.include?(:@RCS_ID)
11    end
12    seps = [File::SEPARATOR, File::ALT_SEPARATOR].compact.map{|x| Regexp.escape(x)}.join("|")
13    @unify = $".grep(/(?:^|#{seps})mathn(?:\.(?:rb|so))?/).size != 0
14  end
15
16  def test_ratsub
17    c = RationalSub.__send__(:convert, 1)
18
19    assert_kind_of(Numeric, c)
20
21    if @unify
22      assert_instance_of(Fixnum, c)
23    else
24      assert_instance_of(RationalSub, c)
25
26      c2 = c + 1
27      assert_instance_of(RationalSub, c2)
28      c2 = c - 1
29      assert_instance_of(RationalSub, c2)
30
31      c3 = c - c2
32      assert_instance_of(RationalSub, c3)
33
34      s = Marshal.dump(c)
35      c5 = Marshal.load(s)
36      assert_equal(c, c5)
37      assert_instance_of(RationalSub, c5)
38    end
39
40    c1 = Rational(1)
41    assert_equal(c1.hash, c.hash, '[ruby-dev:38850]')
42    assert_equal([true, true], [c.eql?(c1), c1.eql?(c)])
43  end
44
45  def test_eql_p
46    c = Rational(0)
47    c2 = Rational(0)
48    c3 = Rational(1)
49
50    assert_equal(true, c.eql?(c2))
51    assert_equal(false, c.eql?(c3))
52
53    if @unify
54      assert_equal(true, c.eql?(0))
55    else
56      assert_equal(false, c.eql?(0))
57    end
58  end
59
60  def test_hash
61    assert_instance_of(Fixnum, Rational(1,2).hash)
62
63    h = {}
64    h[Rational(0)] = 0
65    h[Rational(1,1)] = 1
66    h[Rational(2,1)] = 2
67    h[Rational(3,1)] = 3
68
69    assert_equal(4, h.size)
70    assert_equal(2, h[Rational(2,1)])
71
72    h[Rational(0,1)] = 9
73    assert_equal(4, h.size)
74  end
75
76  def test_freeze
77    c = Rational(1)
78    c.freeze
79    unless @unify
80      assert_equal(true, c.frozen?)
81    end
82    assert_instance_of(String, c.to_s)
83  end
84
85  def test_conv
86    c = Rational(0,1)
87    assert_equal(Rational(0,1), c)
88
89    c = Rational(2**32, 2**32)
90    assert_equal(Rational(2**32,2**32), c)
91    assert_equal([1,1], [c.numerator,c.denominator])
92
93    c = Rational(-2**32, 2**32)
94    assert_equal(Rational(-2**32,2**32), c)
95    assert_equal([-1,1], [c.numerator,c.denominator])
96
97    c = Rational(2**32, -2**32)
98    assert_equal(Rational(2**32,-2**32), c)
99    assert_equal([-1,1], [c.numerator,c.denominator])
100
101    c = Rational(-2**32, -2**32)
102    assert_equal(Rational(-2**32,-2**32), c)
103    assert_equal([1,1], [c.numerator,c.denominator])
104
105    c = Rational(Rational(1,2),2)
106    assert_equal(Rational(1,4), c)
107
108    c = Rational(2,Rational(1,2))
109    assert_equal(Rational(4), c)
110
111    c = Rational(Rational(1,2),Rational(1,2))
112    assert_equal(Rational(1), c)
113
114    if @complex && !@keiju
115      c = Rational(Complex(1,2),2)
116      assert_equal(Complex(Rational(1,2),1), c)
117
118      c = Rational(2,Complex(1,2))
119      assert_equal(Complex(Rational(2,5),Rational(-4,5)), c)
120
121      c = Rational(Complex(1,2),Complex(1,2))
122      assert_equal(Rational(1), c)
123    end
124
125    assert_equal(Rational(3),Rational(3))
126    assert_equal(Rational(1),Rational(3,3))
127    assert_equal(3.3.to_r,Rational(3.3))
128    assert_equal(1,Rational(3.3,3.3))
129    assert_equal(Rational(3),Rational('3'))
130    assert_equal(Rational(1),Rational('3.0','3.0'))
131    assert_equal(Rational(1),Rational('3/3','3/3'))
132    assert_raise(TypeError){Rational(nil)}
133    assert_raise(ArgumentError){Rational('')}
134    assert_raise(TypeError){Rational(Object.new)}
135    assert_raise(ArgumentError){Rational()}
136    assert_raise(ArgumentError){Rational(1,2,3)}
137
138    if (0.0/0).nan?
139      assert_raise(FloatDomainError){Rational(0.0/0)}
140    end
141    if (1.0/0).infinite?
142      assert_raise(FloatDomainError){Rational(1.0/0)}
143    end
144  end
145
146  def test_attr
147    c = Rational(4)
148
149    assert_equal(4, c.numerator)
150    assert_equal(1, c.denominator)
151
152    c = Rational(4,5)
153
154    assert_equal(4, c.numerator)
155    assert_equal(5, c.denominator)
156
157    c = Rational(4)
158
159    assert_equal(4, c.numerator)
160    assert_equal(1, c.denominator)
161
162    c = Rational(4,5)
163
164    assert_equal(4, c.numerator)
165    assert_equal(5, c.denominator)
166
167    c = Rational(4)
168
169    assert_equal(4, c.numerator)
170    assert_equal(1, c.denominator)
171
172    c = Rational(4,5)
173
174    assert_equal(4, c.numerator)
175    assert_equal(5, c.denominator)
176  end
177
178  def test_attr2
179    c = Rational(1)
180
181    if @unify
182=begin
183      assert_equal(true, c.finite?)
184      assert_equal(false, c.infinite?)
185      assert_equal(false, c.nan?)
186      assert_equal(true, c.integer?)
187      assert_equal(false, c.float?)
188      assert_equal(true, c.rational?)
189=end
190      assert_equal(true, c.real?)
191=begin
192      assert_equal(false, c.complex?)
193      assert_equal(true, c.exact?)
194      assert_equal(false, c.inexact?)
195=end
196    else
197=begin
198      assert_equal(true, c.finite?)
199      assert_equal(false, c.infinite?)
200      assert_equal(false, c.nan?)
201      assert_equal(false, c.integer?)
202      assert_equal(false, c.float?)
203      assert_equal(true, c.rational?)
204=end
205      assert_equal(true, c.real?)
206=begin
207      assert_equal(false, c.complex?)
208      assert_equal(true, c.exact?)
209      assert_equal(false, c.inexact?)
210=end
211    end
212
213=begin
214    assert_equal(true, Rational(0).positive?)
215    assert_equal(true, Rational(1).positive?)
216    assert_equal(false, Rational(-1).positive?)
217    assert_equal(false, Rational(0).negative?)
218    assert_equal(false, Rational(1).negative?)
219    assert_equal(true, Rational(-1).negative?)
220
221    assert_equal(0, Rational(0).sign)
222    assert_equal(1, Rational(2).sign)
223    assert_equal(-1, Rational(-2).sign)
224=end
225
226    assert_equal(true, Rational(0).zero?)
227    assert_equal(true, Rational(0,1).zero?)
228    assert_equal(false, Rational(1,1).zero?)
229
230    assert_equal(nil, Rational(0).nonzero?)
231    assert_equal(nil, Rational(0,1).nonzero?)
232    assert_equal(Rational(1,1), Rational(1,1).nonzero?)
233  end
234
235  def test_uplus
236    assert_equal(Rational(1), +Rational(1))
237    assert_equal(Rational(-1), +Rational(-1))
238    assert_equal(Rational(1,1), +Rational(1,1))
239    assert_equal(Rational(-1,1), +Rational(-1,1))
240    assert_equal(Rational(-1,1), +Rational(1,-1))
241    assert_equal(Rational(1,1), +Rational(-1,-1))
242  end
243
244  def test_negate
245    assert_equal(Rational(-1), -Rational(1))
246    assert_equal(Rational(1), -Rational(-1))
247    assert_equal(Rational(-1,1), -Rational(1,1))
248    assert_equal(Rational(1,1), -Rational(-1,1))
249    assert_equal(Rational(1,1), -Rational(1,-1))
250    assert_equal(Rational(-1,1), -Rational(-1,-1))
251
252=begin
253    assert_equal(0, Rational(0).negate)
254    assert_equal(-2, Rational(2).negate)
255    assert_equal(2, Rational(-2).negate)
256=end
257  end
258
259  def test_add
260    c = Rational(1,2)
261    c2 = Rational(2,3)
262
263    assert_equal(Rational(7,6), c + c2)
264
265    assert_equal(Rational(5,2), c + 2)
266    assert_equal(2.5, c + 2.0)
267  end
268
269  def test_sub
270    c = Rational(1,2)
271    c2 = Rational(2,3)
272
273    assert_equal(Rational(-1,6), c - c2)
274
275    assert_equal(Rational(-3,2), c - 2)
276    assert_equal(-1.5, c - 2.0)
277  end
278
279  def test_mul
280    c = Rational(1,2)
281    c2 = Rational(2,3)
282
283    assert_equal(Rational(1,3), c * c2)
284
285    assert_equal(Rational(1,1), c * 2)
286    assert_equal(1.0, c * 2.0)
287  end
288
289  def test_div
290    c = Rational(1,2)
291    c2 = Rational(2,3)
292
293    assert_equal(Rational(3,4), c / c2)
294
295    assert_equal(Rational(1,4), c / 2)
296    assert_equal(0.25, c / 2.0)
297
298    assert_raise(ZeroDivisionError){Rational(1, 3) / 0}
299    assert_raise(ZeroDivisionError){Rational(1, 3) / Rational(0)}
300
301    assert_equal(0, Rational(1, 3) / Float::INFINITY)
302    assert((Rational(1, 3) / 0.0).infinite?, '[ruby-core:31626]')
303  end
304
305  def assert_eql(exp, act, *args)
306    unless Array === exp
307      exp = [exp]
308    end
309    unless Array === act
310      act = [act]
311    end
312    exp.zip(act).each do |e, a|
313      na = [e, a] + args
314      assert_equal(*na)
315      na = [e.class, a] + args
316      assert_instance_of(*na)
317    end
318  end
319
320  def test_idiv
321    c = Rational(1,2)
322    c2 = Rational(2,3)
323
324    assert_eql(0, c.div(c2))
325    assert_eql(0, c.div(2))
326    assert_eql(0, c.div(2.0))
327
328    c = Rational(301,100)
329    c2 = Rational(7,5)
330
331    assert_equal(2, c.div(c2))
332    assert_equal(-3, c.div(-c2))
333    assert_equal(-3, (-c).div(c2))
334    assert_equal(2, (-c).div(-c2))
335
336    c = Rational(301,100)
337    c2 = Rational(2)
338
339    assert_equal(1, c.div(c2))
340    assert_equal(-2, c.div(-c2))
341    assert_equal(-2, (-c).div(c2))
342    assert_equal(1, (-c).div(-c2))
343
344    unless @unify
345      c = Rational(11)
346      c2 = Rational(3)
347
348      assert_equal(3, c.div(c2))
349      assert_equal(-4, c.div(-c2))
350      assert_equal(-4, (-c).div(c2))
351      assert_equal(3, (-c).div(-c2))
352    end
353  end
354
355  def test_modulo
356    c = Rational(1,2)
357    c2 = Rational(2,3)
358
359    assert_eql(Rational(1,2), c.modulo(c2))
360    assert_eql(Rational(1,2), c.modulo(2))
361    assert_eql(0.5, c.modulo(2.0))
362
363    c = Rational(301,100)
364    c2 = Rational(7,5)
365
366    assert_equal(Rational(21,100), c.modulo(c2))
367    assert_equal(Rational(-119,100), c.modulo(-c2))
368    assert_equal(Rational(119,100), (-c).modulo(c2))
369    assert_equal(Rational(-21,100), (-c).modulo(-c2))
370
371    c = Rational(301,100)
372    c2 = Rational(2)
373
374    assert_equal(Rational(101,100), c.modulo(c2))
375    assert_equal(Rational(-99,100), c.modulo(-c2))
376    assert_equal(Rational(99,100), (-c).modulo(c2))
377    assert_equal(Rational(-101,100), (-c).modulo(-c2))
378
379    unless @unify
380      c = Rational(11)
381      c2 = Rational(3)
382
383      assert_equal(2, c.modulo(c2))
384      assert_equal(-1, c.modulo(-c2))
385      assert_equal(1, (-c).modulo(c2))
386      assert_equal(-2, (-c).modulo(-c2))
387    end
388  end
389
390  def test_divmod
391    c = Rational(1,2)
392    c2 = Rational(2,3)
393
394    assert_eql([0, Rational(1,2)], c.divmod(c2))
395    assert_eql([0, Rational(1,2)], c.divmod(2))
396    assert_eql([0, 0.5], c.divmod(2.0))
397
398    c = Rational(301,100)
399    c2 = Rational(7,5)
400
401    assert_equal([2, Rational(21,100)], c.divmod(c2))
402    assert_equal([-3, Rational(-119,100)], c.divmod(-c2))
403    assert_equal([-3, Rational(119,100)], (-c).divmod(c2))
404    assert_equal([2, Rational(-21,100)], (-c).divmod(-c2))
405
406    c = Rational(301,100)
407    c2 = Rational(2)
408
409    assert_equal([1, Rational(101,100)], c.divmod(c2))
410    assert_equal([-2, Rational(-99,100)], c.divmod(-c2))
411    assert_equal([-2, Rational(99,100)], (-c).divmod(c2))
412    assert_equal([1, Rational(-101,100)], (-c).divmod(-c2))
413
414    unless @unify
415      c = Rational(11)
416      c2 = Rational(3)
417
418      assert_equal([3,2], c.divmod(c2))
419      assert_equal([-4,-1], c.divmod(-c2))
420      assert_equal([-4,1], (-c).divmod(c2))
421      assert_equal([3,-2], (-c).divmod(-c2))
422    end
423  end
424
425=begin
426  def test_quot
427    c = Rational(1,2)
428    c2 = Rational(2,3)
429
430    assert_eql(0, c.quot(c2))
431    assert_eql(0, c.quot(2))
432    assert_eql(0, c.quot(2.0))
433
434    c = Rational(301,100)
435    c2 = Rational(7,5)
436
437    assert_equal(2, c.quot(c2))
438    assert_equal(-2, c.quot(-c2))
439    assert_equal(-2, (-c).quot(c2))
440    assert_equal(2, (-c).quot(-c2))
441
442    c = Rational(301,100)
443    c2 = Rational(2)
444
445    assert_equal(1, c.quot(c2))
446    assert_equal(-1, c.quot(-c2))
447    assert_equal(-1, (-c).quot(c2))
448    assert_equal(1, (-c).quot(-c2))
449
450    unless @unify
451      c = Rational(11)
452      c2 = Rational(3)
453
454      assert_equal(3, c.quot(c2))
455      assert_equal(-3, c.quot(-c2))
456      assert_equal(-3, (-c).quot(c2))
457      assert_equal(3, (-c).quot(-c2))
458    end
459  end
460=end
461
462  def test_remainder
463    c = Rational(1,2)
464    c2 = Rational(2,3)
465
466    assert_eql(Rational(1,2), c.remainder(c2))
467    assert_eql(Rational(1,2), c.remainder(2))
468    assert_eql(0.5, c.remainder(2.0))
469
470    c = Rational(301,100)
471    c2 = Rational(7,5)
472
473    assert_equal(Rational(21,100), c.remainder(c2))
474    assert_equal(Rational(21,100), c.remainder(-c2))
475    assert_equal(Rational(-21,100), (-c).remainder(c2))
476    assert_equal(Rational(-21,100), (-c).remainder(-c2))
477
478    c = Rational(301,100)
479    c2 = Rational(2)
480
481    assert_equal(Rational(101,100), c.remainder(c2))
482    assert_equal(Rational(101,100), c.remainder(-c2))
483    assert_equal(Rational(-101,100), (-c).remainder(c2))
484    assert_equal(Rational(-101,100), (-c).remainder(-c2))
485
486    unless @unify
487      c = Rational(11)
488      c2 = Rational(3)
489
490      assert_equal(2, c.remainder(c2))
491      assert_equal(2, c.remainder(-c2))
492      assert_equal(-2, (-c).remainder(c2))
493      assert_equal(-2, (-c).remainder(-c2))
494    end
495  end
496
497=begin
498  def test_quotrem
499    c = Rational(1,2)
500    c2 = Rational(2,3)
501
502    assert_eql([0, Rational(1,2)], c.quotrem(c2))
503    assert_eql([0, Rational(1,2)], c.quotrem(2))
504    assert_eql([0, 0.5], c.quotrem(2.0))
505
506    c = Rational(301,100)
507    c2 = Rational(7,5)
508
509    assert_equal([2, Rational(21,100)], c.quotrem(c2))
510    assert_equal([-2, Rational(21,100)], c.quotrem(-c2))
511    assert_equal([-2, Rational(-21,100)], (-c).quotrem(c2))
512    assert_equal([2, Rational(-21,100)], (-c).quotrem(-c2))
513
514    c = Rational(301,100)
515    c2 = Rational(2)
516
517    assert_equal([1, Rational(101,100)], c.quotrem(c2))
518    assert_equal([-1, Rational(101,100)], c.quotrem(-c2))
519    assert_equal([-1, Rational(-101,100)], (-c).quotrem(c2))
520    assert_equal([1, Rational(-101,100)], (-c).quotrem(-c2))
521
522    unless @unify
523      c = Rational(11)
524      c2 = Rational(3)
525
526      assert_equal([3,2], c.quotrem(c2))
527      assert_equal([-3,2], c.quotrem(-c2))
528      assert_equal([-3,-2], (-c).quotrem(c2))
529      assert_equal([3,-2], (-c).quotrem(-c2))
530    end
531  end
532=end
533
534  def test_quo
535    c = Rational(1,2)
536    c2 = Rational(2,3)
537
538    assert_equal(Rational(3,4), c.quo(c2))
539
540    assert_equal(Rational(1,4), c.quo(2))
541    assert_equal(0.25, c.quo(2.0))
542  end
543
544  def test_fdiv
545    c = Rational(1,2)
546    c2 = Rational(2,3)
547
548    assert_equal(0.75, c.fdiv(c2))
549
550    assert_equal(0.25, c.fdiv(2))
551    assert_equal(0.25, c.fdiv(2.0))
552    assert_equal(0, c.fdiv(Float::INFINITY))
553    assert(c.fdiv(0).infinite?, '[ruby-core:31626]')
554  end
555
556  def test_expt
557    c = Rational(1,2)
558    c2 = Rational(2,3)
559
560    r = c ** c2
561    assert_in_delta(0.6299, r, 0.001)
562
563    assert_equal(Rational(1,4), c ** 2)
564    assert_equal(Rational(4), c ** -2)
565    assert_equal(Rational(1,4), (-c) ** 2)
566    assert_equal(Rational(4), (-c) ** -2)
567
568    assert_equal(0.25, c ** 2.0)
569    assert_equal(4.0, c ** -2.0)
570
571    assert_equal(Rational(1,4), c ** Rational(2))
572    assert_equal(Rational(4), c ** Rational(-2))
573
574    assert_equal(Rational(1), 0 ** Rational(0))
575    assert_equal(Rational(1), Rational(0) ** 0)
576    assert_equal(Rational(1), Rational(0) ** Rational(0))
577
578    # p ** p
579    x = 2 ** Rational(2)
580    assert_equal(Rational(4), x)
581    unless @unify
582      assert_instance_of(Rational, x)
583    end
584    assert_equal(4, x.numerator)
585    assert_equal(1, x.denominator)
586
587    x = Rational(2) ** 2
588    assert_equal(Rational(4), x)
589    unless @unify
590      assert_instance_of(Rational, x)
591    end
592    assert_equal(4, x.numerator)
593    assert_equal(1, x.denominator)
594
595    x = Rational(2) ** Rational(2)
596    assert_equal(Rational(4), x)
597    unless @unify
598      assert_instance_of(Rational, x)
599    end
600    assert_equal(4, x.numerator)
601    assert_equal(1, x.denominator)
602
603    # -p ** p
604    x = (-2) ** Rational(2)
605    assert_equal(Rational(4), x)
606    unless @unify
607      assert_instance_of(Rational, x)
608    end
609    assert_equal(4, x.numerator)
610    assert_equal(1, x.denominator)
611
612    x = Rational(-2) ** 2
613    assert_equal(Rational(4), x)
614    unless @unify
615      assert_instance_of(Rational, x)
616    end
617    assert_equal(4, x.numerator)
618    assert_equal(1, x.denominator)
619
620    x = Rational(-2) ** Rational(2)
621    assert_equal(Rational(4), x)
622    unless @unify
623      assert_instance_of(Rational, x)
624    end
625    assert_equal(4, x.numerator)
626    assert_equal(1, x.denominator)
627
628    # p ** -p
629    x = 2 ** Rational(-2)
630    assert_equal(Rational(1,4), x)
631    assert_instance_of(Rational, x)
632    assert_equal(1, x.numerator)
633    assert_equal(4, x.denominator)
634
635    x = Rational(2) ** -2
636    assert_equal(Rational(1,4), x)
637    assert_instance_of(Rational, x)
638    assert_equal(1, x.numerator)
639    assert_equal(4, x.denominator)
640
641    x = Rational(2) ** Rational(-2)
642    assert_equal(Rational(1,4), x)
643    assert_instance_of(Rational, x)
644    assert_equal(1, x.numerator)
645    assert_equal(4, x.denominator)
646
647    # -p ** -p
648    x = (-2) ** Rational(-2)
649    assert_equal(Rational(1,4), x)
650    assert_instance_of(Rational, x)
651    assert_equal(1, x.numerator)
652    assert_equal(4, x.denominator)
653
654    x = Rational(-2) ** -2
655    assert_equal(Rational(1,4), x)
656    assert_instance_of(Rational, x)
657    assert_equal(1, x.numerator)
658    assert_equal(4, x.denominator)
659
660    x = Rational(-2) ** Rational(-2)
661    assert_equal(Rational(1,4), x)
662    assert_instance_of(Rational, x)
663    assert_equal(1, x.numerator)
664    assert_equal(4, x.denominator)
665
666    unless @unify # maybe bug mathn
667      assert_raise(ZeroDivisionError){0 ** -1}
668    end
669  end
670
671  def test_cmp
672    assert_equal(-1, Rational(-1) <=> Rational(0))
673    assert_equal(0, Rational(0) <=> Rational(0))
674    assert_equal(+1, Rational(+1) <=> Rational(0))
675
676    assert_equal(-1, Rational(-1) <=> 0)
677    assert_equal(0, Rational(0) <=> 0)
678    assert_equal(+1, Rational(+1) <=> 0)
679
680    assert_equal(-1, Rational(-1) <=> 0.0)
681    assert_equal(0, Rational(0) <=> 0.0)
682    assert_equal(+1, Rational(+1) <=> 0.0)
683
684    assert_equal(-1, Rational(1,2) <=> Rational(2,3))
685    assert_equal(0, Rational(2,3) <=> Rational(2,3))
686    assert_equal(+1, Rational(2,3) <=> Rational(1,2))
687
688    f = 2**30-1
689    b = 2**30
690
691    assert_equal(0, Rational(f) <=> Rational(f))
692    assert_equal(-1, Rational(f) <=> Rational(b))
693    assert_equal(+1, Rational(b) <=> Rational(f))
694    assert_equal(0, Rational(b) <=> Rational(b))
695
696    assert_equal(-1, Rational(f-1) <=> Rational(f))
697    assert_equal(+1, Rational(f) <=> Rational(f-1))
698    assert_equal(-1, Rational(b-1) <=> Rational(b))
699    assert_equal(+1, Rational(b) <=> Rational(b-1))
700
701    assert_equal(false, Rational(0) < Rational(0))
702    assert_equal(true, Rational(0) <= Rational(0))
703    assert_equal(true, Rational(0) >= Rational(0))
704    assert_equal(false, Rational(0) > Rational(0))
705
706    assert_equal(nil, Rational(0) <=> nil)
707    assert_equal(nil, Rational(0) <=> 'foo')
708  end
709
710  def test_eqeq
711    assert(Rational(1,1) == Rational(1))
712    assert(Rational(-1,1) == Rational(-1))
713
714    assert_equal(false, Rational(2,1) == Rational(1))
715    assert_equal(true, Rational(2,1) != Rational(1))
716    assert_equal(false, Rational(1) == nil)
717    assert_equal(false, Rational(1) == '')
718  end
719
720  def test_coerce
721    assert_equal([Rational(2),Rational(1)], Rational(1).coerce(2))
722    assert_equal([Rational(2.2),Rational(1)], Rational(1).coerce(2.2))
723    assert_equal([Rational(2),Rational(1)], Rational(1).coerce(Rational(2)))
724
725    assert_nothing_raised(TypeError, '[Bug #5020] [ruby-devl:44088]') do
726      Rational(1,2).coerce(Complex(1,1))
727    end
728  end
729
730  class ObjectX
731    def + (x) Rational(1) end
732    alias - +
733    alias * +
734    alias / +
735    alias quo +
736    alias div +
737    alias % +
738    alias remainder +
739    alias ** +
740    def coerce(x) [x, Rational(1)] end
741  end
742
743  def test_coerce2
744    x = ObjectX.new
745    %w(+ - * / quo div % remainder **).each do |op|
746      assert_kind_of(Numeric, Rational(1).__send__(op, x))
747    end
748  end
749
750  def test_unify
751    if @unify
752      assert_instance_of(Fixnum, Rational(1,2) + Rational(1,2))
753      assert_instance_of(Fixnum, Rational(1,2) - Rational(1,2))
754      assert_instance_of(Fixnum, Rational(1,2) * 2)
755      assert_instance_of(Fixnum, Rational(1,2) / Rational(1,2))
756      assert_instance_of(Fixnum, Rational(1,2).div(Rational(1,2)))
757      assert_instance_of(Fixnum, Rational(1,2).quo(Rational(1,2)))
758      assert_instance_of(Fixnum, Rational(1,2) ** -2)
759    end
760  end
761
762  def test_math
763    assert_equal(Rational(1,2), Rational(1,2).abs)
764    assert_equal(Rational(1,2), Rational(-1,2).abs)
765    if @complex && !@keiju
766      assert_equal(Rational(1,2), Rational(1,2).magnitude)
767      assert_equal(Rational(1,2), Rational(-1,2).magnitude)
768    end
769
770    assert_equal(1, Rational(1,2).numerator)
771    assert_equal(2, Rational(1,2).denominator)
772  end
773
774  def test_trunc
775    [[Rational(13, 5),  [ 2,  3,  2,  3]], #  2.6
776     [Rational(5, 2),   [ 2,  3,  2,  3]], #  2.5
777     [Rational(12, 5),  [ 2,  3,  2,  2]], #  2.4
778     [Rational(-12,5),  [-3, -2, -2, -2]], # -2.4
779     [Rational(-5, 2),  [-3, -2, -2, -3]], # -2.5
780     [Rational(-13, 5), [-3, -2, -2, -3]], # -2.6
781    ].each do |i, a|
782      assert_equal(a[0], i.floor)
783      assert_equal(a[1], i.ceil)
784      assert_equal(a[2], i.truncate)
785      assert_equal(a[3], i.round)
786    end
787  end
788
789  def test_to_s
790    c = Rational(1,2)
791
792    assert_instance_of(String, c.to_s)
793    assert_equal('1/2', c.to_s)
794
795    if @unify
796      assert_equal('0', Rational(0,2).to_s)
797      assert_equal('0', Rational(0,-2).to_s)
798    else
799      assert_equal('0/1', Rational(0,2).to_s)
800      assert_equal('0/1', Rational(0,-2).to_s)
801    end
802    assert_equal('1/2', Rational(1,2).to_s)
803    assert_equal('-1/2', Rational(-1,2).to_s)
804    assert_equal('1/2', Rational(-1,-2).to_s)
805    assert_equal('-1/2', Rational(1,-2).to_s)
806    assert_equal('1/2', Rational(-1,-2).to_s)
807  end
808
809  def test_inspect
810    c = Rational(1,2)
811
812    assert_instance_of(String, c.inspect)
813    assert_equal('(1/2)', c.inspect)
814  end
815
816  def test_marshal
817    c = Rational(1,2)
818    c.instance_eval{@ivar = 9}
819
820    s = Marshal.dump(c)
821    c2 = Marshal.load(s)
822    assert_equal(c, c2)
823    assert_equal(9, c2.instance_variable_get(:@ivar))
824    assert_instance_of(Rational, c2)
825
826    assert_raise(ZeroDivisionError){
827      Marshal.load("\x04\bU:\rRational[\ai\x06i\x05")
828    }
829
830    bug3656 = '[ruby-core:31622]'
831    c = Rational(1,2)
832    c.freeze
833    assert(c.frozen?)
834    result = c.marshal_load([2,3]) rescue :fail
835    assert_equal(:fail, result, bug3656)
836  end
837
838  def test_marshal_compatibility
839    bug6625 = '[ruby-core:45775]'
840    dump = "\x04\x08o:\x0dRational\x07:\x11@denominatori\x07:\x0f@numeratori\x06"
841    assert_nothing_raised(bug6625) do
842      assert_equal(Rational(1, 2), Marshal.load(dump), bug6625)
843    end
844  end
845
846  def test_parse
847    assert_equal(Rational(5), '5'.to_r)
848    assert_equal(Rational(-5), '-5'.to_r)
849    assert_equal(Rational(5,3), '5/3'.to_r)
850    assert_equal(Rational(-5,3), '-5/3'.to_r)
851#    assert_equal(Rational(5,-3), '5/-3'.to_r)
852#    assert_equal(Rational(-5,-3), '-5/-3'.to_r)
853
854    assert_equal(Rational(5), '5.0'.to_r)
855    assert_equal(Rational(-5), '-5.0'.to_r)
856    assert_equal(Rational(5,3), '5.0/3'.to_r)
857    assert_equal(Rational(-5,3), '-5.0/3'.to_r)
858#    assert_equal(Rational(5,-3), '5.0/-3'.to_r)
859#    assert_equal(Rational(-5,-3), '-5.0/-3'.to_r)
860
861    assert_equal(Rational(5), '5e0'.to_r)
862    assert_equal(Rational(-5), '-5e0'.to_r)
863    assert_equal(Rational(5,3), '5e0/3'.to_r)
864    assert_equal(Rational(-5,3), '-5e0/3'.to_r)
865#    assert_equal(Rational(5,-3), '5e0/-3'.to_r)
866#    assert_equal(Rational(-5,-3), '-5e0/-3'.to_r)
867
868    assert_equal(Rational(5e1), '5e1'.to_r)
869    assert_equal(Rational(-5e2), '-5e2'.to_r)
870    assert_equal(Rational(5e3,3), '5e003/3'.to_r)
871    assert_equal(Rational(-5e4,3), '-5e004/3'.to_r)
872#    assert_equal(Rational(5e1,-3), '5e1/-3'.to_r)
873#    assert_equal(Rational(-5e2,-3), '-5e2/-3'.to_r)
874
875    assert_equal(Rational(33,100), '.33'.to_r)
876    assert_equal(Rational(33,100), '0.33'.to_r)
877    assert_equal(Rational(-33,100), '-.33'.to_r)
878    assert_equal(Rational(-33,100), '-0.33'.to_r)
879    assert_equal(Rational(-33,100), '-0.3_3'.to_r)
880
881    assert_equal(Rational(1,2), '5e-1'.to_r)
882    assert_equal(Rational(50), '5e+1'.to_r)
883    assert_equal(Rational(1,2), '5.0e-1'.to_r)
884    assert_equal(Rational(50), '5.0e+1'.to_r)
885    assert_equal(Rational(50), '5e1'.to_r)
886    assert_equal(Rational(50), '5E1'.to_r)
887    assert_equal(Rational(500), '5e2'.to_r)
888    assert_equal(Rational(5000), '5e3'.to_r)
889    assert_equal(Rational(500000000000), '5e1_1'.to_r)
890
891    assert_equal(Rational(5), Rational('5'))
892    assert_equal(Rational(-5), Rational('-5'))
893    assert_equal(Rational(5,3), Rational('5/3'))
894    assert_equal(Rational(-5,3), Rational('-5/3'))
895#    assert_equal(Rational(5,-3), Rational('5/-3'))
896#    assert_equal(Rational(-5,-3), Rational('-5/-3'))
897
898    assert_equal(Rational(5), Rational('5.0'))
899    assert_equal(Rational(-5), Rational('-5.0'))
900    assert_equal(Rational(5,3), Rational('5.0/3'))
901    assert_equal(Rational(-5,3), Rational('-5.0/3'))
902#    assert_equal(Rational(5,-3), Rational('5.0/-3'))
903#    assert_equal(Rational(-5,-3), Rational('-5.0/-3'))
904
905    assert_equal(Rational(5), Rational('5e0'))
906    assert_equal(Rational(-5), Rational('-5e0'))
907    assert_equal(Rational(5,3), Rational('5e0/3'))
908    assert_equal(Rational(-5,3), Rational('-5e0/3'))
909#    assert_equal(Rational(5,-3), Rational('5e0/-3'))
910#    assert_equal(Rational(-5,-3), Rational('-5e0/-3'))
911
912    assert_equal(Rational(5e1), Rational('5e1'))
913    assert_equal(Rational(-5e2), Rational('-5e2'))
914    assert_equal(Rational(5e3,3), Rational('5e003/3'))
915    assert_equal(Rational(-5e4,3), Rational('-5e004/3'))
916#    assert_equal(Rational(5e1,-3), Rational('5e1/-3'))
917#    assert_equal(Rational(-5e2,-3), Rational('-5e2/-3'))
918
919    assert_equal(Rational(33,100), Rational('.33'))
920    assert_equal(Rational(33,100), Rational('0.33'))
921    assert_equal(Rational(-33,100), Rational('-.33'))
922    assert_equal(Rational(-33,100), Rational('-0.33'))
923    assert_equal(Rational(-33,100), Rational('-0.3_3'))
924
925    assert_equal(Rational(1,2), Rational('5e-1'))
926    assert_equal(Rational(50), Rational('5e+1'))
927    assert_equal(Rational(1,2), Rational('5.0e-1'))
928    assert_equal(Rational(50), Rational('5.0e+1'))
929    assert_equal(Rational(50), Rational('5e1'))
930    assert_equal(Rational(50), Rational('5E1'))
931    assert_equal(Rational(500), Rational('5e2'))
932    assert_equal(Rational(5000), Rational('5e3'))
933    assert_equal(Rational(500000000000), Rational('5e1_1'))
934
935    assert_equal(Rational(0), ''.to_r)
936    assert_equal(Rational(0), ' '.to_r)
937    assert_equal(Rational(5), "\f\n\r\t\v5\0".to_r)
938    assert_equal(Rational(0), '_'.to_r)
939    assert_equal(Rational(0), '_5'.to_r)
940    assert_equal(Rational(5), '5_'.to_r)
941    assert_equal(Rational(5), '5x'.to_r)
942    assert_equal(Rational(5), '5/_3'.to_r)
943    assert_equal(Rational(5,3), '5/3_'.to_r)
944    assert_equal(Rational(5,3), '5/3.3'.to_r)
945    assert_equal(Rational(5,3), '5/3x'.to_r)
946    assert_raise(ArgumentError){ Rational('')}
947    assert_raise(ArgumentError){ Rational('_')}
948    assert_raise(ArgumentError){ Rational("\f\n\r\t\v5\0")}
949    assert_raise(ArgumentError){ Rational('_5')}
950    assert_raise(ArgumentError){ Rational('5_')}
951    assert_raise(ArgumentError){ Rational('5x')}
952    assert_raise(ArgumentError){ Rational('5/_3')}
953    assert_raise(ArgumentError){ Rational('5/3_')}
954    assert_raise(ArgumentError){ Rational('5/3.3')}
955    assert_raise(ArgumentError){ Rational('5/3x')}
956  end
957
958=begin
959  def test_reciprocal
960    assert_equal(Rational(1,9), Rational(9,1).reciprocal)
961    assert_equal(Rational(9,1), Rational(1,9).reciprocal)
962    assert_equal(Rational(-1,9), Rational(-9,1).reciprocal)
963    assert_equal(Rational(-9,1), Rational(-1,9).reciprocal)
964    assert_equal(Rational(1,9), Rational(9,1).inverse)
965    assert_equal(Rational(9,1), Rational(1,9).inverse)
966    assert_equal(Rational(-1,9), Rational(-9,1).inverse)
967    assert_equal(Rational(-9,1), Rational(-1,9).inverse)
968  end
969=end
970
971  def test_to_i
972    assert_equal(1, Rational(3,2).to_i)
973    assert_equal(1, Integer(Rational(3,2)))
974  end
975
976  def test_to_f
977    assert_equal(1.5, Rational(3,2).to_f)
978    assert_equal(1.5, Float(Rational(3,2)))
979  end
980
981  def test_to_c
982    if @complex && !@keiju
983      if @unify
984	assert_equal(Rational(3,2), Rational(3,2).to_c)
985	assert_equal(Rational(3,2), Complex(Rational(3,2)))
986      else
987	assert_equal(Complex(Rational(3,2)), Rational(3,2).to_c)
988	assert_equal(Complex(Rational(3,2)), Complex(Rational(3,2)))
989      end
990    end
991  end
992
993  def test_to_r
994    c = nil.to_r
995    assert_equal([0,1], [c.numerator, c.denominator])
996
997    c = 0.to_r
998    assert_equal([0,1], [c.numerator, c.denominator])
999
1000    c = 1.to_r
1001    assert_equal([1,1], [c.numerator, c.denominator])
1002
1003    c = 1.1.to_r
1004    assert_equal([2476979795053773, 2251799813685248],
1005		 [c.numerator, c.denominator])
1006
1007    c = Rational(1,2).to_r
1008    assert_equal([1,2], [c.numerator, c.denominator])
1009
1010    if @complex
1011      if @keiju
1012	assert_raise(NoMethodError){Complex(1,2).to_r}
1013      else
1014	assert_raise(RangeError){Complex(1,2).to_r}
1015      end
1016    end
1017
1018    if (0.0/0).nan?
1019      assert_raise(FloatDomainError){(0.0/0).to_r}
1020    end
1021    if (1.0/0).infinite?
1022      assert_raise(FloatDomainError){(1.0/0).to_r}
1023    end
1024  end
1025
1026  def test_rationalize
1027    c = nil.rationalize
1028    assert_equal([0,1], [c.numerator, c.denominator])
1029
1030    c = 0.rationalize
1031    assert_equal([0,1], [c.numerator, c.denominator])
1032
1033    c = 1.rationalize
1034    assert_equal([1,1], [c.numerator, c.denominator])
1035
1036    c = 1.1.rationalize
1037    assert_equal([11, 10], [c.numerator, c.denominator])
1038
1039    c = Rational(1,2).rationalize
1040    assert_equal([1,2], [c.numerator, c.denominator])
1041
1042    assert_equal(nil.rationalize(Rational(1,10)), Rational(0))
1043    assert_equal(0.rationalize(Rational(1,10)), Rational(0))
1044    assert_equal(10.rationalize(Rational(1,10)), Rational(10))
1045
1046    r = 0.3333
1047    assert_equal(r.rationalize, Rational(3333, 10000))
1048    assert_equal(r.rationalize(Rational(1,10)), Rational(1,3))
1049    assert_equal(r.rationalize(Rational(-1,10)), Rational(1,3))
1050
1051    r = Rational(5404319552844595,18014398509481984)
1052    assert_equal(r.rationalize, r)
1053    assert_equal(r.rationalize(Rational(1,10)), Rational(1,3))
1054    assert_equal(r.rationalize(Rational(-1,10)), Rational(1,3))
1055
1056    r = -0.3333
1057    assert_equal(r.rationalize, Rational(-3333, 10000))
1058    assert_equal(r.rationalize(Rational(1,10)), Rational(-1,3))
1059    assert_equal(r.rationalize(Rational(-1,10)), Rational(-1,3))
1060
1061    r = Rational(-5404319552844595,18014398509481984)
1062    assert_equal(r.rationalize, r)
1063    assert_equal(r.rationalize(Rational(1,10)), Rational(-1,3))
1064    assert_equal(r.rationalize(Rational(-1,10)), Rational(-1,3))
1065
1066    if @complex
1067      if @keiju
1068      else
1069	assert_raise(RangeError){Complex(1,2).rationalize}
1070      end
1071    end
1072
1073    if (0.0/0).nan?
1074      assert_raise(FloatDomainError){(0.0/0).rationalize}
1075    end
1076    if (1.0/0).infinite?
1077      assert_raise(FloatDomainError){(1.0/0).rationalize}
1078    end
1079  end
1080
1081  def test_gcdlcm
1082    assert_equal(7, 91.gcd(-49))
1083    assert_equal(5, 5.gcd(0))
1084    assert_equal(5, 0.gcd(5))
1085    assert_equal(70, 14.lcm(35))
1086    assert_equal(0, 5.lcm(0))
1087    assert_equal(0, 0.lcm(5))
1088    assert_equal([5,0], 0.gcdlcm(5))
1089    assert_equal([5,0], 5.gcdlcm(0))
1090
1091    assert_equal(1, 1073741827.gcd(1073741789))
1092    assert_equal(1152921470247108503, 1073741827.lcm(1073741789))
1093
1094    assert_equal(1, 1073741789.gcd(1073741827))
1095    assert_equal(1152921470247108503, 1073741789.lcm(1073741827))
1096  end
1097
1098  def test_supp
1099    assert_equal(true, 1.real?)
1100    assert_equal(true, 1.1.real?)
1101
1102    assert_equal(1, 1.numerator)
1103    assert_equal(9, 9.numerator)
1104    assert_equal(1, 1.denominator)
1105    assert_equal(1, 9.denominator)
1106
1107    assert_equal(1.0, 1.0.numerator)
1108    assert_equal(9.0, 9.0.numerator)
1109    assert_equal(1.0, 1.0.denominator)
1110    assert_equal(1.0, 9.0.denominator)
1111
1112=begin
1113    assert_equal(Rational(1,9), 9.reciprocal)
1114    assert_in_delta(0.1111, 9.0.reciprocal, 0.001)
1115    assert_equal(Rational(1,9), 9.inverse)
1116    assert_in_delta(0.1111, 9.0.inverse, 0.001)
1117=end
1118
1119    assert_equal(Rational(1,2), 1.quo(2))
1120    assert_equal(Rational(5000000000), 10000000000.quo(2))
1121    assert_equal(0.5, 1.0.quo(2))
1122    assert_equal(Rational(1,4), Rational(1,2).quo(2))
1123    assert_equal(0, Rational(1,2).quo(Float::INFINITY))
1124    assert(Rational(1,2).quo(0.0).infinite?, '[ruby-core:31626]')
1125
1126    assert_equal(0.5, 1.fdiv(2))
1127    assert_equal(5000000000.0, 10000000000.fdiv(2))
1128    assert_equal(0.5, 1.0.fdiv(2))
1129    assert_equal(0.25, Rational(1,2).fdiv(2))
1130  end
1131
1132  def test_ruby19
1133    assert_raise(NoMethodError){ Rational.new(1) }
1134    assert_raise(NoMethodError){ Rational.new!(1) }
1135  end
1136
1137  def test_fixed_bug
1138    if @unify
1139      assert_instance_of(Fixnum, Rational(1,2) ** 0) # mathn's bug
1140    end
1141
1142    n = Float::MAX.to_i * 2
1143    assert_equal(1.0, Rational(n + 2, n + 1).to_f, '[ruby-dev:33852]')
1144  end
1145
1146  def test_power_of_1_and_minus_1
1147    bug5715 = '[ruby-core:41498]'
1148    big = 1 << 66
1149    one = Rational( 1, 1)
1150    assert_eql  one,   one  ** -big     , bug5715
1151    assert_eql  one, (-one) ** -big     , bug5715
1152    assert_eql -one, (-one) ** -(big+1) , bug5715
1153    assert_equal Complex, ((-one) ** Rational(1,3)).class
1154  end
1155
1156  def test_power_of_0
1157    bug5713 = '[ruby-core:41494]'
1158    big = 1 << 66
1159    zero = Rational(0, 1)
1160    assert_eql zero, zero ** big
1161    assert_eql zero, zero ** Rational(2, 3)
1162    assert_raise(ZeroDivisionError, bug5713) { Rational(0, 1) ** -big }
1163    assert_raise(ZeroDivisionError, bug5713) { Rational(0, 1) ** Rational(-2,3) }
1164  end
1165
1166  def test_known_bug
1167  end
1168
1169end
1170