summaryrefslogtreecommitdiff
path: root/spec/ruby/core/module/prepend_features_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/ruby/core/module/prepend_features_spec.rb')
-rw-r--r--spec/ruby/core/module/prepend_features_spec.rb64
1 files changed, 64 insertions, 0 deletions
diff --git a/spec/ruby/core/module/prepend_features_spec.rb b/spec/ruby/core/module/prepend_features_spec.rb
new file mode 100644
index 0000000000..3a50f2c2a4
--- /dev/null
+++ b/spec/ruby/core/module/prepend_features_spec.rb
@@ -0,0 +1,64 @@
+require_relative '../../spec_helper'
+require_relative 'fixtures/classes'
+
+describe "Module#prepend_features" do
+ it "is a private method" do
+ Module.private_instance_methods(false).should.include?(:prepend_features)
+ end
+
+ it "gets called when self is included in another module/class" do
+ ScratchPad.record []
+
+ m = Module.new do
+ def self.prepend_features(mod)
+ ScratchPad << mod
+ end
+ end
+
+ c = Class.new do
+ prepend m
+ end
+
+ ScratchPad.recorded.should == [c]
+ end
+
+ it "raises an ArgumentError on a cyclic prepend" do
+ -> {
+ ModuleSpecs::CyclicPrepend.send(:prepend_features, ModuleSpecs::CyclicPrepend)
+ }.should.raise(ArgumentError)
+ end
+
+ it "clears caches of the given module" do
+ parent = Class.new do
+ def bar; :bar; end
+ end
+
+ child = Class.new(parent) do
+ def foo; :foo; end
+ def bar; super; end
+ end
+
+ mod = Module.new do
+ def foo; :fooo; end
+ end
+
+ child.new.foo
+ child.new.bar
+
+ child.prepend(mod)
+
+ child.new.bar.should == :bar
+ end
+
+ describe "on Class" do
+ it "is undefined" do
+ Class.private_instance_methods(true).should_not.include?(:prepend_features)
+ end
+
+ it "raises a TypeError if calling after rebinded to Class" do
+ -> {
+ Module.instance_method(:prepend_features).bind(Class.new).call Module.new
+ }.should.raise(TypeError)
+ end
+ end
+end