diff options
Diffstat (limited to 'spec/ruby/core/module/using_spec.rb')
| -rw-r--r-- | spec/ruby/core/module/using_spec.rb | 135 |
1 files changed, 118 insertions, 17 deletions
diff --git a/spec/ruby/core/module/using_spec.rb b/spec/ruby/core/module/using_spec.rb index 32e8f8f96b..cff0edef28 100644 --- a/spec/ruby/core/module/using_spec.rb +++ b/spec/ruby/core/module/using_spec.rb @@ -1,5 +1,4 @@ -require File.expand_path('../../../spec_helper', __FILE__) -require File.expand_path('../fixtures/using', __FILE__) +require_relative '../../spec_helper' describe "Module#using" do it "imports class refinements from module into the current class/module" do @@ -25,39 +24,39 @@ describe "Module#using" do end end - -> () { + -> { Module.new do using refinement end - }.should_not raise_error + }.should_not.raise end it "accepts module without refinements" do mod = Module.new - -> () { + -> { Module.new do using mod end - }.should_not raise_error + }.should_not.raise end it "does not accept class" do klass = Class.new - -> () { + -> { Module.new do using klass end - }.should raise_error(TypeError) + }.should.raise(TypeError) end it "raises TypeError if passed something other than module" do - -> () { + -> { Module.new do using "foo" end - }.should raise_error(TypeError) + }.should.raise(TypeError) end it "returns self" do @@ -68,7 +67,7 @@ describe "Module#using" do result = using refinement end - result.should equal(mod) + result.should.equal?(mod) end it "works in classes too" do @@ -90,13 +89,13 @@ describe "Module#using" do it "raises error in method scope" do mod = Module.new do def self.foo - using ModuleSpecs::EmptyRefinement + using Module.new {} end end - -> () { + -> { mod.foo - }.should raise_error(RuntimeError, /Module#using is not permitted in methods/) + }.should.raise(RuntimeError, /Module#using is not permitted in methods/) end it "activates refinement even for existed objects" do @@ -156,7 +155,11 @@ describe "Module#using" do Module.new do Class.new do - using ModuleSpecs::RefinementForStringToS + using Module.new { + refine String do + def to_s; "hello from refinement"; end + end + } ScratchPad << "1".to_s end @@ -175,7 +178,11 @@ describe "Module#using" do Module.new do Class.new do ScratchPad << "1".to_s - using ModuleSpecs::RefinementForStringToS + using Module.new { + refine String do + def to_s; "hello from refinement"; end + end + } ScratchPad << "1".to_s end end @@ -236,12 +243,106 @@ describe "Module#using" do mod.call_foo(c).should == "foo from refinement" end + it "is active for module defined via Module.new {}" do + refinement = Module.new do + refine Integer do + def foo; "foo from refinement"; end + end + end + + result = nil + + Module.new do + using refinement + + Module.new do + result = 1.foo + end + end + + result.should == "foo from refinement" + end + + it "is active for class defined via Class.new {}" do + refinement = Module.new do + refine Integer do + def foo; "foo from refinement"; end + end + end + + result = nil + + Module.new do + using refinement + + Class.new do + result = 1.foo + end + end + + result.should == "foo from refinement" + end + + it "is active for block called via instance_exec" do + refinement = Module.new do + refine Integer do + def foo; "foo from refinement"; end + end + end + + c = Class.new do + using refinement + + def abc + block = -> { + 1.foo + } + + self.instance_exec(&block) + end + end + + c.new.abc.should == "foo from refinement" + end + + it "is active for block called via instance_eval" do + refinement = Module.new do + refine String do + def foo; "foo from refinement"; end + end + end + + c = Class.new do + using refinement + + def initialize + @a = +"1703" + + @a.instance_eval do + def abc + "#{self}: #{self.foo}" + end + end + end + + def abc + @a.abc + end + end + + c.new.abc.should == "1703: foo from refinement" + end + it "is not active if `using` call is not evaluated" do result = nil Module.new do if false - using ModuleSpecs::RefinementForStringToS + using Module.new { + refine String do + def to_s; "hello from refinement"; end + end + } end result = "1".to_s end |
