OSDN Git Service

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