diff options
Diffstat (limited to 'spec/ruby/core/kernel/Integer_spec.rb')
-rw-r--r-- | spec/ruby/core/kernel/Integer_spec.rb | 201 |
1 files changed, 103 insertions, 98 deletions
diff --git a/spec/ruby/core/kernel/Integer_spec.rb b/spec/ruby/core/kernel/Integer_spec.rb index 74bea7ca09..74dd3e0dd2 100644 --- a/spec/ruby/core/kernel/Integer_spec.rb +++ b/spec/ruby/core/kernel/Integer_spec.rb @@ -10,29 +10,18 @@ describe :kernel_integer, shared: true do Integer(100).should == 100 end - ruby_version_is ""..."2.6" do - it "uncritically return the value of to_int even if it is not an Integer" do - obj = mock("object") - obj.should_receive(:to_int).and_return("1") - obj.should_not_receive(:to_i) - Integer(obj).should == "1" - end + it "raises a TypeError when to_int returns not-an-Integer object and to_i returns nil" do + obj = mock("object") + obj.should_receive(:to_int).and_return("1") + obj.should_receive(:to_i).and_return(nil) + -> { Integer(obj) }.should raise_error(TypeError) end - ruby_version_is "2.6" do - it "raises a TypeError when to_int returns not-an-Integer object and to_i returns nil" do - obj = mock("object") - obj.should_receive(:to_int).and_return("1") - obj.should_receive(:to_i).and_return(nil) - -> { Integer(obj) }.should raise_error(TypeError) - end - - it "return a result of to_i when to_int does not return an Integer" do - obj = mock("object") - obj.should_receive(:to_int).and_return("1") - obj.should_receive(:to_i).and_return(42) - Integer(obj).should == 42 - end + it "return a result of to_i when to_int does not return an Integer" do + obj = mock("object") + obj.should_receive(:to_int).and_return("1") + obj.should_receive(:to_i).and_return(42) + Integer(obj).should == 42 end it "raises a TypeError when passed nil" do @@ -100,65 +89,63 @@ describe :kernel_integer, shared: true do -> { Integer(infinity_value) }.should raise_error(FloatDomainError) end - ruby_version_is "2.6" do - describe "when passed exception: false" do - describe "and to_i returns a value that is not an Integer" do - it "swallows an error" do - obj = mock("object") - obj.should_receive(:to_i).and_return("1") - Integer(obj, exception: false).should == nil - end + describe "when passed exception: false" do + describe "and to_i returns a value that is not an Integer" do + it "swallows an error" do + obj = mock("object") + obj.should_receive(:to_i).and_return("1") + Integer(obj, exception: false).should == nil end + end - describe "and no to_int or to_i methods exist" do - it "swallows an error" do - obj = mock("object") - Integer(obj, exception: false).should == nil - end + describe "and no to_int or to_i methods exist" do + it "swallows an error" do + obj = mock("object") + Integer(obj, exception: false).should == nil end + end - describe "and to_int returns nil and no to_i exists" do - it "swallows an error" do - obj = mock("object") - obj.should_receive(:to_i).and_return(nil) - Integer(obj, exception: false).should == nil - end + describe "and to_int returns nil and no to_i exists" do + it "swallows an error" do + obj = mock("object") + obj.should_receive(:to_i).and_return(nil) + Integer(obj, exception: false).should == nil end + end - describe "and passed NaN" do - it "swallows an error" do - Integer(nan_value, exception: false).should == nil - end + describe "and passed NaN" do + it "swallows an error" do + Integer(nan_value, exception: false).should == nil end + end - describe "and passed Infinity" do - it "swallows an error" do - Integer(infinity_value, exception: false).should == nil - end + describe "and passed Infinity" do + it "swallows an error" do + Integer(infinity_value, exception: false).should == nil end + end - describe "and passed nil" do - it "swallows an error" do - Integer(nil, exception: false).should == nil - end + describe "and passed nil" do + it "swallows an error" do + Integer(nil, exception: false).should == nil end + end - describe "and passed a String that contains numbers" do - it "normally parses it and returns an Integer" do - Integer("42", exception: false).should == 42 - end + describe "and passed a String that contains numbers" do + it "normally parses it and returns an Integer" do + Integer("42", exception: false).should == 42 end + end - describe "and passed a String that can't be converted to an Integer" do - it "swallows an error" do - Integer("abc", exception: false).should == nil - end + describe "and passed a String that can't be converted to an Integer" do + it "swallows an error" do + Integer("abc", exception: false).should == nil end end end end -describe "Integer() given a String", shared: true do +describe :kernel_integer_string, shared: true do it "raises an ArgumentError if the String is a null byte" do -> { Integer("\0") }.should raise_error(ArgumentError) end @@ -246,30 +233,28 @@ describe "Integer() given a String", shared: true do -> { Integer("") }.should raise_error(ArgumentError) end - ruby_version_is "2.6" do - describe "when passed exception: false" do - describe "and multiple leading -s" do - it "swallows an error" do - Integer("---1", exception: false).should == nil - end + describe "when passed exception: false" do + describe "and multiple leading -s" do + it "swallows an error" do + Integer("---1", exception: false).should == nil end + end - describe "and multiple trailing -s" do - it "swallows an error" do - Integer("1---", exception: false).should == nil - end + describe "and multiple trailing -s" do + it "swallows an error" do + Integer("1---", exception: false).should == nil end + end - describe "and an argument that contains a period" do - it "swallows an error" do - Integer("0.0", exception: false).should == nil - end + describe "and an argument that contains a period" do + it "swallows an error" do + Integer("0.0", exception: false).should == nil end + end - describe "and an empty string" do - it "swallows an error" do - Integer("", exception: false).should == nil - end + describe "and an empty string" do + it "swallows an error" do + Integer("", exception: false).should == nil end end end @@ -363,7 +348,7 @@ describe "Integer() given a String", shared: true do end end -describe "Integer() given a String and base", shared: true do +describe :kernel_integer_string_base, shared: true do it "raises an ArgumentError if the String is a null byte" do -> { Integer("\0", 2) }.should raise_error(ArgumentError) end @@ -588,26 +573,46 @@ describe "Integer() given a String and base", shared: true do -> { Integer("0#{d}1", base) }.should raise_error(ArgumentError) end end + end + + it "raises an ArgumentError if a base is given for a non-String value" do + -> { Integer(98, 15) }.should raise_error(ArgumentError) + end + + it "tries to convert the base to an integer using to_int" do + obj = mock('8') + obj.should_receive(:to_int).and_return(8) + + Integer("777", obj).should == 0777 + end + + # https://bugs.ruby-lang.org/issues/19349 + ruby_version_is ''...'3.3' do + it "ignores the base if it is not an integer and does not respond to #to_i" do + Integer("777", "8").should == 777 + end + end - it "raises an ArgumentError if a base is given for a non-String value" do - -> { Integer(98, 15) }.should raise_error(ArgumentError) + ruby_version_is '3.3' do + it "raises a TypeError if it is not an integer and does not respond to #to_i" do + -> { + Integer("777", "8") + }.should raise_error(TypeError, "no implicit conversion of String into Integer") end end - ruby_version_is "2.6" do - describe "when passed exception: false" do - describe "and valid argument" do - it "returns an Integer number" do - Integer("100", 10, exception: false).should == 100 - Integer("100", 2, exception: false).should == 4 - end + describe "when passed exception: false" do + describe "and valid argument" do + it "returns an Integer number" do + Integer("100", 10, exception: false).should == 100 + Integer("100", 2, exception: false).should == 4 end + end - describe "and invalid argument" do - it "swallows an error" do - Integer("999", 2, exception: false).should == nil - Integer("abc", 10, exception: false).should == nil - end + describe "and invalid argument" do + it "swallows an error" do + Integer("999", 2, exception: false).should == nil + Integer("abc", 10, exception: false).should == nil end end end @@ -794,9 +799,9 @@ describe "Kernel.Integer" do # TODO: fix these specs it_behaves_like :kernel_integer, :Integer, Kernel - it_behaves_like "Integer() given a String", :Integer + it_behaves_like :kernel_integer_string, :Integer - it_behaves_like "Integer() given a String and base", :Integer + it_behaves_like :kernel_integer_string_base, :Integer it "is a public method" do Kernel.Integer(10).should == 10 @@ -808,9 +813,9 @@ describe "Kernel#Integer" do # TODO: fix these specs it_behaves_like :kernel_integer, :Integer, Object.new - it_behaves_like "Integer() given a String", :Integer + it_behaves_like :kernel_integer_string, :Integer - it_behaves_like "Integer() given a String and base", :Integer + it_behaves_like :kernel_integer_string_base, :Integer it "is a private method" do Kernel.should have_private_instance_method(:Integer) |