File: //usr/local/rvm/src/ruby-2.5.9/spec/ruby/core/module/shared/set_visibility.rb
# -*- encoding: us-ascii -*-
describe :set_visibility, shared: true do
it "is a private method" do
Module.should have_private_instance_method(@method, false)
end
describe "without arguments" do
it "sets visibility to following method definitions" do
visibility = @method
mod = Module.new {
send visibility
def test1() end
def test2() end
}
mod.should send(:"have_#{@method}_instance_method", :test1, false)
mod.should send(:"have_#{@method}_instance_method", :test2, false)
end
it "stops setting visibility if the body encounters other visibility setters without arguments" do
visibility = @method
new_visibility = nil
mod = Module.new {
send visibility
new_visibility = [:protected, :private].find {|vis| vis != visibility }
send new_visibility
def test1() end
}
mod.should send(:"have_#{new_visibility}_instance_method", :test1, false)
end
it "continues setting visibility if the body encounters other visibility setters with arguments" do
visibility = @method
mod = Module.new {
send visibility
def test1() end
send([:protected, :private].find {|vis| vis != visibility }, :test1)
def test2() end
}
mod.should send(:"have_#{@method}_instance_method", :test2, false)
end
it "does not affect module_evaled method definitions when itself is outside the eval" do
visibility = @method
mod = Module.new {
send visibility
module_eval { def test1() end }
module_eval " def test2() end "
}
mod.should have_public_instance_method(:test1, false)
mod.should have_public_instance_method(:test2, false)
end
it "does not affect outside method definitions when itself is inside a module_eval" do
visibility = @method
mod = Module.new {
module_eval { send visibility }
def test1() end
}
mod.should have_public_instance_method(:test1, false)
end
it "affects normally if itself and method definitions are inside a module_eval" do
visibility = @method
mod = Module.new {
module_eval {
send visibility
def test1() end
}
}
mod.should send(:"have_#{@method}_instance_method", :test1, false)
end
it "does not affect method definitions when itself is inside an eval and method definitions are outside" do
visibility = @method
initialized_visibility = [:public, :protected, :private].find {|sym| sym != visibility }
mod = Module.new {
send initialized_visibility
eval visibility.to_s
def test1() end
}
mod.should send(:"have_#{initialized_visibility}_instance_method", :test1, false)
end
it "affects evaled method definitions when itself is outside the eval" do
visibility = @method
mod = Module.new {
send visibility
eval "def test1() end"
}
mod.should send(:"have_#{@method}_instance_method", :test1, false)
end
it "affects normally if itself and following method definitions are inside a eval" do
visibility = @method
mod = Module.new {
eval <<-CODE
#{visibility}
def test1() end
CODE
}
mod.should send(:"have_#{@method}_instance_method", :test1, false)
end
describe "within a closure" do
it "sets the visibility outside the closure" do
visibility = @method
mod = Module.new {
1.times {
send visibility
}
def test1() end
}
mod.should send(:"have_#{@method}_instance_method", :test1, false)
end
end
end
end