summaryrefslogtreecommitdiff
path: root/spec/ruby/core/module/private_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/ruby/core/module/private_spec.rb')
-rw-r--r--spec/ruby/core/module/private_spec.rb95
1 files changed, 95 insertions, 0 deletions
diff --git a/spec/ruby/core/module/private_spec.rb b/spec/ruby/core/module/private_spec.rb
new file mode 100644
index 0000000000..e60fdb24cc
--- /dev/null
+++ b/spec/ruby/core/module/private_spec.rb
@@ -0,0 +1,95 @@
+require_relative '../../spec_helper'
+require_relative 'fixtures/classes'
+require_relative 'shared/set_visibility'
+
+describe "Module#private" do
+ it_behaves_like :set_visibility, :private
+
+ it "makes the target method uncallable from other types" do
+ obj = Object.new
+ class << obj
+ def foo; true; end
+ end
+
+ obj.foo.should == true
+
+ class << obj
+ private :foo
+ end
+
+ -> { obj.foo }.should.raise(NoMethodError)
+ end
+
+ it "makes a public Object instance method private in a new module" do
+ m = Module.new do
+ private :module_specs_public_method_on_object
+ end
+
+ m.private_instance_methods(false).should.include?(:module_specs_public_method_on_object)
+
+ # Ensure we did not change Object's method
+ Object.private_instance_methods(true).should_not.include?(:module_specs_public_method_on_object)
+ end
+
+ it "makes a public Object instance method private in Kernel" do
+ Kernel.private_instance_methods(false).should.include?(
+ :module_specs_public_method_on_object_for_kernel_private)
+ Object.private_instance_methods(true).should_not.include?(
+ :module_specs_public_method_on_object_for_kernel_private)
+ end
+
+ it "returns argument or arguments if given" do
+ (class << Object.new; self; end).class_eval do
+ def foo; end
+ private(:foo).should.equal?(:foo)
+ private([:foo, :foo]).should == [:foo, :foo]
+ private(:foo, :foo).should == [:foo, :foo]
+ private.should.equal?(nil)
+ end
+ end
+
+ it "raises a NameError when given an undefined name" do
+ -> do
+ Module.new.send(:private, :undefined)
+ end.should.raise(NameError)
+ end
+
+ it "only makes the method private in the class it is called on" do
+ base = Class.new do
+ def wrapped
+ 1
+ end
+ end
+
+ klass = Class.new(base) do
+ def wrapped
+ super + 1
+ end
+ private :wrapped
+ end
+
+ base.new.wrapped.should == 1
+ -> do
+ klass.new.wrapped
+ end.should.raise(NameError)
+ end
+
+ it "continues to allow a prepended module method to call super" do
+ wrapper = Module.new do
+ def wrapped
+ super + 1
+ end
+ end
+
+ klass = Class.new do
+ prepend wrapper
+
+ def wrapped
+ 1
+ end
+ private :wrapped
+ end
+
+ klass.new.wrapped.should == 2
+ end
+end