Skip to content

Commit

Permalink
Update to ruby/spec@3a510bb
Browse files Browse the repository at this point in the history
  • Loading branch information
eregon committed Feb 26, 2024
1 parent 40c9a3d commit 815db5c
Show file tree
Hide file tree
Showing 18 changed files with 329 additions and 130 deletions.
1 change: 0 additions & 1 deletion spec/ruby/.rubocop_todo.yml
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ Lint/LiteralInInterpolation:
- 'language/string_spec.rb'
- 'language/symbol_spec.rb'
- 'language/undef_spec.rb'
- 'library/net/ftp/connect_spec.rb'

# Offense count: 8
# Cop supports --auto-correct.
Expand Down
5 changes: 5 additions & 0 deletions spec/ruby/core/encoding/replicate_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,11 @@
Encoding::US_ASCII.replicate('MY-US-ASCII')
}.should complain(/warning: Encoding#replicate is deprecated and will be removed in Ruby 3.3; use the original encoding instead/)
end

it "raises EncodingError if too many encodings" do
code = '1_000.times {|i| Encoding::US_ASCII.replicate("R_#{i}") }'
ruby_exe(code, args: "2>&1", exit_status: 1).should.include?('too many encoding (> 256) (EncodingError)')
end
end

ruby_version_is "3.3" do
Expand Down
6 changes: 6 additions & 0 deletions spec/ruby/core/enumerable/fixtures/classes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -342,4 +342,10 @@ def ===(*args)
@block.call(*args)
end
end

# Set is a core class since Ruby 3.2
ruby_version_is '3.2' do
class SetSubclass < Set
end
end
end # EnumerableSpecs utility classes
29 changes: 29 additions & 0 deletions spec/ruby/core/enumerable/to_set_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
require_relative '../../spec_helper'
require_relative 'fixtures/classes'

ruby_version_is "3.2" do
describe "Enumerable#to_set" do
it "returns a new Set created from self" do
[1, 2, 3].to_set.should == Set[1, 2, 3]
{a: 1, b: 2}.to_set.should == Set[[:b, 2], [:a, 1]]
end

it "passes down passed blocks" do
[1, 2, 3].to_set { |x| x * x }.should == Set[1, 4, 9]
end

it "instantiates an object of provided as the first argument set class" do
set = [1, 2, 3].to_set(EnumerableSpecs::SetSubclass)
set.should be_kind_of(EnumerableSpecs::SetSubclass)
set.to_a.sort.should == [1, 2, 3]
end

it "does not need explicit `require 'set'`" do
output = ruby_exe(<<~RUBY, options: '--disable-gems', args: '2>&1')
puts [1, 2, 3].to_set
RUBY

output.chomp.should == "#<Set: {1, 2, 3}>"
end
end
end
9 changes: 7 additions & 2 deletions spec/ruby/core/file/lutime_spec.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
require_relative '../../spec_helper'
require_relative 'shared/update_time'

describe "File.lutime" do
platform_is_not :windows do
platform_is_not :windows do
describe "File.lutime" do
it_behaves_like :update_time, :lutime
end

describe "File.lutime" do
before :each do
@atime = Time.utc(2000)
@mtime = Time.utc(2001)
Expand Down
105 changes: 105 additions & 0 deletions spec/ruby/core/file/shared/update_time.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
describe :update_time, shared: true do
before :all do
@time_is_float = platform_is :windows
end

before :each do
@atime = Time.now
@mtime = Time.now
@file1 = tmp("specs_file_utime1")
@file2 = tmp("specs_file_utime2")
touch @file1
touch @file2
end

after :each do
rm_r @file1, @file2
end

it "sets the access and modification time of each file" do
File.send(@method, @atime, @mtime, @file1, @file2)

if @time_is_float
File.atime(@file1).should be_close(@atime, 0.0001)
File.mtime(@file1).should be_close(@mtime, 0.0001)
File.atime(@file2).should be_close(@atime, 0.0001)
File.mtime(@file2).should be_close(@mtime, 0.0001)
else
File.atime(@file1).to_i.should be_close(@atime.to_i, TIME_TOLERANCE)
File.mtime(@file1).to_i.should be_close(@mtime.to_i, TIME_TOLERANCE)
File.atime(@file2).to_i.should be_close(@atime.to_i, TIME_TOLERANCE)
File.mtime(@file2).to_i.should be_close(@mtime.to_i, TIME_TOLERANCE)
end
end

it "uses the current times if two nil values are passed" do
tn = Time.now
File.send(@method, nil, nil, @file1, @file2)

if @time_is_float
File.atime(@file1).should be_close(tn, 0.050)
File.mtime(@file1).should be_close(tn, 0.050)
File.atime(@file2).should be_close(tn, 0.050)
File.mtime(@file2).should be_close(tn, 0.050)
else
File.atime(@file1).to_i.should be_close(Time.now.to_i, TIME_TOLERANCE)
File.mtime(@file1).to_i.should be_close(Time.now.to_i, TIME_TOLERANCE)
File.atime(@file2).to_i.should be_close(Time.now.to_i, TIME_TOLERANCE)
File.mtime(@file2).to_i.should be_close(Time.now.to_i, TIME_TOLERANCE)
end
end

it "accepts an object that has a #to_path method" do
File.send(@method, @atime, @mtime, mock_to_path(@file1), mock_to_path(@file2))
end

it "accepts numeric atime and mtime arguments" do
if @time_is_float
File.send(@method, @atime.to_f, @mtime.to_f, @file1, @file2)

File.atime(@file1).should be_close(@atime, 0.0001)
File.mtime(@file1).should be_close(@mtime, 0.0001)
File.atime(@file2).should be_close(@atime, 0.0001)
File.mtime(@file2).should be_close(@mtime, 0.0001)
else
File.send(@method, @atime.to_i, @mtime.to_i, @file1, @file2)

File.atime(@file1).to_i.should be_close(@atime.to_i, TIME_TOLERANCE)
File.mtime(@file1).to_i.should be_close(@mtime.to_i, TIME_TOLERANCE)
File.atime(@file2).to_i.should be_close(@atime.to_i, TIME_TOLERANCE)
File.mtime(@file2).to_i.should be_close(@mtime.to_i, TIME_TOLERANCE)
end
end

it "may set nanosecond precision" do
t = Time.utc(2007, 11, 1, 15, 25, 0, 123456.789r)
File.send(@method, t, t, @file1)

File.atime(@file1).nsec.should.between?(0, 123500000)
File.mtime(@file1).nsec.should.between?(0, 123500000)
end

it "returns the number of filenames in the arguments" do
File.send(@method, @atime.to_f, @mtime.to_f, @file1, @file2).should == 2
end

platform_is :linux do
platform_is wordsize: 64 do
it "allows Time instances in the far future to set mtime and atime (but some filesystems limit it up to 2446-05-10 or 2038-01-19 or 2486-07-02)" do
# https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#Inode_Timestamps
# "Therefore, timestamps should not overflow until May 2446."
# https://lwn.net/Articles/804382/
# "On-disk timestamps hitting the y2038 limit..."
# The problem seems to be being improved, but currently it actually fails on XFS on RHEL8
# https://rubyci.org/logs/rubyci.s3.amazonaws.com/rhel8/ruby-master/log/20201112T123004Z.fail.html.gz
# Amazon Linux 2023 returns 2486-07-02 in this example
# http://rubyci.s3.amazonaws.com/amazon2023/ruby-master/log/20230322T063004Z.fail.html.gz
time = Time.at(1<<44)
File.send(@method, time, time, @file1)

[559444, 2486, 2446, 2038].should.include? File.atime(@file1).year
[559444, 2486, 2446, 2038].should.include? File.mtime(@file1).year
end
end
end
end
100 changes: 2 additions & 98 deletions spec/ruby/core/file/utime_spec.rb
Original file line number Diff line number Diff line change
@@ -1,102 +1,6 @@
require_relative '../../spec_helper'
require_relative 'shared/update_time'

describe "File.utime" do

before :all do
@time_is_float = platform_is :windows
end

before :each do
@atime = Time.now
@mtime = Time.now
@file1 = tmp("specs_file_utime1")
@file2 = tmp("specs_file_utime2")
touch @file1
touch @file2
end

after :each do
rm_r @file1, @file2
end

it "sets the access and modification time of each file" do
File.utime(@atime, @mtime, @file1, @file2)
if @time_is_float
File.atime(@file1).should be_close(@atime, 0.0001)
File.mtime(@file1).should be_close(@mtime, 0.0001)
File.atime(@file2).should be_close(@atime, 0.0001)
File.mtime(@file2).should be_close(@mtime, 0.0001)
else
File.atime(@file1).to_i.should be_close(@atime.to_i, TIME_TOLERANCE)
File.mtime(@file1).to_i.should be_close(@mtime.to_i, TIME_TOLERANCE)
File.atime(@file2).to_i.should be_close(@atime.to_i, TIME_TOLERANCE)
File.mtime(@file2).to_i.should be_close(@mtime.to_i, TIME_TOLERANCE)
end
end

it "uses the current times if two nil values are passed" do
tn = Time.now
File.utime(nil, nil, @file1, @file2)
if @time_is_float
File.atime(@file1).should be_close(tn, 0.050)
File.mtime(@file1).should be_close(tn, 0.050)
File.atime(@file2).should be_close(tn, 0.050)
File.mtime(@file2).should be_close(tn, 0.050)
else
File.atime(@file1).to_i.should be_close(Time.now.to_i, TIME_TOLERANCE)
File.mtime(@file1).to_i.should be_close(Time.now.to_i, TIME_TOLERANCE)
File.atime(@file2).to_i.should be_close(Time.now.to_i, TIME_TOLERANCE)
File.mtime(@file2).to_i.should be_close(Time.now.to_i, TIME_TOLERANCE)
end
end

it "accepts an object that has a #to_path method" do
File.utime(@atime, @mtime, mock_to_path(@file1), mock_to_path(@file2))
end

it "accepts numeric atime and mtime arguments" do
if @time_is_float
File.utime(@atime.to_f, @mtime.to_f, @file1, @file2)
File.atime(@file1).should be_close(@atime, 0.0001)
File.mtime(@file1).should be_close(@mtime, 0.0001)
File.atime(@file2).should be_close(@atime, 0.0001)
File.mtime(@file2).should be_close(@mtime, 0.0001)
else
File.utime(@atime.to_i, @mtime.to_i, @file1, @file2)
File.atime(@file1).to_i.should be_close(@atime.to_i, TIME_TOLERANCE)
File.mtime(@file1).to_i.should be_close(@mtime.to_i, TIME_TOLERANCE)
File.atime(@file2).to_i.should be_close(@atime.to_i, TIME_TOLERANCE)
File.mtime(@file2).to_i.should be_close(@mtime.to_i, TIME_TOLERANCE)
end
end

it "may set nanosecond precision" do
t = Time.utc(2007, 11, 1, 15, 25, 0, 123456.789r)
File.utime(t, t, @file1)
File.atime(@file1).nsec.should.between?(0, 123500000)
File.mtime(@file1).nsec.should.between?(0, 123500000)
end

it "returns the number of filenames in the arguments" do
File.utime(@atime.to_f, @mtime.to_f, @file1, @file2).should == 2
end

platform_is :linux do
platform_is wordsize: 64 do
it "allows Time instances in the far future to set mtime and atime (but some filesystems limit it up to 2446-05-10 or 2038-01-19 or 2486-07-02)" do
# https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#Inode_Timestamps
# "Therefore, timestamps should not overflow until May 2446."
# https://lwn.net/Articles/804382/
# "On-disk timestamps hitting the y2038 limit..."
# The problem seems to be being improved, but currently it actually fails on XFS on RHEL8
# https://rubyci.org/logs/rubyci.s3.amazonaws.com/rhel8/ruby-master/log/20201112T123004Z.fail.html.gz
# Amazon Linux 2023 returns 2486-07-02 in this example
# http://rubyci.s3.amazonaws.com/amazon2023/ruby-master/log/20230322T063004Z.fail.html.gz
time = Time.at(1<<44)
File.utime(time, time, @file1)
[559444, 2486, 2446, 2038].should.include? File.atime(@file1).year
[559444, 2486, 2446, 2038].should.include? File.mtime(@file1).year
end
end
end
it_behaves_like :update_time, :utime
end
8 changes: 8 additions & 0 deletions spec/ruby/core/filetest/exist_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,11 @@
describe "FileTest.exist?" do
it_behaves_like :file_exist, :exist?, FileTest
end

ruby_version_is "3.2" do
describe "FileTest.exists?" do
it "has been removed" do
FileTest.should_not.respond_to?(:exists?)
end
end
end
14 changes: 14 additions & 0 deletions spec/ruby/core/kernel/not_match_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,20 @@ def !~(obj)
(obj !~ :foo).should == false
end

ruby_version_is ""..."3.2" do
it "returns true if self does not respond to #=~" do
suppress_warning do
(Object.new !~ :foo).should == true
end
end
end

ruby_version_is "3.2" do
it "raises NoMethodError if self does not respond to #=~" do
-> { Object.new !~ :foo }.should raise_error(NoMethodError)
end
end

it 'can be overridden in subclasses' do
obj = KernelSpecs::NotMatch.new
(obj !~ :bar).should == :foo
Expand Down
16 changes: 16 additions & 0 deletions spec/ruby/core/method/parameters_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ def one_splat_one_block(*args, &block)
local_is_not_parameter = {}
end

def forward_parameters(...) end

def underscore_parameters(_, _, _ = 1, *_, _:, _: 2, **_, &_); end

define_method(:one_optional_defined_method) {|x = 1|}
Expand Down Expand Up @@ -267,6 +269,20 @@ def object.foo(&)
end
end

ruby_version_is ""..."3.1" do
it "returns [:rest, :*], [:block, :&] for forward parameters operator" do
m = MethodSpecs::Methods.new
m.method(:forward_parameters).parameters.should == [[:rest, :*], [:block, :&]]
end
end

ruby_version_is "3.1" do
it "returns [:rest, :*], [:keyrest, :**], [:block, :&] for forward parameters operator" do
m = MethodSpecs::Methods.new
m.method(:forward_parameters).parameters.should == [[:rest, :*], [:keyrest, :**], [:block, :&]]
end
end

it "returns the args and block for a splat and block argument" do
m = MethodSpecs::Methods.new
m.method(:one_splat_one_block).parameters.should == [[:rest, :args], [:block, :block]]
Expand Down
14 changes: 14 additions & 0 deletions spec/ruby/core/proc/parameters_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,16 @@
it "regards named parameters in lambda as optional if lambda: false keyword used" do
-> x { }.parameters(lambda: false).first.first.should == :opt
end

it "regards named parameters in procs and lambdas as required if lambda keyword is truthy" do
proc {|x| }.parameters(lambda: 123).first.first.should == :req
-> x { }.parameters(lambda: 123).first.first.should == :req
end

it "ignores the lambda keyword if it is nil" do
proc {|x|}.parameters(lambda: nil).first.first.should == :opt
-> x { }.parameters(lambda: nil).first.first.should == :req
end
end

it "regards optional keyword parameters in procs as optional" do
Expand Down Expand Up @@ -160,4 +170,8 @@
[:block, :_]
]
end

it "returns :nokey for **nil parameter" do
proc { |**nil| }.parameters.should == [[:nokey]]
end
end
12 changes: 12 additions & 0 deletions spec/ruby/core/string/to_i_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,18 @@
"1_2_3asdf".to_i.should == 123
end

it "ignores multiple non-consecutive underscoes when the first digit is 0" do
(2..16).each do |base|
"0_0_010".to_i(base).should == base;
end
end

it "bails out at the first double underscore if the first digit is 0" do
(2..16).each do |base|
"010__1".to_i(base).should == base;
end
end

it "ignores leading whitespaces" do
[ " 123", " 123", "\r\n\r\n123", "\t\t123",
"\r\n\t\n123", " \t\n\r\t 123"].each do |str|
Expand Down
Loading

0 comments on commit 815db5c

Please sign in to comment.