summaryrefslogtreecommitdiff
path: root/spec/ruby/core/module/append_features_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/ruby/core/module/append_features_spec.rb')
-rw-r--r--spec/ruby/core/module/append_features_spec.rb61
1 files changed, 61 insertions, 0 deletions
diff --git a/spec/ruby/core/module/append_features_spec.rb b/spec/ruby/core/module/append_features_spec.rb
new file mode 100644
index 0000000000..1724cde5d6
--- /dev/null
+++ b/spec/ruby/core/module/append_features_spec.rb
@@ -0,0 +1,61 @@
+require_relative '../../spec_helper'
+require_relative 'fixtures/classes'
+
+describe "Module#append_features" do
+ it "is a private method" do
+ Module.should have_private_instance_method(:append_features)
+ end
+
+ describe "on Class" do
+ it "is undefined" do
+ Class.should_not have_private_instance_method(:append_features, true)
+ end
+
+ it "raises a TypeError if calling after rebinded to Class" do
+ -> {
+ Module.instance_method(:append_features).bind(Class.new).call Module.new
+ }.should raise_error(TypeError)
+ end
+ end
+
+ it "gets called when self is included in another module/class" do
+ begin
+ m = Module.new do
+ def self.append_features(mod)
+ $appended_to = mod
+ end
+ end
+
+ c = Class.new do
+ include m
+ end
+
+ $appended_to.should == c
+ ensure
+ $appended_to = nil
+ end
+ end
+
+ it "raises an ArgumentError on a cyclic include" do
+ -> {
+ ModuleSpecs::CyclicAppendA.send(:append_features, ModuleSpecs::CyclicAppendA)
+ }.should raise_error(ArgumentError)
+
+ -> {
+ ModuleSpecs::CyclicAppendB.send(:append_features, ModuleSpecs::CyclicAppendA)
+ }.should raise_error(ArgumentError)
+
+ end
+
+ describe "when other is frozen" do
+ before :each do
+ @receiver = Module.new
+ @other = Module.new.freeze
+ end
+
+ it "raises a FrozenError before appending self" do
+ -> { @receiver.send(:append_features, @other) }.should raise_error(FrozenError)
+ @other.ancestors.should_not include(@receiver)
+ end
+ end
+end