summaryrefslogtreecommitdiff
path: root/spec/ruby/shared
diff options
context:
space:
mode:
Diffstat (limited to 'spec/ruby/shared')
-rw-r--r--spec/ruby/shared/complex/Complex.rb2
-rw-r--r--spec/ruby/shared/rational/arithmetic_exception_in_coerce.rb33
-rw-r--r--spec/ruby/shared/rational/comparison.rb32
3 files changed, 66 insertions, 1 deletions
diff --git a/spec/ruby/shared/complex/Complex.rb b/spec/ruby/shared/complex/Complex.rb
index 5a9715b161..15feb65754 100644
--- a/spec/ruby/shared/complex/Complex.rb
+++ b/spec/ruby/shared/complex/Complex.rb
@@ -72,7 +72,7 @@ describe :kernel_Complex, shared: true do
describe "when passed a Numeric which responds to #real? with false" do
it "returns the passed argument" do
n = mock_numeric("unreal")
- n.should_receive(:real?).and_return(false)
+ n.should_receive(:real?).any_number_of_times.and_return(false)
Complex(n).should equal(n)
end
end
diff --git a/spec/ruby/shared/rational/arithmetic_exception_in_coerce.rb b/spec/ruby/shared/rational/arithmetic_exception_in_coerce.rb
new file mode 100644
index 0000000000..0b09ec5265
--- /dev/null
+++ b/spec/ruby/shared/rational/arithmetic_exception_in_coerce.rb
@@ -0,0 +1,33 @@
+require File.expand_path('../../../fixtures/rational', __FILE__)
+
+describe :rational_arithmetic_exception_in_coerce, shared: true do
+ ruby_version_is ""..."2.5" do
+ it "rescues exception (StandardError and subclasses) raised in other#coerce and raises TypeError" do
+ b = mock("numeric with failed #coerce")
+ b.should_receive(:coerce).and_raise(RationalSpecs::CoerceError)
+
+ # e.g. Rational(3, 4) + b
+ -> { Rational(3, 4).send(@method, b) }.should raise_error(TypeError, /MockObject can't be coerced into Rational/)
+ end
+
+ it "does not rescue Exception and StandardError siblings raised in other#coerce" do
+ [Exception, NoMemoryError].each do |exception|
+ b = mock("numeric with failed #coerce")
+ b.should_receive(:coerce).and_raise(exception)
+
+ # e.g. Rational(3, 4) + b
+ -> { Rational(3, 4).send(@method, b) }.should raise_error(exception)
+ end
+ end
+ end
+
+ ruby_version_is "2.5" do
+ it "does not rescue exception raised in other#coerce" do
+ b = mock("numeric with failed #coerce")
+ b.should_receive(:coerce).and_raise(RationalSpecs::CoerceError)
+
+ # e.g. Rational(3, 4) + b
+ -> { Rational(3, 4).send(@method, b) }.should raise_error(RationalSpecs::CoerceError)
+ end
+ end
+end
diff --git a/spec/ruby/shared/rational/comparison.rb b/spec/ruby/shared/rational/comparison.rb
index c52363781f..ba2d0e9f20 100644
--- a/spec/ruby/shared/rational/comparison.rb
+++ b/spec/ruby/shared/rational/comparison.rb
@@ -1,4 +1,5 @@
require File.expand_path('../../../spec_helper', __FILE__)
+require File.expand_path('../../../fixtures/rational', __FILE__)
describe :rational_cmp_rat, shared: true do
it "returns 1 when self is greater than the passed argument" do
@@ -78,6 +79,37 @@ describe :rational_cmp_coerce, shared: true do
end
end
+describe :rational_cmp_coerce_exception, shared: true do
+ ruby_version_is ""..."2.5" do
+ it "rescues exception (StandardError and subclasses) raised in other#coerce and returns nil" do
+ b = mock("numeric with failed #coerce")
+ b.should_receive(:coerce).and_raise(RationalSpecs::CoerceError)
+
+ -> {
+ (Rational(3, 4) <=> b).should == nil
+ }.should complain(/Numerical comparison operators will no more rescue exceptions of #coerce/)
+ end
+
+ it "does not rescue Exception and StandardError siblings raised in other#coerce" do
+ [Exception, NoMemoryError].each do |exception|
+ b = mock("numeric with failed #coerce")
+ b.should_receive(:coerce).and_raise(exception)
+
+ -> { Rational(3, 4) <=> b }.should raise_error(exception)
+ end
+ end
+ end
+
+ ruby_version_is "2.5" do
+ it "does not rescue exception raised in other#coerce" do
+ b = mock("numeric with failed #coerce")
+ b.should_receive(:coerce).and_raise(RationalSpecs::CoerceError)
+
+ -> { Rational(3, 4) <=> b }.should raise_error(RationalSpecs::CoerceError)
+ end
+ end
+end
+
describe :rational_cmp_other, shared: true do
it "returns nil" do
(Rational <=> mock("Object")).should be_nil