diff options
author | Benoit Daloze <[email protected]> | 2020-09-30 12:21:48 +0200 |
---|---|---|
committer | Benoit Daloze <[email protected]> | 2020-09-30 12:21:48 +0200 |
commit | 201d50164016bc519041af302f47d92f314abac5 (patch) | |
tree | 688544ac063d8a3825d96474055f5c11ad471972 | |
parent | ce986b41caa1f23b6d07914b8eca62fdff24e034 (diff) |
Update to ruby/spec@9277d27
-rw-r--r-- | spec/ruby/.mspec.constants | 1 | ||||
-rw-r--r-- | spec/ruby/core/exception/top_level_spec.rb | 25 | ||||
-rw-r--r-- | spec/ruby/core/kernel/freeze_spec.rb | 8 | ||||
-rw-r--r-- | spec/ruby/core/kernel/instance_variables_spec.rb | 4 | ||||
-rw-r--r-- | spec/ruby/core/kernel/shared/require.rb | 15 | ||||
-rw-r--r-- | spec/ruby/core/process/spawn_spec.rb | 9 | ||||
-rw-r--r-- | spec/ruby/core/string/encode_spec.rb | 31 | ||||
-rw-r--r-- | spec/ruby/language/def_spec.rb | 39 | ||||
-rw-r--r-- | spec/ruby/library/coverage/fixtures/eval_code.rb | 11 | ||||
-rw-r--r-- | spec/ruby/library/coverage/result_spec.rb | 14 | ||||
-rw-r--r-- | spec/ruby/library/digest/instance/append_spec.rb | 7 | ||||
-rw-r--r-- | spec/ruby/library/digest/instance/shared/update.rb | 8 | ||||
-rw-r--r-- | spec/ruby/library/digest/instance/update_spec.rb | 7 | ||||
-rw-r--r-- | spec/ruby/optional/capi/ext/kernel_spec.c | 10 | ||||
-rw-r--r-- | spec/ruby/optional/capi/ext/object_spec.c | 5 | ||||
-rw-r--r-- | spec/ruby/optional/capi/kernel_spec.rb | 12 | ||||
-rw-r--r-- | spec/ruby/optional/capi/object_spec.rb | 9 |
17 files changed, 209 insertions, 6 deletions
diff --git a/spec/ruby/.mspec.constants b/spec/ruby/.mspec.constants index 3e3bdbef8a..6b70274c52 100644 --- a/spec/ruby/.mspec.constants +++ b/spec/ruby/.mspec.constants @@ -41,6 +41,7 @@ ComparisonTest ConstantSpecsIncludedModule ConstantVisibility Coverage +CoverageSpecs CustomArgumentError DRb DRbIdConv diff --git a/spec/ruby/core/exception/top_level_spec.rb b/spec/ruby/core/exception/top_level_spec.rb index 96f957411e..97a91b0a58 100644 --- a/spec/ruby/core/exception/top_level_spec.rb +++ b/spec/ruby/core/exception/top_level_spec.rb @@ -5,6 +5,31 @@ describe "An Exception reaching the top level" do ruby_exe('raise "foo"', args: "2>&1").should.include?("in `<main>': foo (RuntimeError)") end + ruby_version_is "2.6" do + it "the Exception#cause is printed to STDERR with backtraces" do + code = <<-RUBY + def raise_cause + raise "the cause" + end + def raise_wrapped + raise "wrapped" + end + begin + raise_cause + rescue + raise_wrapped + end + RUBY + lines = ruby_exe(code, args: "2>&1").lines + lines.reject! { |l| l.include?('rescue in') } + lines.map! { |l| l.split(':')[2..-1].join(':').chomp } + lines.should == ["in `raise_wrapped': wrapped (RuntimeError)", + "in `<main>'", + "in `raise_cause': the cause (RuntimeError)", + "in `<main>'"] + end + end + describe "with a custom backtrace" do it "is printed on STDERR" do code = <<-RUBY diff --git a/spec/ruby/core/kernel/freeze_spec.rb b/spec/ruby/core/kernel/freeze_spec.rb index e4a01b5df5..fa32d321cf 100644 --- a/spec/ruby/core/kernel/freeze_spec.rb +++ b/spec/ruby/core/kernel/freeze_spec.rb @@ -80,4 +80,12 @@ describe "Kernel#freeze" do o.freeze -> {o.instance_variable_set(:@foo, 1)}.should raise_error(RuntimeError) end + + it "freezes an object's singleton class" do + o = Object.new + c = o.singleton_class + c.frozen?.should == false + o.freeze + c.frozen?.should == true + end end diff --git a/spec/ruby/core/kernel/instance_variables_spec.rb b/spec/ruby/core/kernel/instance_variables_spec.rb index b6d6e27772..831f0662a2 100644 --- a/spec/ruby/core/kernel/instance_variables_spec.rb +++ b/spec/ruby/core/kernel/instance_variables_spec.rb @@ -4,7 +4,9 @@ require_relative 'fixtures/classes' describe "Kernel#instance_variables" do describe "immediate values" do it "returns an empty array if no instance variables are defined" do - 0.instance_variables.should == [] + [0, 0.5, true, false, nil].each do |value| + value.instance_variables.should == [] + end end it "returns the correct array if an instance variable is added" do diff --git a/spec/ruby/core/kernel/shared/require.rb b/spec/ruby/core/kernel/shared/require.rb index 0e7f8ba665..6c6895e317 100644 --- a/spec/ruby/core/kernel/shared/require.rb +++ b/spec/ruby/core/kernel/shared/require.rb @@ -344,6 +344,21 @@ describe :kernel_require, shared: true do loaded_feature = $LOADED_FEATURES.last ScratchPad.recorded.should == [loaded_feature] end + + it "requires only once when a new matching file added to path" do + @object.require('load_fixture').should be_true + ScratchPad.recorded.should == [:loaded] + + symlink_to_code_dir_two = tmp("codesymlinktwo") + File.symlink("#{CODE_LOADING_DIR}/b", symlink_to_code_dir_two) + begin + $LOAD_PATH.unshift(symlink_to_code_dir_two) + + @object.require('load_fixture').should be_false + ensure + rm_r symlink_to_code_dir_two + end + end end describe "with symlinks in the required feature and $LOAD_PATH" do diff --git a/spec/ruby/core/process/spawn_spec.rb b/spec/ruby/core/process/spawn_spec.rb index 6b08e0227b..8c544daae4 100644 --- a/spec/ruby/core/process/spawn_spec.rb +++ b/spec/ruby/core/process/spawn_spec.rb @@ -536,6 +536,15 @@ describe "Process.spawn" do File.read(@name).should == "glarkbang" end + it "closes STDERR in the child if :err => :close" do + File.open(@name, 'w') do |file| + -> do + code = "begin; STDOUT.puts 'out'; STDERR.puts 'hello'; rescue => e; puts 'rescued'; end" + Process.wait Process.spawn(ruby_cmd(code), :out => file, :err => :close) + end.should output_to_fd("out\nrescued\n", file) + end + end + # :close_others platform_is_not :windows do diff --git a/spec/ruby/core/string/encode_spec.rb b/spec/ruby/core/string/encode_spec.rb index 04d9db855a..ae641b2110 100644 --- a/spec/ruby/core/string/encode_spec.rb +++ b/spec/ruby/core/string/encode_spec.rb @@ -19,13 +19,17 @@ describe "String#encode" do it "returns a copy when Encoding.default_internal is nil" do Encoding.default_internal = nil str = "あ" - str.encode.should_not equal(str) + encoded = str.encode + encoded.should_not equal(str) + encoded.should == str end it "returns a copy for a ASCII-only String when Encoding.default_internal is nil" do Encoding.default_internal = nil str = "abc" - str.encode.should_not equal(str) + encoded = str.encode + encoded.should_not equal(str) + encoded.should == str end it "encodes an ascii substring of a binary string to UTF-8" do @@ -39,7 +43,9 @@ describe "String#encode" do describe "when passed to encoding" do it "returns a copy when passed the same encoding as the String" do str = "あ" - str.encode(Encoding::UTF_8).should_not equal(str) + encoded = str.encode(Encoding::UTF_8) + encoded.should_not equal(str) + encoded.should == str end it "round trips a String" do @@ -75,6 +81,7 @@ describe "String#encode" do encoded = str.encode("utf-8", "utf-8") encoded.should_not equal(str) + encoded.should == str.force_encoding("utf-8") encoded.encoding.should == Encoding::UTF_8 end @@ -87,14 +94,28 @@ describe "String#encode" do describe "when passed to, options" do it "returns a copy when the destination encoding is the same as the String encoding" do str = "あ" - str.encode(Encoding::UTF_8, undef: :replace).should_not equal(str) + encoded = str.encode(Encoding::UTF_8, undef: :replace) + encoded.should_not equal(str) + encoded.should == str end end describe "when passed to, from, options" do it "returns a copy when both encodings are the same" do str = "あ" - str.encode("utf-8", "utf-8", invalid: :replace).should_not equal(str) + encoded = str.encode("utf-8", "utf-8", invalid: :replace) + encoded.should_not equal(str) + encoded.should == str + end + + it "returns a copy in the destination encoding when both encodings are the same" do + str = "あ" + str.force_encoding("binary") + encoded = str.encode("utf-8", "utf-8", invalid: :replace) + + encoded.should_not equal(str) + encoded.should == str.force_encoding("utf-8") + encoded.encoding.should == Encoding::UTF_8 end end end diff --git a/spec/ruby/language/def_spec.rb b/spec/ruby/language/def_spec.rb index 00655b2b12..6b0be19d90 100644 --- a/spec/ruby/language/def_spec.rb +++ b/spec/ruby/language/def_spec.rb @@ -89,6 +89,26 @@ describe "An instance method" do def foo(a); end -> { foo 1, 2 }.should raise_error(ArgumentError, 'wrong number of arguments (given 2, expected 1)') end + + it "raises FrozenError with the correct class name" do + -> { + Module.new do + self.freeze + def foo; end + end + }.should raise_error(FrozenError) { |e| + e.message.should.start_with? "can't modify frozen module" + } + + -> { + Class.new do + self.freeze + def foo; end + end + }.should raise_error(FrozenError){ |e| + e.message.should.start_with? "can't modify frozen class" + } + end end describe "An instance method definition with a splat" do @@ -266,6 +286,25 @@ describe "A singleton method definition" do obj.freeze -> { def obj.foo; end }.should raise_error(FrozenError) end + + it "raises FrozenError with the correct class name" do + obj = Object.new + obj.freeze + -> { def obj.foo; end }.should raise_error(FrozenError){ |e| + e.message.should.start_with? "can't modify frozen object" + } + + c = obj.singleton_class + -> { def c.foo; end }.should raise_error(FrozenError){ |e| + e.message.should.start_with? "can't modify frozen Class" + } + + m = Module.new + m.freeze + -> { def m.foo; end }.should raise_error(FrozenError){ |e| + e.message.should.start_with? "can't modify frozen Module" + } + end end describe "Redefining a singleton method" do diff --git a/spec/ruby/library/coverage/fixtures/eval_code.rb b/spec/ruby/library/coverage/fixtures/eval_code.rb new file mode 100644 index 0000000000..8ab82218f3 --- /dev/null +++ b/spec/ruby/library/coverage/fixtures/eval_code.rb @@ -0,0 +1,11 @@ +5 + 5 + +module CoverageSpecs + + class_eval <<-RUBY, __FILE__, __LINE__ + 1 + attr_reader :ok + RUBY + +end + +4 + 4 diff --git a/spec/ruby/library/coverage/result_spec.rb b/spec/ruby/library/coverage/result_spec.rb index 9b84530076..6cf5be1346 100644 --- a/spec/ruby/library/coverage/result_spec.rb +++ b/spec/ruby/library/coverage/result_spec.rb @@ -5,11 +5,13 @@ describe 'Coverage.result' do before :all do @class_file = fixture __FILE__, 'some_class.rb' @config_file = fixture __FILE__, 'start_coverage.rb' + @eval_code_file = fixture __FILE__, 'eval_code.rb' end after :each do $LOADED_FEATURES.delete(@class_file) $LOADED_FEATURES.delete(@config_file) + $LOADED_FEATURES.delete(@eval_code_file) end it 'gives the covered files as a hash with arrays of count or nil' do @@ -75,4 +77,16 @@ describe 'Coverage.result' do require @config_file.chomp('.rb') Coverage.result.should_not include(@config_file) end + + it 'returns the correct results when eval is used' do + Coverage.start + require @eval_code_file.chomp('.rb') + result = Coverage.result + + result.should == { + @eval_code_file => [ + 1, nil, 1, nil, 1, nil, nil, nil, nil, nil, 1 + ] + } + end end diff --git a/spec/ruby/library/digest/instance/append_spec.rb b/spec/ruby/library/digest/instance/append_spec.rb new file mode 100644 index 0000000000..2499579298 --- /dev/null +++ b/spec/ruby/library/digest/instance/append_spec.rb @@ -0,0 +1,7 @@ +require_relative '../../../spec_helper' +require 'digest' +require_relative 'shared/update' + +describe "Digest::Instance#<<" do + it_behaves_like :digest_instance_update, :<< +end diff --git a/spec/ruby/library/digest/instance/shared/update.rb b/spec/ruby/library/digest/instance/shared/update.rb new file mode 100644 index 0000000000..dccc8f80df --- /dev/null +++ b/spec/ruby/library/digest/instance/shared/update.rb @@ -0,0 +1,8 @@ +describe :digest_instance_update, shared: true do + it "raises a RuntimeError if called" do + c = Class.new do + include Digest::Instance + end + -> { c.new.update("test") }.should raise_error(RuntimeError) + end +end diff --git a/spec/ruby/library/digest/instance/update_spec.rb b/spec/ruby/library/digest/instance/update_spec.rb new file mode 100644 index 0000000000..3bb4dd7f1b --- /dev/null +++ b/spec/ruby/library/digest/instance/update_spec.rb @@ -0,0 +1,7 @@ +require_relative '../../../spec_helper' +require 'digest' +require_relative 'shared/update' + +describe "Digest::Instance#update" do + it_behaves_like :digest_instance_update, :update +end diff --git a/spec/ruby/optional/capi/ext/kernel_spec.c b/spec/ruby/optional/capi/ext/kernel_spec.c index 6d074de085..4048684b2c 100644 --- a/spec/ruby/optional/capi/ext/kernel_spec.c +++ b/spec/ruby/optional/capi/ext/kernel_spec.c @@ -270,6 +270,15 @@ static VALUE kernel_spec_rb_yield_values(VALUE self, VALUE obj1, VALUE obj2) { return rb_yield_values(2, obj1, obj2); } +static VALUE kernel_spec_rb_yield_values2(VALUE self, VALUE ary) { + long len = RARRAY_LEN(ary); + VALUE *args = (VALUE*)alloca(sizeof(VALUE) * len); + for (int i = 0; i < len; i++) { + args[i] = rb_ary_entry(ary, i); + } + return rb_yield_values2((int)len, args); +} + static VALUE do_rec(VALUE obj, VALUE arg, int is_rec) { if(is_rec) { return obj; @@ -351,6 +360,7 @@ void Init_kernel_spec(void) { rb_define_method(cls, "rb_yield_indirected", kernel_spec_rb_yield_indirected, 1); rb_define_method(cls, "rb_yield_define_each", kernel_spec_rb_yield_define_each, 1); rb_define_method(cls, "rb_yield_values", kernel_spec_rb_yield_values, 2); + rb_define_method(cls, "rb_yield_values2", kernel_spec_rb_yield_values2, 1); rb_define_method(cls, "rb_yield_splat", kernel_spec_rb_yield_splat, 1); rb_define_method(cls, "rb_exec_recursive", kernel_spec_rb_exec_recursive, 1); rb_define_method(cls, "rb_set_end_proc", kernel_spec_rb_set_end_proc, 1); diff --git a/spec/ruby/optional/capi/ext/object_spec.c b/spec/ruby/optional/capi/ext/object_spec.c index 477105aacc..fbdc19954f 100644 --- a/spec/ruby/optional/capi/ext/object_spec.c +++ b/spec/ruby/optional/capi/ext/object_spec.c @@ -315,6 +315,10 @@ static VALUE object_spec_rb_iv_set(VALUE self, VALUE obj, VALUE name, VALUE valu return rb_iv_set(obj, RSTRING_PTR(name), value); } +static VALUE object_spec_rb_ivar_count(VALUE self, VALUE obj) { + return ULONG2NUM(rb_ivar_count(obj)); +} + static VALUE object_spec_rb_ivar_get(VALUE self, VALUE obj, VALUE sym_name) { return rb_ivar_get(obj, SYM2ID(sym_name)); } @@ -441,6 +445,7 @@ void Init_object_spec(void) { rb_define_method(cls, "rb_obj_instance_eval", object_spec_rb_obj_instance_eval, 1); rb_define_method(cls, "rb_iv_get", object_spec_rb_iv_get, 2); rb_define_method(cls, "rb_iv_set", object_spec_rb_iv_set, 3); + rb_define_method(cls, "rb_ivar_count", object_spec_rb_ivar_count, 1); rb_define_method(cls, "rb_ivar_get", object_spec_rb_ivar_get, 2); rb_define_method(cls, "rb_ivar_set", object_spec_rb_ivar_set, 3); rb_define_method(cls, "rb_ivar_defined", object_spec_rb_ivar_defined, 2); diff --git a/spec/ruby/optional/capi/kernel_spec.rb b/spec/ruby/optional/capi/kernel_spec.rb index cbd0a50dea..44cf311895 100644 --- a/spec/ruby/optional/capi/kernel_spec.rb +++ b/spec/ruby/optional/capi/kernel_spec.rb @@ -238,6 +238,18 @@ describe "C-API Kernel function" do end end + describe "rb_yield_values2" do + it "yields passed arguments" do + ret = nil + @s.rb_yield_values2([1, 2]) { |x, y| ret = x + y } + ret.should == 3 + end + + it "returns the result from block evaluation" do + @s.rb_yield_values2([1, 2]) { |x, y| x + y }.should == 3 + end + end + describe "rb_yield_splat" do it "yields with passed array's contents" do ret = nil diff --git a/spec/ruby/optional/capi/object_spec.rb b/spec/ruby/optional/capi/object_spec.rb index 484dfb851c..e8e905b237 100644 --- a/spec/ruby/optional/capi/object_spec.rb +++ b/spec/ruby/optional/capi/object_spec.rb @@ -820,6 +820,15 @@ describe "CApiObject" do end end + describe "rb_ivar_count" do + it "returns the number of instance variables" do + obj = Object.new + @o.rb_ivar_count(obj).should == 0 + obj.instance_variable_set(:@foo, 42) + @o.rb_ivar_count(obj).should == 1 + end + end + describe "rb_ivar_get" do it "returns the instance variable on an object" do @o.rb_ivar_get(@test, :@foo).should == @test.instance_eval { @foo } |