summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rational.c4
-rw-r--r--test/-ext-/rational/test_rat.rb24
2 files changed, 28 insertions, 0 deletions
diff --git a/rational.c b/rational.c
index 0261c6940a..1cd4ecc307 100644
--- a/rational.c
+++ b/rational.c
@@ -1927,6 +1927,10 @@ rb_gcdlcm(VALUE self, VALUE other)
VALUE
rb_rational_raw(VALUE x, VALUE y)
{
+ if (! RB_INTEGER_TYPE_P(x))
+ x = rb_to_int(x);
+ if (! RB_INTEGER_TYPE_P(y))
+ y = rb_to_int(y);
if (INT_NEGATIVE_P(y)) {
x = rb_int_uminus(x);
y = rb_int_uminus(y);
diff --git a/test/-ext-/rational/test_rat.rb b/test/-ext-/rational/test_rat.rb
index dbba00ca61..7683483e66 100644
--- a/test/-ext-/rational/test_rat.rb
+++ b/test/-ext-/rational/test_rat.rb
@@ -42,5 +42,29 @@ class TestRational < Test::Unit::TestCase
rat = Rational.raw(1, -2)
assert_equal(-1, rat.numerator)
assert_equal(2, rat.denominator)
+
+ assert_equal(1/2r, Rational.raw(1.0, 2.0))
+
+ assert_raise(TypeError) { Rational.raw("1", 2) }
+ assert_raise(TypeError) { Rational.raw(1, "2") }
+
+ class << (o = Object.new)
+ def to_i; 42; end
+ end
+
+ assert_raise(TypeError) { Rational.raw(o, 2) }
+ assert_raise(TypeError) { Rational.raw(1, o) }
+
+ class << (o = Object.new)
+ def to_int; 42; end
+ end
+
+ rat = Rational.raw(o, 2)
+ assert_equal(42, rat.numerator)
+ assert_equal(2, rat.denominator)
+
+ rat = Rational.raw(2, o)
+ assert_equal(2, rat.numerator)
+ assert_equal(42, rat.denominator)
end
end