1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
This commit is contained in:
Benoit Daloze 2022-01-28 14:42:38 +01:00
parent bb5f710887
commit e0c5488ff9
56 changed files with 531 additions and 137 deletions

View file

@ -94,6 +94,7 @@ module DirSpecs
special/.txt special/.txt
special/\a special/\a
] ]
@mock_dir_files << "special/_\u{1f60e}.erb"
end end
end end

View file

@ -39,5 +39,38 @@ describe "Dir#read" do
entries.sort.should == DirSpecs.expected_paths entries.sort.should == DirSpecs.expected_paths
end end
platform_is_not :windows do
it "returns all directory entries even when encoding conversion will fail" do
dir = Dir.open(File.join(DirSpecs.mock_dir, 'special'))
utf8_entries = []
begin
while entry = dir.read
utf8_entries << entry
end
ensure
dir.close
end
old_internal_encoding = Encoding::default_internal
old_external_encoding = Encoding::default_external
Encoding.default_internal = Encoding::UTF_8
Encoding.default_external = Encoding::SHIFT_JIS
dir = Dir.open(File.join(DirSpecs.mock_dir, 'special'))
shift_jis_entries = []
begin
-> {
while entry = dir.read
shift_jis_entries << entry
end
}.should_not raise_error
ensure
dir.close
Encoding.default_internal = old_internal_encoding
Encoding.default_external = old_external_encoding
end
shift_jis_entries.size.should == utf8_entries.size
shift_jis_entries.filter { |f| f.encoding == Encoding::SHIFT_JIS }.size.should == 1
end
end
it_behaves_like :dir_closed, :read it_behaves_like :dir_closed, :read
end end

View file

@ -131,7 +131,6 @@ describe "Enumerable#all?" do
pattern.yielded.should == [[0], [1], [2], [-1]] pattern.yielded.should == [[0], [1], [2], [-1]]
end end
# may raise an exception in future versions
it "always returns true on empty enumeration" do it "always returns true on empty enumeration" do
@empty.all?(Integer).should == true @empty.all?(Integer).should == true
[].all?(Integer).should == true [].all?(Integer).should == true

View file

@ -145,7 +145,6 @@ describe "Enumerable#any?" do
pattern.yielded.should == [[0], [1], [2]] pattern.yielded.should == [[0], [1], [2]]
end end
# may raise an exception in future versions
it "always returns false on empty enumeration" do it "always returns false on empty enumeration" do
@empty.any?(Integer).should == false @empty.any?(Integer).should == false
[].any?(Integer).should == false [].any?(Integer).should == false

View file

@ -100,7 +100,6 @@ describe "Enumerable#none?" do
pattern.yielded.should == [[0], [1], [2], [-1]] pattern.yielded.should == [[0], [1], [2], [-1]]
end end
# may raise an exception in future versions
it "always returns true on empty enumeration" do it "always returns true on empty enumeration" do
@empty.none?(Integer).should == true @empty.none?(Integer).should == true
[].none?(Integer).should == true [].none?(Integer).should == true

View file

@ -91,7 +91,6 @@ describe "Enumerable#one?" do
pattern.yielded.should == [[0], [1], [2], [-1]] pattern.yielded.should == [[0], [1], [2], [-1]]
end end
# may raise an exception in future versions
it "always returns false on empty enumeration" do it "always returns false on empty enumeration" do
@empty.one?(Integer).should == false @empty.one?(Integer).should == false
[].one?(Integer).should == false [].one?(Integer).should == false

View file

@ -9,10 +9,10 @@ describe "Float#coerce" do
1.0.coerce(3.14).should == [3.14, 1.0] 1.0.coerce(3.14).should == [3.14, 1.0]
a, b = -0.0.coerce(bignum_value) a, b = -0.0.coerce(bignum_value)
a.should be_close(9223372036854775808.0, TOLERANCE) a.should be_close(18446744073709551616.0, TOLERANCE)
b.should be_close(-0.0, TOLERANCE) b.should be_close(-0.0, TOLERANCE)
a, b = 1.0.coerce(bignum_value) a, b = 1.0.coerce(bignum_value)
a.should be_close(9223372036854775808.0, TOLERANCE) a.should be_close(18446744073709551616.0, TOLERANCE)
b.should be_close(1.0, TOLERANCE) b.should be_close(1.0, TOLERANCE)
end end
end end

View file

@ -10,7 +10,7 @@ describe "Float#divmod" do
values[1].should be_close(2.8284, TOLERANCE) values[1].should be_close(2.8284, TOLERANCE)
values = -1.0.divmod(bignum_value) values = -1.0.divmod(bignum_value)
values[0].should eql(-1) values[0].should eql(-1)
values[1].should be_close(9223372036854775808.000, TOLERANCE) values[1].should be_close(18446744073709551616.0, TOLERANCE)
values = -1.0.divmod(1) values = -1.0.divmod(1)
values[0].should eql(-1) values[0].should eql(-1)
values[1].should eql(0.0) values[1].should eql(0.0)

View file

@ -6,7 +6,7 @@ describe "Float#-" do
it "returns self minus other" do it "returns self minus other" do
(9_237_212.5280 - 5_280).should be_close(9231932.528, TOLERANCE) (9_237_212.5280 - 5_280).should be_close(9231932.528, TOLERANCE)
(2_560_496.1691 - bignum_value).should be_close(-9223372036852215808.000, TOLERANCE) (2_560_496.1691 - bignum_value).should be_close(-18446744073706991616.0, TOLERANCE)
(5.5 - 5.5).should be_close(0.0,TOLERANCE) (5.5 - 5.5).should be_close(0.0,TOLERANCE)
end end
end end

View file

@ -7,7 +7,7 @@ describe "Float#*" do
it "returns self multiplied by other" do it "returns self multiplied by other" do
(4923.98221 * 2).should be_close(9847.96442, TOLERANCE) (4923.98221 * 2).should be_close(9847.96442, TOLERANCE)
(6712.5 * 0.25).should be_close(1678.125, TOLERANCE) (6712.5 * 0.25).should be_close(1678.125, TOLERANCE)
(256.4096 * bignum_value).should be_close(2364961134621118431232.000, TOLERANCE) (256.4096 * bignum_value).should be_close(4729922269242236862464.0, TOLERANCE)
end end
it "raises a TypeError when given a non-Numeric" do it "raises a TypeError when given a non-Numeric" do

View file

@ -6,7 +6,7 @@ describe "Float#+" do
it "returns self plus other" do it "returns self plus other" do
(491.213 + 2).should be_close(493.213, TOLERANCE) (491.213 + 2).should be_close(493.213, TOLERANCE)
(9.99 + bignum_value).should be_close(9223372036854775808.000, TOLERANCE) (9.99 + bignum_value).should be_close(18446744073709551616.0, TOLERANCE)
(1001.99 + 5.219).should be_close(1007.209, TOLERANCE) (1001.99 + 5.219).should be_close(1007.209, TOLERANCE)
end end
end end

View file

@ -73,7 +73,6 @@ describe "Hash#transform_keys!" do
@hash.should == { 'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4 } @hash.should == { 'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4 }
end end
# https://bugs.ruby-lang.org/issues/14380
it "prevents conflicts between new keys and old ones" do it "prevents conflicts between new keys and old ones" do
@hash.transform_keys!(&:succ) @hash.transform_keys!(&:succ)
@hash.should == { b: 1, c: 2, d: 3, e: 4 } @hash.should == { b: 1, c: 2, d: 3, e: 4 }

View file

@ -55,24 +55,24 @@ describe "Integer#&" do
@bignum = bignum_value(5) @bignum = bignum_value(5)
(@bignum & 3).should == 1 (@bignum & 3).should == 1
(@bignum & 52).should == 4 (@bignum & 52).should == 4
(@bignum & bignum_value(9921)).should == 9223372036854775809 (@bignum & bignum_value(9921)).should == 18446744073709551617
((2*bignum_value) & 1).should == 0 ((2*bignum_value) & 1).should == 0
((2*bignum_value) & (2*bignum_value)).should == 18446744073709551616 ((2*bignum_value) & (2*bignum_value)).should == 36893488147419103232
end end
it "returns self bitwise AND other when one operand is negative" do it "returns self bitwise AND other when one operand is negative" do
((2*bignum_value) & -1).should == (2*bignum_value) ((2*bignum_value) & -1).should == (2*bignum_value)
((4*bignum_value) & -1).should == (4*bignum_value) ((4*bignum_value) & -1).should == (4*bignum_value)
(@bignum & -0xffffffffffffff5).should == 9223372036854775809 (@bignum & -0xffffffffffffff5).should == 18446744073709551617
(@bignum & -@bignum).should == 1 (@bignum & -@bignum).should == 1
(@bignum & -0x8000000000000000).should == 9223372036854775808 (@bignum & -0x8000000000000000).should == 18446744073709551616
end end
it "returns self bitwise AND other when both operands are negative" do it "returns self bitwise AND other when both operands are negative" do
(-@bignum & -0x4000000000000005).should == -13835058055282163717 (-@bignum & -0x4000000000000005).should == -23058430092136939525
(-@bignum & -@bignum).should == -9223372036854775813 (-@bignum & -@bignum).should == -18446744073709551621
(-@bignum & -0x4000000000000000).should == -13835058055282163712 (-@bignum & -0x4000000000000000).should == -23058430092136939520
end end
it "returns self bitwise AND other when both are negative and a multiple in bitsize of Fixnum::MIN" do it "returns self bitwise AND other when both are negative and a multiple in bitsize of Fixnum::MIN" do

View file

@ -7,13 +7,34 @@ describe "Integer#|" do
(5 | 4).should == 5 (5 | 4).should == 5
(5 | 6).should == 7 (5 | 6).should == 7
(248 | 4096).should == 4344 (248 | 4096).should == 4344
(0xffff | bignum_value + 0xf0f0).should == 0x8000_0000_0000_ffff (0xffff | bignum_value + 0xf0f0).should == 0x1_0000_0000_0000_ffff
end
it "returns self bitwise OR other when one operand is negative" do
((1 << 33) | -1).should == -1
(-1 | (1 << 33)).should == -1
((-(1<<33)-1) | 5).should == -8589934593
(5 | (-(1<<33)-1)).should == -8589934593
end
it "returns self bitwise OR other when both operands are negative" do
(-5 | -1).should == -1
(-3 | -4).should == -3
(-12 | -13).should == -9
(-13 | -12).should == -9
end end
it "returns self bitwise OR a bignum" do it "returns self bitwise OR a bignum" do
(-1 | 2**64).should == -1 (-1 | 2**64).should == -1
end end
it "coerces the rhs and calls #coerce" do
obj = mock("fixnum bit and")
obj.should_receive(:coerce).with(6).and_return([3, 6])
(6 & obj).should == 2
end
it "raises a TypeError when passed a Float" do it "raises a TypeError when passed a Float" do
-> { (3 | 3.4) }.should raise_error(TypeError) -> { (3 | 3.4) }.should raise_error(TypeError)
end end
@ -32,20 +53,20 @@ describe "Integer#|" do
end end
it "returns self bitwise OR other" do it "returns self bitwise OR other" do
(@bignum | 2).should == 9223372036854775819 (@bignum | 2).should == 18446744073709551627
(@bignum | 9).should == 9223372036854775819 (@bignum | 9).should == 18446744073709551627
(@bignum | bignum_value).should == 9223372036854775819 (@bignum | bignum_value).should == 18446744073709551627
end end
it "returns self bitwise OR other when one operand is negative" do it "returns self bitwise OR other when one operand is negative" do
(@bignum | -0x40000000000000000).should == -64563604257983430645 (@bignum | -0x40000000000000000).should == -55340232221128654837
(@bignum | -@bignum).should == -1 (@bignum | -@bignum).should == -1
(@bignum | -0x8000000000000000).should == -9223372036854775797 (@bignum | -0x8000000000000000).should == -9223372036854775797
end end
it "returns self bitwise OR other when both operands are negative" do it "returns self bitwise OR other when both operands are negative" do
(-@bignum | -0x4000000000000005).should == -1 (-@bignum | -0x4000000000000005).should == -1
(-@bignum | -@bignum).should == -9223372036854775819 (-@bignum | -@bignum).should == -18446744073709551627
(-@bignum | -0x4000000000000000).should == -11 (-@bignum | -0x4000000000000000).should == -11
end end

View file

@ -5,13 +5,34 @@ describe "Integer#^" do
it "returns self bitwise EXCLUSIVE OR other" do it "returns self bitwise EXCLUSIVE OR other" do
(3 ^ 5).should == 6 (3 ^ 5).should == 6
(-2 ^ -255).should == 255 (-2 ^ -255).should == 255
(5 ^ bignum_value + 0xffff_ffff).should == 0x8000_0000_ffff_fffa (5 ^ bignum_value + 0xffff_ffff).should == 0x1_0000_0000_ffff_fffa
end
it "returns self bitwise XOR other when one operand is negative" do
((1 << 33) ^ -1).should == -8589934593
(-1 ^ (1 << 33)).should == -8589934593
((-(1<<33)-1) ^ 5).should == -8589934598
(5 ^ (-(1<<33)-1)).should == -8589934598
end
it "returns self bitwise XOR other when both operands are negative" do
(-5 ^ -1).should == 4
(-3 ^ -4).should == 1
(-12 ^ -13).should == 7
(-13 ^ -12).should == 7
end end
it "returns self bitwise EXCLUSIVE OR a bignum" do it "returns self bitwise EXCLUSIVE OR a bignum" do
(-1 ^ 2**64).should == -18446744073709551617 (-1 ^ 2**64).should == -18446744073709551617
end end
it "coerces the rhs and calls #coerce" do
obj = mock("fixnum bit and")
obj.should_receive(:coerce).with(6).and_return([3, 6])
(6 ^ obj).should == 5
end
it "raises a TypeError when passed a Float" do it "raises a TypeError when passed a Float" do
-> { (3 ^ 3.4) }.should raise_error(TypeError) -> { (3 ^ 3.4) }.should raise_error(TypeError)
end end
@ -30,21 +51,21 @@ describe "Integer#^" do
end end
it "returns self bitwise EXCLUSIVE OR other" do it "returns self bitwise EXCLUSIVE OR other" do
(@bignum ^ 2).should == 9223372036854775824 (@bignum ^ 2).should == 18446744073709551632
(@bignum ^ @bignum).should == 0 (@bignum ^ @bignum).should == 0
(@bignum ^ 14).should == 9223372036854775836 (@bignum ^ 14).should == 18446744073709551644
end end
it "returns self bitwise EXCLUSIVE OR other when one operand is negative" do it "returns self bitwise EXCLUSIVE OR other when one operand is negative" do
(@bignum ^ -0x40000000000000000).should == -64563604257983430638 (@bignum ^ -0x40000000000000000).should == -55340232221128654830
(@bignum ^ -@bignum).should == -4 (@bignum ^ -@bignum).should == -4
(@bignum ^ -0x8000000000000000).should == -18446744073709551598 (@bignum ^ -0x8000000000000000).should == -27670116110564327406
end end
it "returns self bitwise EXCLUSIVE OR other when both operands are negative" do it "returns self bitwise EXCLUSIVE OR other when both operands are negative" do
(-@bignum ^ -0x40000000000000000).should == 64563604257983430638 (-@bignum ^ -0x40000000000000000).should == 55340232221128654830
(-@bignum ^ -@bignum).should == 0 (-@bignum ^ -@bignum).should == 0
(-@bignum ^ -0x4000000000000000).should == 13835058055282163694 (-@bignum ^ -0x4000000000000000).should == 23058430092136939502
end end
it "returns self bitwise EXCLUSIVE OR other when all bits are 1 and other value is negative" do it "returns self bitwise EXCLUSIVE OR other when all bits are 1 and other value is negative" do

View file

@ -11,7 +11,11 @@ describe "Integer#chr without argument" do
it "raises a RangeError is self is less than 0" do it "raises a RangeError is self is less than 0" do
-> { -1.chr }.should raise_error(RangeError) -> { -1.chr }.should raise_error(RangeError)
-> { -bignum_value.chr }.should raise_error(RangeError) -> { (-bignum_value).chr }.should raise_error(RangeError)
end
it "raises a RangeError if self is too large" do
-> { 2206368128.chr(Encoding::UTF_8) }.should raise_error(RangeError)
end end
describe "when Encoding.default_internal is nil" do describe "when Encoding.default_internal is nil" do
@ -162,7 +166,7 @@ describe "Integer#chr with an encoding argument" do
# http://redmine.ruby-lang.org/issues/4869 # http://redmine.ruby-lang.org/issues/4869
it "raises a RangeError is self is less than 0" do it "raises a RangeError is self is less than 0" do
-> { -1.chr(Encoding::UTF_8) }.should raise_error(RangeError) -> { -1.chr(Encoding::UTF_8) }.should raise_error(RangeError)
-> { -bignum_value.chr(Encoding::EUC_JP) }.should raise_error(RangeError) -> { (-bignum_value).chr(Encoding::EUC_JP) }.should raise_error(RangeError)
end end
it "raises a RangeError if self is too large" do it "raises a RangeError if self is too large" do

View file

@ -12,9 +12,9 @@ describe "Integer#~" do
context "bignum" do context "bignum" do
it "returns self with each bit flipped" do it "returns self with each bit flipped" do
(~bignum_value(48)).should == -9223372036854775857 (~bignum_value(48)).should == -18446744073709551665
(~(-bignum_value(21))).should == 9223372036854775828 (~(-bignum_value(21))).should == 18446744073709551636
(~bignum_value(1)).should == -9223372036854775810 (~bignum_value(1)).should == -18446744073709551618
end end
end end
end end

View file

@ -70,8 +70,8 @@ describe "Integer#div" do
end end
it "returns self divided by other" do it "returns self divided by other" do
@bignum.div(4).should == 2305843009213693974 @bignum.div(4).should == 4611686018427387926
@bignum.div(Rational(4, 1)).should == 2305843009213693974 @bignum.div(Rational(4, 1)).should == 4611686018427387926
@bignum.div(bignum_value(2)).should == 1 @bignum.div(bignum_value(2)).should == 1
(-(10**50)).div(-(10**40 + 1)).should == 9999999999 (-(10**50)).div(-(10**40 + 1)).should == 9999999999
@ -124,11 +124,11 @@ describe "Integer#div" do
end end
it "returns a result of integer division of self by a float argument" do it "returns a result of integer division of self by a float argument" do
@bignum.div(4294967295.5).should eql(2147483648) @bignum.div(4294967295.5).should eql(4294967296)
not_supported_on :opal do not_supported_on :opal do
@bignum.div(4294967295.0).should eql(2147483648) @bignum.div(4294967295.0).should eql(4294967297)
@bignum.div(bignum_value(88).to_f).should eql(1) @bignum.div(bignum_value(88).to_f).should eql(1)
@bignum.div(-bignum_value(88).to_f).should eql(-1) @bignum.div((-bignum_value(88)).to_f).should eql(-1)
end end
end end

View file

@ -47,7 +47,7 @@ describe "Integer#/" do
end end
it "returns self divided by other" do it "returns self divided by other" do
(@bignum / 4).should == 2305843009213693974 (@bignum / 4).should == 4611686018427387926
(@bignum / bignum_value(2)).should == 1 (@bignum / bignum_value(2)).should == 1
@ -60,15 +60,15 @@ describe "Integer#/" do
it "returns self divided by Float" do it "returns self divided by Float" do
not_supported_on :opal do not_supported_on :opal do
(bignum_value(88) / 4294967295.0).should be_close(2147483648.5, TOLERANCE) (bignum_value(88) / 4294967295.0).should be_close(4294967297.0, TOLERANCE)
end end
(bignum_value(88) / 4294967295.5).should be_close(2147483648.25, TOLERANCE) (bignum_value(88) / 4294967295.5).should be_close(4294967296.5, TOLERANCE)
end end
it "returns result the same class as the argument" do it "returns result the same class as the argument" do
(@bignum / 4).should == 2305843009213693974 (@bignum / 4).should == 4611686018427387926
(@bignum / 4.0).should be_close(2305843009213693974, TOLERANCE) (@bignum / 4.0).should be_close(4611686018427387926, TOLERANCE)
(@bignum / Rational(4, 1)).should == Rational(2305843009213693974, 1) (@bignum / Rational(4, 1)).should == Rational(4611686018427387926, 1)
end end
it "does NOT raise ZeroDivisionError if other is zero and is a Float" do it "does NOT raise ZeroDivisionError if other is zero and is a Float" do

View file

@ -46,16 +46,16 @@ describe "Integer#divmod" do
# assert(0 < b ? (0 <= r && r < b) : (b < r && r <= 0)) # assert(0 < b ? (0 <= r && r < b) : (b < r && r <= 0))
# So, r is always between 0 and b. # So, r is always between 0 and b.
it "returns an Array containing quotient and modulus obtained from dividing self by the given argument" do it "returns an Array containing quotient and modulus obtained from dividing self by the given argument" do
@bignum.divmod(4).should == [2305843009213693965, 3] @bignum.divmod(4).should == [4611686018427387917, 3]
@bignum.divmod(13).should == [709490156681136604, 11] @bignum.divmod(13).should == [1418980313362273205, 6]
@bignum.divmod(4.5).should == [2049638230412172288, 3.5] @bignum.divmod(4.5).should == [4099276460824344576, 2.5]
not_supported_on :opal do not_supported_on :opal do
@bignum.divmod(4.0).should == [2305843009213693952, 0.0] @bignum.divmod(4.0).should == [4611686018427387904, 0.0]
@bignum.divmod(13.0).should == [709490156681136640, 8.0] @bignum.divmod(13.0).should == [1418980313362273280, 3.0]
@bignum.divmod(2.0).should == [4611686018427387904, 0.0] @bignum.divmod(2.0).should == [9223372036854775808, 0.0]
end end
@bignum.divmod(bignum_value).should == [1, 55] @bignum.divmod(bignum_value).should == [1, 55]

View file

@ -96,7 +96,7 @@ describe "Integer#<< (with n << m)" do
context "bignum" do context "bignum" do
before :each do before :each do
@bignum = bignum_value * 16 @bignum = bignum_value * 8 # 2 ** 67
end end
it "returns n shifted left m bits when n > 0, m > 0" do it "returns n shifted left m bits when n > 0, m > 0" do
@ -127,10 +127,6 @@ describe "Integer#<< (with n << m)" do
(@bignum << -68).should == 0 (@bignum << -68).should == 0
end end
it "returns 0 when m < 0 and m is a Bignum" do
(@bignum << -bignum_value).should == 0
end
it "returns a Fixnum == fixnum_max when (fixnum_max * 2) << -1 and n > 0" do it "returns a Fixnum == fixnum_max when (fixnum_max * 2) << -1 and n > 0" do
result = (fixnum_max * 2) << -1 result = (fixnum_max * 2) << -1
result.should be_an_instance_of(Integer) result.should be_an_instance_of(Integer)
@ -165,4 +161,51 @@ describe "Integer#<< (with n << m)" do
-> { @bignum << "4" }.should raise_error(TypeError) -> { @bignum << "4" }.should raise_error(TypeError)
end end
end end
context "when m is a bignum or larger than int" do
it "returns -1 when m < 0 and n < 0" do
(-1 << -bignum_value).should == -1
(-1 << -(2**40)).should == -1
(-bignum_value << -bignum_value).should == -1
(-bignum_value << -(2**40)).should == -1
end
it "returns 0 when m < 0 and n >= 0" do
(0 << -bignum_value).should == 0
(1 << -bignum_value).should == 0
(bignum_value << -bignum_value).should == 0
(0 << -(2**40)).should == 0
(1 << -(2**40)).should == 0
(bignum_value << -(2**40)).should == 0
end
ruby_bug "#18517", ""..."3.2" do
it "returns 0 when m > 0 long and n == 0" do
(0 << (2**40)).should == 0
end
end
it "returns 0 when m > 0 bignum and n == 0" do
(0 << bignum_value).should == 0
end
ruby_bug "#18518", ""..."3.3" do
it "raises NoMemoryError when m > 0 and n != 0" do
coerce_long = mock("long")
coerce_long.stub!(:to_int).and_return(2**40)
coerce_bignum = mock("bignum")
coerce_bignum.stub!(:to_int).and_return(bignum_value)
exps = [2**40, bignum_value, coerce_long, coerce_bignum]
exps.each { |exp|
-> { (1 << exp) }.should raise_error(NoMemoryError)
-> { (-1 << exp) }.should raise_error(NoMemoryError)
-> { (bignum_value << exp) }.should raise_error(NoMemoryError)
-> { (-bignum_value << exp) }.should raise_error(NoMemoryError)
}
end
end
end
end end

View file

@ -10,7 +10,7 @@ describe "Integer#-" do
(9237212 - 5_280).should == 9231932 (9237212 - 5_280).should == 9231932
(781 - 0.5).should == 780.5 (781 - 0.5).should == 780.5
(2_560_496 - bignum_value).should == -9223372036852215312 (2_560_496 - bignum_value).should == -18446744073706991120
end end
it "raises a TypeError when given a non-Integer" do it "raises a TypeError when given a non-Integer" do
@ -29,8 +29,8 @@ describe "Integer#-" do
end end
it "returns self minus the given Integer" do it "returns self minus the given Integer" do
(@bignum - 9).should == 9223372036854776113 (@bignum - 9).should == 18446744073709551921
(@bignum - 12.57).should be_close(9223372036854776109.43, TOLERANCE) (@bignum - 12.57).should be_close(18446744073709551917.43, TOLERANCE)
(@bignum - bignum_value(42)).should == 272 (@bignum - bignum_value(42)).should == 272
end end

View file

@ -10,7 +10,7 @@ describe "Integer#*" do
(1342177 * 800).should == 1073741600 (1342177 * 800).should == 1073741600
(65536 * 65536).should == 4294967296 (65536 * 65536).should == 4294967296
(256 * bignum_value).should == 2361183241434822606848 (256 * bignum_value).should == 4722366482869645213696
(6712 * 0.25).should == 1678.0 (6712 * 0.25).should == 1678.0
end end
@ -32,8 +32,8 @@ describe "Integer#*" do
it "returns self multiplied by the given Integer" do it "returns self multiplied by the given Integer" do
(@bignum * (1/bignum_value(0xffff).to_f)).should be_close(1.0, TOLERANCE) (@bignum * (1/bignum_value(0xffff).to_f)).should be_close(1.0, TOLERANCE)
(@bignum * (1/bignum_value(0xffff).to_f)).should be_close(1.0, TOLERANCE) (@bignum * (1/bignum_value(0xffff).to_f)).should be_close(1.0, TOLERANCE)
(@bignum * 10).should == 92233720368547765800 (@bignum * 10).should == 184467440737095523880
(@bignum * (@bignum - 40)).should == 85070591730234629737795195287525433200 (@bignum * (@bignum - 40)).should == 340282366920938491207277694290934407024
end end
it "raises a TypeError when given a non-Integer" do it "raises a TypeError when given a non-Integer" do

View file

@ -9,7 +9,7 @@ describe "Integer#+" do
(491 + 2).should == 493 (491 + 2).should == 493
(90210 + 10).should == 90220 (90210 + 10).should == 90220
(9 + bignum_value).should == 9223372036854775817 (9 + bignum_value).should == 18446744073709551625
(1001 + 5.219).should == 1006.219 (1001 + 5.219).should == 1006.219
end end
@ -29,9 +29,9 @@ describe "Integer#+" do
end end
it "returns self plus the given Integer" do it "returns self plus the given Integer" do
(@bignum + 4).should == 9223372036854775888 (@bignum + 4).should == 18446744073709551696
(@bignum + 4.2).should be_close(9223372036854775888.2, TOLERANCE) (@bignum + 4.2).should be_close(18446744073709551696.2, TOLERANCE)
(@bignum + bignum_value(3)).should == 18446744073709551695 (@bignum + bignum_value(3)).should == 36893488147419103311
end end
it "raises a TypeError when given a non-Integer" do it "raises a TypeError when given a non-Integer" do

View file

@ -33,7 +33,7 @@ describe "Integer#remainder" do
it "returns the remainder of dividing self by other" do it "returns the remainder of dividing self by other" do
a = bignum_value(79) a = bignum_value(79)
a.remainder(2).should == 1 a.remainder(2).should == 1
a.remainder(97.345).should be_close(46.5674996147722, TOLERANCE) a.remainder(97.345).should be_close(93.1349992295444, TOLERANCE)
a.remainder(bignum_value).should == 79 a.remainder(bignum_value).should == 79
end end

View file

@ -52,10 +52,6 @@ describe "Integer#>> (with n >> m)" do
(-7 >> 64).should == -1 (-7 >> 64).should == -1
end end
it "returns 0 when m is a bignum" do
(3 >> bignum_value).should == 0
end
it "returns a Bignum == fixnum_max * 2 when fixnum_max >> -1 and n > 0" do it "returns a Bignum == fixnum_max * 2 when fixnum_max >> -1 and n > 0" do
result = fixnum_max >> -1 result = fixnum_max >> -1
result.should be_an_instance_of(Integer) result.should be_an_instance_of(Integer)
@ -96,7 +92,7 @@ describe "Integer#>> (with n >> m)" do
context "bignum" do context "bignum" do
before :each do before :each do
@bignum = bignum_value * 16 @bignum = bignum_value * 8 # 2 ** 67
end end
it "returns n shifted right m bits when n > 0, m > 0" do it "returns n shifted right m bits when n > 0, m > 0" do
@ -153,10 +149,6 @@ describe "Integer#>> (with n >> m)" do
(@bignum >> 68).should == 0 (@bignum >> 68).should == 0
end end
it "returns 0 when m is a Bignum" do
(@bignum >> bignum_value).should == 0
end
it "returns a Fixnum == fixnum_max when (fixnum_max * 2) >> 1 and n > 0" do it "returns a Fixnum == fixnum_max when (fixnum_max * 2) >> 1 and n > 0" do
result = (fixnum_max * 2) >> 1 result = (fixnum_max * 2) >> 1
result.should be_an_instance_of(Integer) result.should be_an_instance_of(Integer)
@ -191,4 +183,51 @@ describe "Integer#>> (with n >> m)" do
-> { @bignum >> "4" }.should raise_error(TypeError) -> { @bignum >> "4" }.should raise_error(TypeError)
end end
end end
context "when m is a bignum or larger than int" do
it "returns -1 when m > 0 and n < 0" do
(-1 >> bignum_value).should == -1
(-1 >> (2**40)).should == -1
(-bignum_value >> bignum_value).should == -1
(-bignum_value >> (2**40)).should == -1
end
it "returns 0 when m > 0 and n >= 0" do
(0 >> bignum_value).should == 0
(1 >> bignum_value).should == 0
(bignum_value >> bignum_value).should == 0
(0 >> (2**40)).should == 0
(1 >> (2**40)).should == 0
(bignum_value >> (2**40)).should == 0
end
ruby_bug "#18517", ""..."3.2" do
it "returns 0 when m < 0 long and n == 0" do
(0 >> -(2**40)).should == 0
end
end
it "returns 0 when m < 0 bignum and n == 0" do
(0 >> -bignum_value).should == 0
end
ruby_bug "#18518", ""..."3.3" do
it "raises NoMemoryError when m < 0 and n != 0" do
coerce_long = mock("long")
coerce_long.stub!(:to_int).and_return(-(2**40))
coerce_bignum = mock("bignum")
coerce_bignum.stub!(:to_int).and_return(-bignum_value)
exps = [-(2**40), -bignum_value, coerce_long, coerce_bignum]
exps.each { |exp|
-> { (1 >> exp) }.should raise_error(NoMemoryError)
-> { (-1 >> exp) }.should raise_error(NoMemoryError)
-> { (bignum_value >> exp) }.should raise_error(NoMemoryError)
-> { (-bignum_value >> exp) }.should raise_error(NoMemoryError)
}
end
end
end
end end

View file

@ -11,8 +11,8 @@ describe :integer_abs, shared: true do
context "bignum" do context "bignum" do
it "returns the absolute bignum value" do it "returns the absolute bignum value" do
bignum_value(39).send(@method).should == 9223372036854775847 bignum_value(39).send(@method).should == 18446744073709551655
(-bignum_value(18)).send(@method).should == 9223372036854775826 (-bignum_value(18)).send(@method).should == 18446744073709551634
end end
end end
end end

View file

@ -30,11 +30,13 @@ describe :integer_exponent, shared: true do
(-2).send(@method, 30).should eql(1073741824) (-2).send(@method, 30).should eql(1073741824)
(-2).send(@method, 31).should eql(-2147483648) (-2).send(@method, 31).should eql(-2147483648)
(-2).send(@method, 32).should eql(4294967296) (-2).send(@method, 32).should eql(4294967296)
(-2).send(@method, 33).should eql(-8589934592)
(-2).send(@method, 61).should eql(-2305843009213693952) (-2).send(@method, 61).should eql(-2305843009213693952)
(-2).send(@method, 62).should eql(4611686018427387904) (-2).send(@method, 62).should eql(4611686018427387904)
(-2).send(@method, 63).should eql(-9223372036854775808) (-2).send(@method, 63).should eql(-9223372036854775808)
(-2).send(@method, 64).should eql(18446744073709551616) (-2).send(@method, 64).should eql(18446744073709551616)
(-2).send(@method, 65).should eql(-36893488147419103232)
end end
it "can raise 1 to a bignum safely" do it "can raise 1 to a bignum safely" do
@ -96,8 +98,8 @@ describe :integer_exponent, shared: true do
end end
it "returns self raised to other power" do it "returns self raised to other power" do
(@bignum.send(@method, 4)).should == 7237005577332262361485077344629993318496048279512298547155833600056910050625 (@bignum.send(@method, 4)).should == 115792089237316196603666111261383895964500887398800252671052694326794607293761
(@bignum.send(@method, 1.2)).should be_close(57262152889751597425762.57804, TOLERANCE) (@bignum.send(@method, 1.3)).should be_close(11109528802438156839288832.0, TOLERANCE)
end end
it "raises a TypeError when given a non-Integer" do it "raises a TypeError when given a non-Integer" do
@ -116,8 +118,9 @@ describe :integer_exponent, shared: true do
end end
it "returns a complex number when negative and raised to a fractional power" do it "returns a complex number when negative and raised to a fractional power" do
((-@bignum).send(@method, (1.0/3))) .should be_close(Complex(1048576,1816186.907597341), TOLERANCE) (-bignum_value).send(@method, (1.0/2)).should be_close(Complex(0.0, 4294967296.0), TOLERANCE)
((-@bignum).send(@method, Rational(1,3))).should be_close(Complex(1048576,1816186.907597341), TOLERANCE) (-@bignum).send(@method, (1.0/3)) .should be_close(Complex(1321122.9748145656, 2288252.1154253655), TOLERANCE)
(-@bignum).send(@method, Rational(1,3)).should be_close(Complex(1321122.9748145656, 2288252.1154253655), TOLERANCE)
end end
end end
end end

View file

@ -48,11 +48,11 @@ describe :integer_modulo, shared: true do
end end
it "returns the modulus obtained from dividing self by the given argument" do it "returns the modulus obtained from dividing self by the given argument" do
@bignum.send(@method, 5).should == 3 @bignum.send(@method, 5).should == 1
@bignum.send(@method, -5).should == -2 @bignum.send(@method, -5).should == -4
@bignum.send(@method, -100).should == -92 @bignum.send(@method, -100).should == -84
@bignum.send(@method, 2.22).should be_close(0.780180180180252, TOLERANCE) @bignum.send(@method, 2.22).should be_close(1.5603603603605034, TOLERANCE)
@bignum.send(@method, bignum_value(10)).should == 9223372036854775808 @bignum.send(@method, bignum_value(10)).should == 18446744073709551616
end end
it "raises a ZeroDivisionError when the given argument is 0" do it "raises a ZeroDivisionError when the given argument is 0" do

View file

@ -11,9 +11,9 @@ describe "Integer#to_f" do
context "bignum" do context "bignum" do
it "returns self converted to a Float" do it "returns self converted to a Float" do
bignum_value(0x4000_0aa0_0bb0_0000).to_f.should eql(13_835_069_737_789_292_544.00) bignum_value(0x4000_0aa0_0bb0_0000).to_f.should eql(23_058_441_774_644_068_352.0)
bignum_value(0x8000_0000_0000_0ccc).to_f.should eql(18_446_744_073_709_555_712.00) bignum_value(0x8000_0000_0000_0ccc).to_f.should eql(27_670_116_110_564_330_700.0)
(-bignum_value(99)).to_f.should eql(-9_223_372_036_854_775_808.00) (-bignum_value(99)).to_f.should eql(-18_446_744_073_709_551_715.0)
end end
it "converts number close to Float::MAX without exceeding MAX or producing NaN" do it "converts number close to Float::MAX without exceeding MAX or producing NaN" do

View file

@ -68,9 +68,9 @@ describe "Integer#to_s" do
describe "when given no base" do describe "when given no base" do
it "returns self converted to a String using base 10" do it "returns self converted to a String using base 10" do
bignum_value(9).to_s.should == "9223372036854775817" bignum_value(9).to_s.should == "18446744073709551625"
bignum_value.to_s.should == "9223372036854775808" bignum_value.to_s.should == "18446744073709551616"
(-bignum_value(675)).to_s.should == "-9223372036854776483" (-bignum_value(675)).to_s.should == "-18446744073709552291"
end end
end end

View file

@ -20,11 +20,11 @@ describe "Integer#-@" do
context "bignum" do context "bignum" do
it "returns self as a negative value" do it "returns self as a negative value" do
bignum_value.send(:-@).should == -9223372036854775808 bignum_value.send(:-@).should == -18446744073709551616
(-bignum_value).send(:-@).should == 9223372036854775808 (-bignum_value).send(:-@).should == 18446744073709551616
bignum_value(921).send(:-@).should == -9223372036854776729 bignum_value(921).send(:-@).should == -18446744073709552537
(-bignum_value(921).send(:-@)).should == 9223372036854776729 (-bignum_value(921).send(:-@)).should == 18446744073709552537
end end
end end
end end

View file

@ -168,3 +168,27 @@ platform_is :windows do
end end
end end
end end
ruby_version_is "3.0" do
describe "IO#write on STDOUT" do
# https://bugs.ruby-lang.org/issues/14413
platform_is_not :windows do
it "raises SignalException SIGPIPE if the stream is closed instead of Errno::EPIPE like other IOs" do
stderr_file = tmp("stderr")
begin
IO.popen([*ruby_exe, "-e", "loop { puts :ok }"], "r", err: stderr_file) do |io|
io.gets.should == "ok\n"
io.close
end
status = $?
status.should_not.success?
status.should.signaled?
Signal.signame(status.termsig).should == 'PIPE'
File.read(stderr_file).should.empty?
ensure
rm_r stderr_file
end
end
end
end
end

View file

@ -89,5 +89,11 @@ describe "Kernel#instance_variable_set" do
it "raises a FrozenError when passed replacement is different from stored object" do it "raises a FrozenError when passed replacement is different from stored object" do
-> { @frozen.instance_variable_set(:@ivar, :replacement) }.should raise_error(FrozenError) -> { @frozen.instance_variable_set(:@ivar, :replacement) }.should raise_error(FrozenError)
end end
it "accepts unicode instance variable names" do
o = Object.new
o.instance_variable_set(:@💙, 42)
o.instance_variable_get(:@💙).should == 42
end
end end
end end

View file

@ -15,6 +15,32 @@ ruby_version_is "2.7" do
Hash.ruby2_keywords_hash?(last).should == true Hash.ruby2_keywords_hash?(last).should == true
end end
it "applies to the underlying method and applies across aliasing" do
obj = Object.new
obj.singleton_class.class_exec do
def foo(*a) a.last end
alias_method :bar, :foo
ruby2_keywords :foo
def baz(*a) a.last end
ruby2_keywords :baz
alias_method :bob, :baz
end
last = obj.foo(1, 2, a: "a")
Hash.ruby2_keywords_hash?(last).should == true
last = obj.bar(1, 2, a: "a")
Hash.ruby2_keywords_hash?(last).should == true
last = obj.baz(1, 2, a: "a")
Hash.ruby2_keywords_hash?(last).should == true
last = obj.bob(1, 2, a: "a")
Hash.ruby2_keywords_hash?(last).should == true
end
ruby_version_is "2.7" ... "3.0" do ruby_version_is "2.7" ... "3.0" do
it "fixes delegation warnings when calling a method accepting keywords" do it "fixes delegation warnings when calling a method accepting keywords" do
obj = Object.new obj = Object.new

View file

@ -20,7 +20,7 @@ describe "Numeric#quo" do
-> { 10.quo(0) }.should raise_error(ZeroDivisionError) -> { 10.quo(0) }.should raise_error(ZeroDivisionError)
-> { -10.quo(0) }.should raise_error(ZeroDivisionError) -> { -10.quo(0) }.should raise_error(ZeroDivisionError)
-> { bignum_value.quo(0) }.should raise_error(ZeroDivisionError) -> { bignum_value.quo(0) }.should raise_error(ZeroDivisionError)
-> { -bignum_value.quo(0) }.should raise_error(ZeroDivisionError) -> { (-bignum_value).quo(0) }.should raise_error(ZeroDivisionError)
end end
it "calls #to_r to convert the object to a Rational" do it "calls #to_r to convert the object to a Rational" do

View file

@ -10,6 +10,22 @@ ruby_version_is "2.7" do
Hash.ruby2_keywords_hash?(last).should == true Hash.ruby2_keywords_hash?(last).should == true
end end
it "applies to the underlying method and applies across duplication" do
f1 = -> *a { a.last }
f1.ruby2_keywords
f2 = f1.dup
Hash.ruby2_keywords_hash?(f1.call(1, 2, a: "a")).should == true
Hash.ruby2_keywords_hash?(f2.call(1, 2, a: "a")).should == true
f3 = -> *a { a.last }
f4 = f3.dup
f3.ruby2_keywords
Hash.ruby2_keywords_hash?(f3.call(1, 2, a: "a")).should == true
Hash.ruby2_keywords_hash?(f4.call(1, 2, a: "a")).should == true
end
ruby_version_is "2.7" ... "3.0" do ruby_version_is "2.7" ... "3.0" do
it "fixes delegation warnings when calling a method accepting keywords" do it "fixes delegation warnings when calling a method accepting keywords" do
obj = Object.new obj = Object.new

View file

@ -18,7 +18,7 @@ describe "Random#bytes" do
end end
it "returns the same numeric output for a given huge seed across all implementations and platforms" do it "returns the same numeric output for a given huge seed across all implementations and platforms" do
rnd = Random.new(bignum_value ** 4) rnd = Random.new(2 ** (63 * 4))
rnd.bytes(2).should == "_\x91" rnd.bytes(2).should == "_\x91"
rnd.bytes(1000) # skip some rnd.bytes(1000) # skip some
rnd.bytes(2).should == "\x17\x12" rnd.bytes(2).should == "\x17\x12"

View file

@ -12,4 +12,10 @@ describe "Range#dup" do
copy.end.should == "z" copy.end.should == "z"
copy.should.exclude_end? copy.should.exclude_end?
end end
it "creates an unfrozen range" do
(1..2).dup.should_not.frozen?
(1..).dup.should_not.frozen?
Range.new(1, 2).dup.should_not.frozen?
end
end end

View file

@ -0,0 +1,27 @@
require_relative '../../spec_helper'
# There is no Range#frozen? method but this feels like the best place for these specs
describe "Range#frozen?" do
ruby_version_is "3.0" do
it "is true for literal ranges" do
(1..2).should.frozen?
(1..).should.frozen?
eval("(..1)").should.frozen?
end
it "is true for Range.new" do
Range.new(1, 2).should.frozen?
Range.new(1, nil).should.frozen?
Range.new(nil, 1).should.frozen?
end
it "is false for instances of a subclass of Range" do
sub_range = Class.new(Range).new(1, 2)
sub_range.should_not.frozen?
end
it "is false for Range.allocate" do
Range.allocate.should_not.frozen?
end
end
end

View file

@ -224,6 +224,17 @@ describe "String#split with String" do
end end
end end
end end
it "returns an empty array when whitespace is split on whitespace" do
" ".split(" ").should == []
" \n ".split(" ").should == []
" ".split(" ").should == []
" \t ".split(" ").should == []
end
it "doesn't split on non-ascii whitespace" do
"a\u{2008}b".split(" ").should == ["a\u{2008}b"]
end
end end
describe "String#split with Regexp" do describe "String#split with Regexp" do

View file

@ -74,6 +74,50 @@ ruby_version_is "2.7" do
end end
RUBY RUBY
end end
it "can be nested" do
eval(<<~RUBY).should == [[0, [2, 4, 6]], [[4, 16, 64]], 27]
case [0, [2, 4, 6], [3, 9, 27], [4, 16, 64]]
in [*pre, [*, 9, a], *post]
[pre, post, a]
else
false
end
RUBY
end
it "can be nested with an array pattern" do
eval(<<~RUBY).should == [[4, 16, 64]]
case [0, [2, 4, 6], [3, 9, 27], [4, 16, 64]]
in [_, _, [*, 9, *], *post]
post
else
false
end
RUBY
end
it "can be nested within a hash pattern" do
eval(<<~RUBY).should == [27]
case {a: [3, 9, 27]}
in {a: [*, 9, *post]}
post
else
false
end
RUBY
end
it "can nest hash and array patterns" do
eval(<<~RUBY).should == [42, 2]
case [0, {a: 42, b: [0, 1]}, {a: 42, b: [1, 2]}]
in [*, {a:, b: [1, c]}, *]
[a, c]
else
false
end
RUBY
end
end end
end end

View file

@ -15,12 +15,6 @@ describe "Literal Ranges" do
(1...).should == Range.new(1, nil, true) (1...).should == Range.new(1, nil, true)
end end
ruby_version_is "3.0" do
it "is frozen" do
(42..).should.frozen?
end
end
ruby_version_is "2.7" do ruby_version_is "2.7" do
it "creates beginless ranges" do it "creates beginless ranges" do
eval("(..1)").should == Range.new(nil, 1) eval("(..1)").should == Range.new(nil, 1)

View file

@ -115,6 +115,18 @@ describe "The rescue keyword" do
end end
end end
it "converts the splatted list of exceptions using #to_a" do
exceptions = mock("to_a")
exceptions.should_receive(:to_a).and_return(exception_list)
caught_it = false
begin
raise SpecificExampleException, "not important"
rescue *exceptions
caught_it = true
end
caught_it.should be_true
end
it "can combine a splatted list of exceptions with a literal list of exceptions" do it "can combine a splatted list of exceptions with a literal list of exceptions" do
caught_it = false caught_it = false
begin begin

View file

@ -24,8 +24,8 @@ ruby_version_is ""..."3.1" do
it "returns the result of multiplying the elements of self and a Bignum" do it "returns the result of multiplying the elements of self and a Bignum" do
(@a * bignum_value).should == Matrix[ (@a * bignum_value).should == Matrix[
[9223372036854775808, 18446744073709551616], [18446744073709551616, 36893488147419103232],
[27670116110564327424, 36893488147419103232] [55340232221128654848, 73786976294838206464]
] ]
end end

View file

@ -0,0 +1,16 @@
require_relative '../../spec_helper'
require 'pathname'
describe "Pathname#birthtime" do
platform_is :windows, :darwin, :freebsd, :netbsd do
it "returns the birth time for self" do
Pathname.new(__FILE__).birthtime.should be_kind_of(Time)
end
end
platform_is :openbsd do
it "raises an NotImplementedError" do
-> { Pathname.new(__FILE__).birthtime }.should raise_error(NotImplementedError)
end
end
end

View file

@ -55,3 +55,40 @@ describe 'Pathname.glob' do
end end
end end
end end
describe 'Pathname#glob' do
before :all do
@dir = tmp('pathname_glob') + '/'
@file_1 = @dir + 'lib/ipaddr.rb'
@file_2 = @dir + 'lib/irb.rb'
@file_3 = @dir + 'lib/.hidden.rb'
touch @file_1
touch @file_2
touch @file_3
end
after :all do
rm_r @dir[0...-1]
end
it 'returns [] for no match' do
Pathname.new(@dir).glob('lib/*.js').should == []
end
it 'returns matching file paths' do
Pathname.new(@dir).glob('lib/*i*.rb').sort.should == [Pathname.new(@file_1), Pathname.new(@file_2)].sort
end
it 'yields matching file paths to block' do
ary = []
Pathname.new(@dir).glob('lib/*i*.rb') { |p| ary << p }.should be_nil
ary.sort.should == [Pathname.new(@file_1), Pathname.new(@file_2)].sort
end
it 'returns matching file paths when a flag is provided' do
expected = [Pathname.new(@file_1), Pathname.new(@file_2), Pathname.new(@file_3)].sort
Pathname.new(@dir).glob('lib/*i*.rb', File::FNM_DOTMATCH).sort.should == expected
end
end

View file

@ -87,6 +87,10 @@ VALUE string_spec_rb_str_tmp_new_klass(VALUE self, VALUE len) {
return RBASIC_CLASS(rb_str_tmp_new(NUM2LONG(len))); return RBASIC_CLASS(rb_str_tmp_new(NUM2LONG(len)));
} }
VALUE string_spec_rb_str_buf_append(VALUE self, VALUE str, VALUE two) {
return rb_str_buf_append(str, two);
}
VALUE string_spec_rb_str_buf_cat(VALUE self, VALUE str) { VALUE string_spec_rb_str_buf_cat(VALUE self, VALUE str) {
const char *question_mark = "?"; const char *question_mark = "?";
rb_str_buf_cat(str, question_mark, strlen(question_mark)); rb_str_buf_cat(str, question_mark, strlen(question_mark));
@ -599,6 +603,7 @@ void Init_string_spec(void) {
rb_define_method(cls, "rb_str_buf_new2", string_spec_rb_str_buf_new2, 0); rb_define_method(cls, "rb_str_buf_new2", string_spec_rb_str_buf_new2, 0);
rb_define_method(cls, "rb_str_tmp_new", string_spec_rb_str_tmp_new, 1); rb_define_method(cls, "rb_str_tmp_new", string_spec_rb_str_tmp_new, 1);
rb_define_method(cls, "rb_str_tmp_new_klass", string_spec_rb_str_tmp_new_klass, 1); rb_define_method(cls, "rb_str_tmp_new_klass", string_spec_rb_str_tmp_new_klass, 1);
rb_define_method(cls, "rb_str_buf_append", string_spec_rb_str_buf_append, 2);
rb_define_method(cls, "rb_str_buf_cat", string_spec_rb_str_buf_cat, 1); rb_define_method(cls, "rb_str_buf_cat", string_spec_rb_str_buf_cat, 1);
rb_define_method(cls, "rb_enc_str_buf_cat", string_spec_rb_enc_str_buf_cat, 3); rb_define_method(cls, "rb_enc_str_buf_cat", string_spec_rb_enc_str_buf_cat, 3);
rb_define_method(cls, "rb_str_cat", string_spec_rb_str_cat, 1); rb_define_method(cls, "rb_str_cat", string_spec_rb_str_cat, 1);

View file

@ -378,6 +378,14 @@ describe "C-API String function" do
it_behaves_like :string_times, :rb_str_times, -> str, times { @s.rb_str_times(str, times) } it_behaves_like :string_times, :rb_str_times, -> str, times { @s.rb_str_times(str, times) }
end end
describe "rb_str_buf_append" do
it "concatenates a string to another string" do
str = "Your house "
@s.rb_str_buf_append(str, "is on fire?").should.equal?(str)
str.should == "Your house is on fire?"
end
end
describe "rb_str_buf_cat" do describe "rb_str_buf_cat" do
it "concatenates a C string to a ruby string" do it "concatenates a C string to a ruby string" do
@s.rb_str_buf_cat("Your house is on fire").should == "Your house is on fire?" @s.rb_str_buf_cat("Your house is on fire").should == "Your house is on fire?"

View file

@ -1,5 +1,6 @@
require_relative '../spec_helper' require_relative '../spec_helper'
guard_not -> { platform_is :darwin and ENV['GITHUB_ACTIONS'] } do # frequent timeout/hang on macOS in GitHub Actions
require 'rubygems' require 'rubygems'
require 'rubygems/user_interaction' require 'rubygems/user_interaction'
@ -18,3 +19,4 @@ describe "CVE-2019-8321 is resisted by" do
end end
end end
end end
end

View file

@ -1,11 +1,11 @@
require_relative '../spec_helper' require_relative '../spec_helper'
guard_not -> { platform_is :darwin and ENV['GITHUB_ACTIONS'] } do # frequent timeout/hang on macOS in GitHub Actions
require 'yaml' require 'yaml'
require 'rubygems' require 'rubygems'
require 'rubygems/safe_yaml' require 'rubygems/safe_yaml'
require 'rubygems/commands/owner_command' require 'rubygems/commands/owner_command'
platform_is_not :darwin do # frequent timeout/hang on macOS
describe "CVE-2019-8322 is resisted by" do describe "CVE-2019-8322 is resisted by" do
it "sanitising owner names" do it "sanitising owner names" do
command = Gem::Commands::OwnerCommand.new command = Gem::Commands::OwnerCommand.new

View file

@ -1,6 +1,6 @@
require_relative '../spec_helper' require_relative '../spec_helper'
platform_is_not :darwin do # frequent timeout/hang on macOS guard_not -> { platform_is :darwin and ENV['GITHUB_ACTIONS'] } do # frequent timeout/hang on macOS in GitHub Actions
require 'optparse' require 'optparse'
require 'rubygems' require 'rubygems'

View file

@ -1,6 +1,6 @@
require_relative '../spec_helper' require_relative '../spec_helper'
platform_is_not :darwin do # frequent timeout/hang on macOS guard_not -> { platform_is :darwin and ENV['GITHUB_ACTIONS'] } do # frequent timeout/hang on macOS in GitHub Actions
require 'rubygems' require 'rubygems'
require 'rubygems/command_manager' require 'rubygems/command_manager'

View file

@ -22,7 +22,7 @@ guard -> {
JSON.const_defined?(:Pure) or JSON.const_defined?(:Pure) or
version_is(JSON::VERSION, '2.3.0') version_is(JSON::VERSION, '2.3.0')
} do } do
platform_is_not :darwin do # frequent timeout/hang on macOS guard_not -> { platform_is :darwin and ENV['GITHUB_ACTIONS'] } do # frequent timeout/hang on macOS in GitHub Actions
describe "CVE-2020-10663 is resisted by" do describe "CVE-2020-10663 is resisted by" do
it "only creating custom objects if passed create_additions: true or using JSON.load" do it "only creating custom objects if passed create_additions: true or using JSON.load" do
obj = JSONSpecs::MyClass.new("bar") obj = JSONSpecs::MyClass.new("bar")

View file

@ -6,7 +6,7 @@ describe :rational_divmod_rat, shared: true do
Rational(7, 4).divmod(Rational(-1, 2)).should eql([-4, Rational(-1, 4)]) Rational(7, 4).divmod(Rational(-1, 2)).should eql([-4, Rational(-1, 4)])
Rational(0, 4).divmod(Rational(4, 3)).should eql([0, Rational(0, 1)]) Rational(0, 4).divmod(Rational(4, 3)).should eql([0, Rational(0, 1)])
Rational(bignum_value, 4).divmod(Rational(4, 3)).should eql([1729382256910270464, Rational(0, 1)]) Rational(bignum_value, 4).divmod(Rational(4, 3)).should eql([3458764513820540928, Rational(0, 1)])
end end
it "raises a ZeroDivisionError when passed a Rational with a numerator of 0" do it "raises a ZeroDivisionError when passed a Rational with a numerator of 0" do
@ -19,7 +19,7 @@ describe :rational_divmod_int, shared: true do
Rational(7, 4).divmod(2).should eql([0, Rational(7, 4)]) Rational(7, 4).divmod(2).should eql([0, Rational(7, 4)])
Rational(7, 4).divmod(-2).should eql([-1, Rational(-1, 4)]) Rational(7, 4).divmod(-2).should eql([-1, Rational(-1, 4)])
Rational(bignum_value, 4).divmod(3).should == [768614336404564650, Rational(2, 1)] Rational(bignum_value, 4).divmod(3).should eql([1537228672809129301, Rational(1, 1)])
end end
it "raises a ZeroDivisionError when passed 0" do it "raises a ZeroDivisionError when passed 0" do

View file

@ -40,10 +40,10 @@ describe :rational_exponent, shared: true do
(Rational(-3, 4) ** -4).should == Rational(256, 81) (Rational(-3, 4) ** -4).should == Rational(256, 81)
(Rational(3, -4) ** -4).should == Rational(256, 81) (Rational(3, -4) ** -4).should == Rational(256, 81)
(Rational(bignum_value, 4) ** 4).should == Rational(28269553036454149273332760011886696253239742350009903329945699220681916416, 1) (Rational(bignum_value, 4) ** 4).should == Rational(452312848583266388373324160190187140051835877600158453279131187530910662656, 1)
(Rational(3, bignum_value) ** -4).should == Rational(7237005577332262213973186563042994240829374041602535252466099000494570602496, 81) (Rational(3, bignum_value) ** -4).should == Rational(115792089237316195423570985008687907853269984665640564039457584007913129639936, 81)
(Rational(-bignum_value, 4) ** -4).should == Rational(1, 28269553036454149273332760011886696253239742350009903329945699220681916416) (Rational(-bignum_value, 4) ** -4).should == Rational(1, 452312848583266388373324160190187140051835877600158453279131187530910662656)
(Rational(3, -bignum_value) ** -4).should == Rational(7237005577332262213973186563042994240829374041602535252466099000494570602496, 81) (Rational(3, -bignum_value) ** -4).should == Rational(115792089237316195423570985008687907853269984665640564039457584007913129639936, 81)
end end
# Guard against the Mathn library # Guard against the Mathn library