diff options
author | mame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-03-25 15:30:56 +0000 |
---|---|---|
committer | mame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-03-25 15:30:56 +0000 |
commit | 43a2aaea2f307ed50fa059affa797a01ba62320d (patch) | |
tree | 0b7ed70d891e9b3ea994d063faecdf40293d583b /test | |
parent | 2d656b7d2851df5cae8052f906150b01983cb32b (diff) |
* test/ruby/test_rational.rb: add tests to achieve over 90% test
coverage of rational.c.
* test/ruby/test_complex.rb: ditto for complex.c.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15840 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test')
-rw-r--r-- | test/ruby/test_complex.rb | 127 | ||||
-rw-r--r-- | test/ruby/test_rational.rb | 104 |
2 files changed, 230 insertions, 1 deletions
diff --git a/test/ruby/test_complex.rb b/test/ruby/test_complex.rb index b4912e6231..e977e7a058 100644 --- a/test/ruby/test_complex.rb +++ b/test/ruby/test_complex.rb @@ -314,7 +314,7 @@ class Complex_Test < Test::Unit::TestCase end end - def test_sub + def test_sub2 c = Complex(1,2) c2 = Complex(2,3) @@ -723,6 +723,7 @@ class Complex_Test < Test::Unit::TestCase assert_equal(Complex(Rational(-1,5),Rational(-3,2)), '-1/5-(3/2)i'.to_c) end + assert_equal(Complex(5, 3), Complex('5', '3')) end def test_respond @@ -1004,6 +1005,130 @@ class Complex_Test < Test::Unit::TestCase end + def test_canonicalize + f = defined?(Complex::Unify) + Complex.const_set(:Unify, true) unless f + + assert_same(1, Complex.instance_eval { new(1, 0) }) + assert_not_same(1.0, Complex.instance_eval { new(1.0, 0) }) + assert_equal(Complex(1.0, 0), Complex.instance_eval { new(1.0, 0) }) + + Complex.instance_eval { remove_const(:Unify) } unless f + end + + def test_polar + c = Complex.polar(2, 2) + assert_in_delta(2*Math.cos(2), c.real , 0.001) + assert_in_delta(2*Math.sin(2), c.image, 0.001) + + c = Complex.polar(1, Complex(0, 1)) + assert_in_delta(1/Math::E, c.real , 0.001) + assert_in_delta( 0, c.image, 0.001) + end + + def test_generic? + assert_equal(true, Complex.generic?(1)) + assert_equal(true, Complex.generic?(2**100)) + assert_equal(true, Complex.generic?(Rational(1, 2))) + assert_equal(true, Complex.generic?(1.0)) + assert_equal(false, Complex.generic?(Complex(1, 1))) + end + + def test_new_bang2 + o = Object.new + def o.to_i; 1; end + assert_equal(Complex(1, 1), Complex.instance_eval { new!(o, o) }) + end + + def test_denominator + f = defined?(Complex::Unify) + unify_val = f && Complex::Unify + Complex.instance_eval { remove_const(:Unify) } if f + + dummy_rational = Class.new(Rational) + o1 = dummy_rational.instance_eval { new(1, 1) } + o2 = dummy_rational.instance_eval { new(1, 1) } + d1 = d2 = nil + class << o1; self; end.instance_eval { define_method(:denominator) { d1 } rescue nil } + class << o2; self; end.instance_eval { define_method(:denominator) { d2 } rescue nil } + # o1.denominator returns d1 and o1.denominator returns d2 + + c = Complex(o1, o2) + + d1 = d2 = 0 + assert_equal(0, c.denominator) + + d1 = d2 = -1 + assert_equal(1, c.denominator) + + d1 = d2 = 256 + assert_equal(256, c.denominator) + + d1, d2 = 512, 256 + assert_equal(512, c.denominator) + + d1, d2 = 256, 512 + assert_equal(512, c.denominator) + + d1, d2 = -(2**100), -(3**100) + assert_equal(6**100, c.denominator) + + d1, d2 = 1, 2**100 + assert_equal(2**100, c.denominator) + + Complex.const_set(:Unify, unify_val) if f + end + + def test_abs + b = 2**100 + def b.*(x); self; end rescue nil + def b.+(x); -1; end rescue nil + assert_equal(Complex(0, 1), Complex(b, 1).abs) + + def b.+(x); Complex(0, 1); end rescue nil + c = Complex(b, 1).abs + assert_in_delta(1/Math.sqrt(2), c.real , 0.001) + assert_in_delta(1/Math.sqrt(2), c.image, 0.001) + + def b.+(x); Complex(0, -1); end rescue nil + c = Complex(b, 1).abs + assert_in_delta( 1/Math.sqrt(2), c.real , 0.001) + assert_in_delta(-1/Math.sqrt(2), c.image, 0.001) + + inf = 1.0/0.0 + nan = inf/inf + assert_raise(Errno::EDOM, Errno::ERANGE) { Complex(1, nan).abs } + end + + def test_coerce + c = Complex(6, 3) + assert_equal(Complex(42, 0), c.coerce(42).first) + assert_raise(TypeError) { c.coerce(Object.new) } + + o = Object.new + def o.coerce(x); [x.real, x.image]; end + assert_equal(9, c + o) + assert_equal(3, c - o) + assert_equal(18, c * o) + assert_equal(2, c / o) + assert_equal(216, c ** o) + end + + def test_add2 + assert_equal(Complex(2**100, 1), Complex(0, 1) + 2**100) + end + + def test_mul2 + assert_equal(Complex(0.0, 0.0), Complex(1.0, 1.0) * 0) + assert_equal(Complex(0, 0), Complex(0, 0) * (2**100)) + end + + def test_expt2 + assert_equal(Complex(1, 0), Complex(2, 2) ** 0) + assert_equal(Complex(0, -1), Complex(0, 1) ** (2**100-1)) + assert_equal(Complex(1, 0), Complex(1, 0) ** Rational(1, 2**100)) + end + def test_fixed_bug if defined?(Rational) && !Rational.instance_variable_get('@RCS_ID') assert_equal(Complex(1), 1 ** Complex(1)) diff --git a/test/ruby/test_rational.rb b/test/ruby/test_rational.rb index f039a3c36e..3fefa766b1 100644 --- a/test/ruby/test_rational.rb +++ b/test/ruby/test_rational.rb @@ -686,6 +686,8 @@ class Rational_Test < Test::Unit::TestCase assert_equal(true, Rational(2,1) != Rational(1)) assert_equal(false, Rational(1) == nil) assert_equal(false, Rational(1) == '') + + assert_equal(false, Rational(1,2**100) == 1) end def test_unify @@ -955,6 +957,108 @@ class Rational_Test < Test::Unit::TestCase assert_equal(0.25, Rational(1,2).fdiv(2)) end + def test_zero_div + assert_raise(ZeroDivisionError) { Rational(1, 0) } + assert_raise(ZeroDivisionError) { Rational(1, 1) / 0 } + end + + def test_gcd + assert_equal(0, Rational(0, 2**100)) + end + + def test_unify + f = defined?(Rational::Unify) + Rational.const_set(:Unify, true) unless f + + assert_same(42, Rational(84, 2)) + assert_same(1, Rational(1, 2) + Rational(1, 2)) + + Rational.instance_eval { remove_const(:Unify) } unless f + end + + def test_coerce + r = Rational(7, 3) + assert_equal(Rational(42, 1), r.coerce(42).first) + assert_raise(TypeError) { r.coerce(Object.new) } + + o = Object.new + def o.coerce(x); [x.numerator, x.denominator]; end + assert_equal(10, r + o) + assert_equal(4, r - o) + assert_equal(21, r * o) + assert_equal(2, r / o) + assert_equal(343, r ** o) + assert_equal(1, r <=> o) + + b = 2**100 + def b.<=>(x); 0; end rescue nil + assert_equal(1, r ** b) + b = 2**100 + def b.**(x); -1; end rescue nil + assert_equal(-1, Rational(1, b)**3) + end + + def test_modulo_remainder + assert_equal(Rational(1, 2), Rational(5, 2).modulo(1)) + assert_equal(Rational(1, 2), Rational(5, 2).modulo(2)) + assert_equal(Rational(5, 2), Rational(5, 2).modulo(3)) + assert_equal(Rational(5, 6), Rational(5, 2).modulo(Rational(5, 3))) + assert_equal(Rational(1, 2), Rational(-5, 2).modulo(1)) + assert_equal(Rational(-1, 2), Rational(5, 2).modulo(-1)) + assert_equal(Rational(-1, 2), Rational(-5, 2).modulo(-1)) + + assert_equal(Rational(1, 2), Rational(5, 2).remainder(1)) + assert_equal(Rational(1, 2), Rational(5, 2).remainder(2)) + assert_equal(Rational(5, 2), Rational(5, 2).remainder(3)) + assert_equal(Rational(5, 6), Rational(5, 2).remainder(Rational(5, 3))) + assert_equal(Rational(-1, 2), Rational(-5, 2).remainder(1)) + assert_equal(Rational(1, 2), Rational(5, 2).remainder(-1)) + assert_equal(Rational(-1, 2), Rational(-5, 2).remainder(-1)) + end + + def test_abs + assert_equal(Rational(1, 2), Rational(1, 2).abs) + assert_equal(Rational(1, 2), Rational(-1, 2).abs) + end + + def test_floor_ceil_truncate_round + assert_equal( 2, Rational( 5, 2).floor) + assert_equal(-3, Rational(-5, 2).floor) + assert_equal( 3, Rational( 5, 2).ceil) + assert_equal(-2, Rational(-5, 2).ceil) + assert_equal( 2, Rational( 5, 2).truncate) + assert_equal(-2, Rational(-5, 2).truncate) + assert_equal( 3, Rational( 5, 2).round) + assert_equal(-3, Rational(-5, 2).round) + assert_equal( 1, Rational( 4, 3).round) + assert_equal(-1, Rational(-4, 3).round) + assert_equal( 2, Rational( 5, 3).round) + assert_equal(-2, Rational(-5, 3).round) + end + + def test_convert + assert_equal(Rational(1, 2), Rational(Complex(1, 0), 2)) + assert_raise(RangeError) { Rational(Complex(1, 1), 1) } + assert_equal(Rational(1, 2), Rational(1, Complex(2, 0))) + assert_raise(RangeError) { Rational(1, Complex(2, 1)) } + assert_equal(Rational(1, 2), Rational(0.25, 0.5)) + assert_equal(Rational(1, 2), Rational('1', '2')) + end + + def test_add2 + assert_equal(Rational(2**100, 3), Rational(0, 1) + Rational(2**100, 3)) + assert_equal(Rational(2, 3**100), Rational(0, 1) + Rational(2, 3**100)) + end + + def test_div2 + assert_raise(ZeroDivisionError) { Rational(1, 1) / Rational(0, 1) } + end + + def test_to_f2 + assert_equal(1, Rational(2**5000,3).to_f.infinite?) + assert_equal(0, Rational(1, 2**5000).to_f) + end + def test_fixed_bug if defined?(Rational::Unify) assert_instance_of(Fixnum, Rational(1,2) ** 0) # mathn's bug |