diff options
Diffstat (limited to 'spec/ruby/shared')
-rw-r--r-- | spec/ruby/shared/complex/Complex.rb | 2 | ||||
-rw-r--r-- | spec/ruby/shared/rational/arithmetic_exception_in_coerce.rb | 33 | ||||
-rw-r--r-- | spec/ruby/shared/rational/comparison.rb | 32 |
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 |