diff options
Diffstat (limited to 'spec/ruby/shared/basicobject')
| -rw-r--r-- | spec/ruby/shared/basicobject/method_missing.rb | 36 | ||||
| -rw-r--r-- | spec/ruby/shared/basicobject/send.rb | 28 |
2 files changed, 40 insertions, 24 deletions
diff --git a/spec/ruby/shared/basicobject/method_missing.rb b/spec/ruby/shared/basicobject/method_missing.rb index 97ece14c03..4871603dce 100644 --- a/spec/ruby/shared/basicobject/method_missing.rb +++ b/spec/ruby/shared/basicobject/method_missing.rb @@ -1,5 +1,5 @@ -require File.expand_path('../../../spec_helper', __FILE__) -require File.expand_path('../../../fixtures/basicobject/method_missing', __FILE__) +require_relative '../../spec_helper' +require_relative '../../fixtures/basicobject/method_missing' describe :method_missing_defined_module, shared: true do describe "for a Module with #method_missing defined" do @@ -24,15 +24,15 @@ end describe :method_missing_module, shared: true do describe "for a Module" do it "raises a NoMethodError when an undefined method is called" do - lambda { @object.no_such_method }.should raise_error(NoMethodError) + -> { @object.no_such_method }.should raise_error(NoMethodError) end it "raises a NoMethodError when a protected method is called" do - lambda { @object.method_protected }.should raise_error(NoMethodError) + -> { @object.method_protected }.should raise_error(NoMethodError) end it "raises a NoMethodError when a private method is called" do - lambda { @object.method_private }.should raise_error(NoMethodError) + -> { @object.method_private }.should raise_error(NoMethodError) end end end @@ -60,15 +60,15 @@ end describe :method_missing_class, shared: true do describe "for a Class" do it "raises a NoMethodError when an undefined method is called" do - lambda { @object.no_such_method }.should raise_error(NoMethodError) + -> { @object.no_such_method }.should raise_error(NoMethodError) end it "raises a NoMethodError when a protected method is called" do - lambda { @object.method_protected }.should raise_error(NoMethodError) + -> { @object.method_protected }.should raise_error(NoMethodError) end it "raises a NoMethodError when a private method is called" do - lambda { @object.method_private }.should raise_error(NoMethodError) + -> { @object.method_private }.should raise_error(NoMethodError) end end end @@ -100,26 +100,24 @@ end describe :method_missing_instance, shared: true do describe "for an instance" do it "raises a NoMethodError when an undefined method is called" do - lambda { @object.new.no_such_method }.should raise_error(NoMethodError) + -> { @object.new.no_such_method }.should raise_error(NoMethodError) end it "raises a NoMethodError when a protected method is called" do - lambda { @object.new.method_protected }.should raise_error(NoMethodError) + -> { @object.new.method_protected }.should raise_error(NoMethodError) end it "raises a NoMethodError when a private method is called" do - lambda { @object.new.method_private }.should raise_error(NoMethodError) + -> { @object.new.method_private }.should raise_error(NoMethodError) end - ruby_version_is "2.3" do - it 'sets the receiver of the raised NoMethodError' do - obj = @object.new + it 'sets the receiver of the raised NoMethodError' do + obj = @object.new - begin - obj.method_private - rescue NoMethodError => error - (error.receiver == obj).should == true - end + begin + obj.method_private + rescue NoMethodError => error + (error.receiver == obj).should == true end end end diff --git a/spec/ruby/shared/basicobject/send.rb b/spec/ruby/shared/basicobject/send.rb index f8c63c5522..625aaa2917 100644 --- a/spec/ruby/shared/basicobject/send.rb +++ b/spec/ruby/shared/basicobject/send.rb @@ -29,13 +29,20 @@ describe :basicobject_send, shared: true do SendSpecs::Foo.send(@method, :bar).should == 'done' end + it "raises a TypeError if the method name is not a string or symbol" do + -> { SendSpecs.send(@method, nil) }.should raise_error(TypeError, /not a symbol nor a string/) + -> { SendSpecs.send(@method, 42) }.should raise_error(TypeError, /not a symbol nor a string/) + -> { SendSpecs.send(@method, 3.14) }.should raise_error(TypeError, /not a symbol nor a string/) + -> { SendSpecs.send(@method, true) }.should raise_error(TypeError, /not a symbol nor a string/) + end + it "raises a NameError if the corresponding method can't be found" do class SendSpecs::Foo def bar 'done' end end - lambda { SendSpecs::Foo.new.send(@method, :syegsywhwua) }.should raise_error(NameError) + -> { SendSpecs::Foo.new.send(@method, :syegsywhwua) }.should raise_error(NameError) end it "raises a NameError if the corresponding singleton method can't be found" do @@ -44,12 +51,12 @@ describe :basicobject_send, shared: true do 'done' end end - lambda { SendSpecs::Foo.send(@method, :baz) }.should raise_error(NameError) + -> { SendSpecs::Foo.send(@method, :baz) }.should raise_error(NameError) end it "raises an ArgumentError if no arguments are given" do class SendSpecs::Foo; end - lambda { SendSpecs::Foo.new.send @method }.should raise_error(ArgumentError) + -> { SendSpecs::Foo.new.send @method }.should raise_error(ArgumentError) end it "raises an ArgumentError if called with more arguments than available parameters" do @@ -57,7 +64,7 @@ describe :basicobject_send, shared: true do def bar; end end - lambda { SendSpecs::Foo.new.send(@method, :bar, :arg) }.should raise_error(ArgumentError) + -> { SendSpecs::Foo.new.send(@method, :bar, :arg) }.should raise_error(ArgumentError) end it "raises an ArgumentError if called with fewer arguments than required parameters" do @@ -65,7 +72,7 @@ describe :basicobject_send, shared: true do def foo(arg); end end - lambda { SendSpecs::Foo.new.send(@method, :foo) }.should raise_error(ArgumentError) + -> { SendSpecs::Foo.new.send(@method, :foo) }.should raise_error(ArgumentError) end it "succeeds if passed an arbitrary number of arguments as a splat parameter" do @@ -107,4 +114,15 @@ describe :basicobject_send, shared: true do it "has a negative arity" do method(@method).arity.should < 0 end + + it "invokes module methods with super correctly" do + m1 = Module.new { def foo(ary); ary << :m1; end; } + m2 = Module.new { def foo(ary = []); super(ary); ary << :m2; end; } + c2 = Class.new do + include m1 + include m2 + end + + c2.new.send(@method, :foo, *[[]]).should == %i[m1 m2] + end end |
