From a34db218ade33b79e7404488db5a15bad2841c25 Mon Sep 17 00:00:00 2001 From: eregon Date: Wed, 27 Dec 2017 16:12:47 +0000 Subject: Update to ruby/spec@0fe33ac git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61504 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- spec/ruby/shared/complex/Complex.rb | 2 +- .../rational/arithmetic_exception_in_coerce.rb | 33 ++++++++++++++++++++++ spec/ruby/shared/rational/comparison.rb | 32 +++++++++++++++++++++ 3 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 spec/ruby/shared/rational/arithmetic_exception_in_coerce.rb (limited to 'spec/ruby/shared') 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 -- cgit v1.2.3