mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Update to ruby/spec@9277d27
This commit is contained in:
parent
ce986b41ca
commit
201d501640
17 changed files with 209 additions and 6 deletions
|
@ -41,6 +41,7 @@ ComparisonTest
|
|||
ConstantSpecsIncludedModule
|
||||
ConstantVisibility
|
||||
Coverage
|
||||
CoverageSpecs
|
||||
CustomArgumentError
|
||||
DRb
|
||||
DRbIdConv
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
11
spec/ruby/library/coverage/fixtures/eval_code.rb
Normal file
11
spec/ruby/library/coverage/fixtures/eval_code.rb
Normal file
|
@ -0,0 +1,11 @@
|
|||
5 + 5
|
||||
|
||||
module CoverageSpecs
|
||||
|
||||
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
||||
attr_reader :ok
|
||||
RUBY
|
||||
|
||||
end
|
||||
|
||||
4 + 4
|
|
@ -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
|
||||
|
|
7
spec/ruby/library/digest/instance/append_spec.rb
Normal file
7
spec/ruby/library/digest/instance/append_spec.rb
Normal file
|
@ -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
|
8
spec/ruby/library/digest/instance/shared/update.rb
Normal file
8
spec/ruby/library/digest/instance/shared/update.rb
Normal file
|
@ -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
|
7
spec/ruby/library/digest/instance/update_spec.rb
Normal file
7
spec/ruby/library/digest/instance/update_spec.rb
Normal file
|
@ -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
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 }
|
||||
|
|
Loading…
Reference in a new issue