1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/spec/ruby/language/defined_spec.rb
Jeremy Evans 900e83b501 Turn class variable warnings into exceptions
This changes the following warnings:

* warning: class variable access from toplevel
* warning: class variable @foo of D is overtaken by C

into RuntimeErrors.  Handle defined?(@@foo) at toplevel
by returning nil instead of raising an exception (the previous
behavior warned before returning nil when defined? was used).

Refactor the specs to avoid the warnings even in older versions.
The specs were checking for the warnings, but the purpose of
the related specs as evidenced from their description is to
test for behavior, not for warnings.

Fixes [Bug #14541]
2020-04-10 00:29:05 -07:00

1122 lines
37 KiB
Ruby

require_relative '../spec_helper'
require_relative 'fixtures/defined'
describe "The defined? keyword for literals" do
it "returns 'self' for self" do
ret = defined?(self)
ret.should == "self"
end
it "returns 'nil' for nil" do
ret = defined?(nil)
ret.should == "nil"
end
it "returns 'true' for true" do
ret = defined?(true)
ret.should == "true"
end
it "returns 'false' for false" do
ret = defined?(false)
ret.should == "false"
end
describe "for a literal Array" do
it "returns 'expression' if each element is defined" do
ret = defined?([Object, Array])
ret.should == "expression"
end
it "returns nil if one element is not defined" do
ret = defined?([NonExistentConstant, Array])
ret.should == nil
end
it "returns nil if all elements are not defined" do
ret = defined?([NonExistentConstant, AnotherNonExistentConstant])
ret.should == nil
end
end
end
describe "The defined? keyword when called with a method name" do
describe "without a receiver" do
it "returns 'method' if the method is defined" do
defined?(puts).should == "method"
end
it "returns nil if the method is not defined" do
defined?(defined_specs_undefined_method).should be_nil
end
it "returns 'method' if the method is defined and private" do
obj = DefinedSpecs::Basic.new
obj.private_method_defined.should == "method"
end
it "returns 'method' if the predicate method is defined and private" do
obj = DefinedSpecs::Basic.new
obj.private_predicate_defined.should == "method"
end
end
describe "having a module as receiver" do
it "returns 'method' if the method is defined" do
defined?(Kernel.puts).should == "method"
end
it "returns nil if the method is private" do
defined?(Object.print).should be_nil
end
it "returns nil if the method is protected" do
defined?(DefinedSpecs::Basic.new.protected_method).should be_nil
end
it "returns nil if the method is not defined" do
defined?(Kernel.defined_specs_undefined_method).should be_nil
end
it "returns nil if the class is not defined" do
defined?(DefinedSpecsUndefined.puts).should be_nil
end
it "returns nil if the subclass is not defined" do
defined?(DefinedSpecs::Undefined.puts).should be_nil
end
end
describe "having a local variable as receiver" do
it "returns 'method' if the method is defined" do
obj = DefinedSpecs::Basic.new
defined?(obj.a_defined_method).should == "method"
end
it "returns nil if the method is not defined" do
obj = DefinedSpecs::Basic.new
defined?(obj.an_undefined_method).should be_nil
end
it "returns nil if the variable does not exist" do
defined?(nonexistent_local_variable.some_method).should be_nil
end
it "calls #respond_to_missing?" do
obj = mock("respond_to_missing object")
obj.should_receive(:respond_to_missing?).and_return(true)
defined?(obj.something_undefined).should == "method"
end
end
describe "having an instance variable as receiver" do
it "returns 'method' if the method is defined" do
@defined_specs_obj = DefinedSpecs::Basic.new
defined?(@defined_specs_obj.a_defined_method).should == "method"
end
it "returns nil if the method is not defined" do
@defined_specs_obj = DefinedSpecs::Basic.new
defined?(@defined_specs_obj.an_undefined_method).should be_nil
end
it "returns nil if the variable does not exist" do
defined?(@nonexistent_instance_variable.some_method).should be_nil
end
end
describe "having a global variable as receiver" do
it "returns 'method' if the method is defined" do
$defined_specs_obj = DefinedSpecs::Basic.new
defined?($defined_specs_obj.a_defined_method).should == "method"
end
it "returns nil if the method is not defined" do
$defined_specs_obj = DefinedSpecs::Basic.new
defined?($defined_specs_obj.an_undefined_method).should be_nil
end
it "returns nil if the variable does not exist" do
defined?($nonexistent_global_variable.some_method).should be_nil
end
end
describe "having a method call as a receiver" do
it "returns nil if evaluating the receiver raises an exception" do
defined?(DefinedSpecs.exception_method / 2).should be_nil
ScratchPad.recorded.should == :defined_specs_exception
end
it "returns nil if the method is not defined on the object the receiver returns" do
defined?(DefinedSpecs.side_effects / 2).should be_nil
ScratchPad.recorded.should == :defined_specs_side_effects
end
it "returns 'method' if the method is defined on the object the receiver returns" do
defined?(DefinedSpecs.fixnum_method / 2).should == "method"
ScratchPad.recorded.should == :defined_specs_fixnum_method
end
end
end
describe "The defined? keyword for an expression" do
before :each do
ScratchPad.clear
end
it "returns 'assignment' for assigning a local variable" do
defined?(x = 2).should == "assignment"
end
it "returns 'assignment' for assigning an instance variable" do
defined?(@defined_specs_x = 2).should == "assignment"
end
it "returns 'assignment' for assigning a global variable" do
defined?($defined_specs_x = 2).should == "assignment"
end
it "returns 'assignment' for assigning a class variable" do
defined?(@@defined_specs_x = 2).should == "assignment"
end
it "returns 'assignment' for assigning multiple variables" do
defined?((a, b = 1, 2)).should == "assignment"
end
it "returns 'assignment' for an expression with '%='" do
defined?(x %= 2).should == "assignment"
end
it "returns 'assignment' for an expression with '/='" do
defined?(x /= 2).should == "assignment"
end
it "returns 'assignment' for an expression with '-='" do
defined?(x -= 2).should == "assignment"
end
it "returns 'assignment' for an expression with '+='" do
defined?(x += 2).should == "assignment"
end
it "returns 'assignment' for an expression with '*='" do
defined?(x *= 2).should == "assignment"
end
it "returns 'assignment' for an expression with '|='" do
defined?(x |= 2).should == "assignment"
end
it "returns 'assignment' for an expression with '&='" do
defined?(x &= 2).should == "assignment"
end
it "returns 'assignment' for an expression with '^='" do
defined?(x ^= 2).should == "assignment"
end
it "returns 'assignment' for an expression with '~='" do
defined?(x = 2).should == "assignment"
end
it "returns 'assignment' for an expression with '<<='" do
defined?(x <<= 2).should == "assignment"
end
it "returns 'assignment' for an expression with '>>='" do
defined?(x >>= 2).should == "assignment"
end
it "returns 'assignment' for an expression with '||='" do
defined?(x ||= 2).should == "assignment"
end
it "returns 'assignment' for an expression with '&&='" do
defined?(x &&= 2).should == "assignment"
end
it "returns 'assignment' for an expression with '**='" do
defined?(x **= 2).should == "assignment"
end
it "returns nil for an expression with == and an undefined method" do
defined?(defined_specs_undefined_method == 2).should be_nil
end
it "returns nil for an expression with != and an undefined method" do
defined?(defined_specs_undefined_method != 2).should be_nil
end
it "returns nil for an expression with !~ and an undefined method" do
defined?(defined_specs_undefined_method !~ 2).should be_nil
end
it "returns 'method' for an expression with '=='" do
x = 42
defined?(x == 2).should == "method"
end
it "returns 'method' for an expression with '!='" do
x = 42
defined?(x != 2).should == "method"
end
it "returns 'method' for an expression with '!~'" do
x = 42
defined?(x !~ 2).should == "method"
end
describe "with logical connectives" do
it "returns nil for an expression with '!' and an undefined method" do
defined?(!defined_specs_undefined_method).should be_nil
end
it "returns nil for an expression with '!' and an unset class variable" do
@result = eval("class singleton_class::A; defined?(!@@doesnt_exist) end", binding, __FILE__, __LINE__)
@result.should be_nil
end
it "returns nil for an expression with 'not' and an undefined method" do
defined?(not defined_specs_undefined_method).should be_nil
end
it "returns nil for an expression with 'not' and an unset class variable" do
@result = eval("class singleton_class::A; defined?(not @@doesnt_exist) end", binding, __FILE__, __LINE__)
@result.should be_nil
end
it "does not propagate an exception raised by a method in a 'not' expression" do
defined?(not DefinedSpecs.exception_method).should be_nil
ScratchPad.recorded.should == :defined_specs_exception
end
it "returns 'expression' for an expression with '&&/and' and an unset global variable" do
defined?($defined_specs_undefined_global_variable && true).should == "expression"
defined?(true && $defined_specs_undefined_global_variable).should == "expression"
defined?($defined_specs_undefined_global_variable and true).should == "expression"
end
it "returns 'expression' for an expression with '&&/and' and an unset instance variable" do
defined?(@defined_specs_undefined_instance_variable && true).should == "expression"
defined?(true && @defined_specs_undefined_instance_variable).should == "expression"
defined?(@defined_specs_undefined_instance_variable and true).should == "expression"
end
it "returns 'expression' for an expression '&&/and' regardless of its truth value" do
defined?(true && false).should == "expression"
defined?(true and false).should == "expression"
end
it "returns 'expression' for an expression with '||/or' and an unset global variable" do
defined?($defined_specs_undefined_global_variable || true).should == "expression"
defined?(true || $defined_specs_undefined_global_variable).should == "expression"
defined?($defined_specs_undefined_global_variable or true).should == "expression"
end
it "returns 'expression' for an expression with '||/or' and an unset instance variable" do
defined?(@defined_specs_undefined_instance_variable || true).should == "expression"
defined?(true || @defined_specs_undefined_instance_variable).should == "expression"
defined?(@defined_specs_undefined_instance_variable or true).should == "expression"
end
it "returns 'expression' for an expression '||/or' regardless of its truth value" do
defined?(true || false).should == "expression"
defined?(true or false).should == "expression"
end
it "returns nil for an expression with '!' and an unset global variable" do
defined?(!$defined_specs_undefined_global_variable).should be_nil
end
it "returns nil for an expression with '!' and an unset instance variable" do
defined?(!@defined_specs_undefined_instance_variable).should be_nil
end
it "returns 'method' for a 'not' expression with a method" do
defined?(not DefinedSpecs.side_effects).should == "method"
end
it "calls a method in a 'not' expression and returns 'method'" do
defined?(not DefinedSpecs.side_effects).should == "method"
ScratchPad.recorded.should == :defined_specs_side_effects
end
it "returns nil for an expression with 'not' and an unset global variable" do
defined?(not $defined_specs_undefined_global_variable).should be_nil
end
it "returns nil for an expression with 'not' and an unset instance variable" do
defined?(not @defined_specs_undefined_instance_variable).should be_nil
end
it "returns 'expression' for an expression with '&&/and' and an undefined method" do
defined?(defined_specs_undefined_method && true).should == "expression"
defined?(defined_specs_undefined_method and true).should == "expression"
end
it "returns 'expression' for an expression with '&&/and' and an unset class variable" do
defined?(@@defined_specs_undefined_class_variable && true).should == "expression"
defined?(@@defined_specs_undefined_class_variable and true).should == "expression"
end
it "does not call a method in an '&&' expression and returns 'expression'" do
defined?(DefinedSpecs.side_effects && true).should == "expression"
ScratchPad.recorded.should be_nil
end
it "does not call a method in an 'and' expression and returns 'expression'" do
defined?(DefinedSpecs.side_effects and true).should == "expression"
ScratchPad.recorded.should be_nil
end
it "returns 'expression' for an expression with '||/or' and an undefined method" do
defined?(defined_specs_undefined_method || true).should == "expression"
defined?(defined_specs_undefined_method or true).should == "expression"
end
it "returns 'expression' for an expression with '||/or' and an unset class variable" do
defined?(@@defined_specs_undefined_class_variable || true).should == "expression"
defined?(@@defined_specs_undefined_class_variable or true).should == "expression"
end
it "does not call a method in an '||' expression and returns 'expression'" do
defined?(DefinedSpecs.side_effects || true).should == "expression"
ScratchPad.recorded.should be_nil
end
it "does not call a method in an 'or' expression and returns 'expression'" do
defined?(DefinedSpecs.side_effects or true).should == "expression"
ScratchPad.recorded.should be_nil
end
end
it "returns 'expression' when passed a String" do
defined?("garble gooble gable").should == "expression"
end
describe "with a dynamic String" do
it "returns 'expression' when the String contains a literal" do
defined?("garble #{42}").should == "expression"
end
it "returns 'expression' when the String contains a call to a defined method" do
defined?("garble #{DefinedSpecs.side_effects}").should == "expression"
end
it "returns 'expression' when the String contains a call to an undefined method" do
defined?("garble #{DefinedSpecs.undefined_method}").should == "expression"
end
it "does not call the method in the String" do
defined?("garble #{DefinedSpecs.dynamic_string}").should == "expression"
ScratchPad.recorded.should be_nil
end
end
describe "with a dynamic Regexp" do
it "returns 'expression' when the Regexp contains a literal" do
defined?(/garble #{42}/).should == "expression"
end
it "returns 'expression' when the Regexp contains a call to a defined method" do
defined?(/garble #{DefinedSpecs.side_effects}/).should == "expression"
end
it "returns 'expression' when the Regexp contains a call to an undefined method" do
defined?(/garble #{DefinedSpecs.undefined_method}/).should == "expression"
end
it "does not call the method in the Regexp" do
defined?(/garble #{DefinedSpecs.dynamic_string}/).should == "expression"
ScratchPad.recorded.should be_nil
end
end
it "returns 'expression' when passed a Fixnum literal" do
defined?(42).should == "expression"
end
it "returns 'expression' when passed a Bignum literal" do
defined?(0xdead_beef_deed_feed).should == "expression"
end
it "returns 'expression' when passed a Float literal" do
defined?(1.5).should == "expression"
end
it "returns 'expression' when passed a Range literal" do
defined?(0..2).should == "expression"
end
it "returns 'expression' when passed a Regexp literal" do
defined?(/undefined/).should == "expression"
end
it "returns 'expression' when passed an Array literal" do
defined?([1, 2]).should == "expression"
end
it "returns 'expression' when passed a Hash literal" do
defined?({a: :b}).should == "expression"
end
it "returns 'expression' when passed a Symbol literal" do
defined?(:defined_specs).should == "expression"
end
end
describe "The defined? keyword for variables" do
it "returns 'local-variable' when called with the name of a local variable" do
DefinedSpecs::Basic.new.local_variable_defined.should == "local-variable"
end
it "returns 'local-variable' when called with the name of a local variable assigned to nil" do
DefinedSpecs::Basic.new.local_variable_defined_nil.should == "local-variable"
end
it "returns nil for an instance variable that has not been read" do
DefinedSpecs::Basic.new.instance_variable_undefined.should be_nil
end
it "returns nil for an instance variable that has been read but not assigned to" do
DefinedSpecs::Basic.new.instance_variable_read.should be_nil
end
it "returns 'instance-variable' for an instance variable that has been assigned" do
DefinedSpecs::Basic.new.instance_variable_defined.should == "instance-variable"
end
it "returns 'instance-variable' for an instance variable that has been assigned to nil" do
DefinedSpecs::Basic.new.instance_variable_defined_nil.should == "instance-variable"
end
it "returns nil for a global variable that has not been read" do
DefinedSpecs::Basic.new.global_variable_undefined.should be_nil
end
it "returns nil for a global variable that has been read but not assigned to" do
DefinedSpecs::Basic.new.global_variable_read.should be_nil
end
it "returns 'global-variable' for a global variable that has been assigned nil" do
DefinedSpecs::Basic.new.global_variable_defined_as_nil.should == "global-variable"
end
# MRI appears to special case defined? for $! and $~ in that it returns
# 'global-variable' even when they are not set (or they are always "set"
# but the value may be nil). In other words, 'defined?($~)' will return
# 'global-variable' even if no match has been done.
it "returns 'global-variable' for $!" do
defined?($!).should == "global-variable"
end
it "returns 'global-variable for $~" do
defined?($~).should == "global-variable"
end
describe "when a String does not match a Regexp" do
before :each do
"mis-matched" =~ /z(z)z/
end
it "returns 'global-variable' for $~" do
defined?($~).should == "global-variable"
end
it "returns nil for $&" do
defined?($&).should be_nil
end
it "returns nil for $`" do
defined?($`).should be_nil
end
it "returns nil for $'" do
defined?($').should be_nil
end
it "returns nil for $+" do
defined?($+).should be_nil
end
it "returns nil for any last match global" do
defined?($1).should be_nil
defined?($4).should be_nil
defined?($7).should be_nil
defined?($10).should be_nil
defined?($200).should be_nil
end
end
describe "when a String matches a Regexp" do
before :each do
"mis-matched" =~ /s(-)m(.)/
end
it "returns 'global-variable' for $~" do
defined?($~).should == "global-variable"
end
it "returns 'global-variable' for $&" do
defined?($&).should == "global-variable"
end
it "returns 'global-variable' for $`" do
defined?($`).should == "global-variable"
end
it "returns 'global-variable' for $'" do
defined?($').should == "global-variable"
end
it "returns 'global-variable' for $+" do
defined?($+).should == "global-variable"
end
it "returns 'global-variable' for the capture references" do
defined?($1).should == "global-variable"
defined?($2).should == "global-variable"
end
it "returns nil for non-captures" do
defined?($4).should be_nil
defined?($7).should be_nil
defined?($10).should be_nil
defined?($200).should be_nil
end
end
describe "when a Regexp does not match a String" do
before :each do
/z(z)z/ =~ "mis-matched"
end
it "returns 'global-variable' for $~" do
defined?($~).should == "global-variable"
end
it "returns nil for $&" do
defined?($&).should be_nil
end
it "returns nil for $`" do
defined?($`).should be_nil
end
it "returns nil for $'" do
defined?($').should be_nil
end
it "returns nil for $+" do
defined?($+).should be_nil
end
it "returns nil for any last match global" do
defined?($1).should be_nil
defined?($4).should be_nil
defined?($7).should be_nil
defined?($10).should be_nil
defined?($200).should be_nil
end
end
describe "when a Regexp matches a String" do
before :each do
/s(-)m(.)/ =~ "mis-matched"
end
it "returns 'global-variable' for $~" do
defined?($~).should == "global-variable"
end
it "returns 'global-variable' for $&" do
defined?($&).should == "global-variable"
end
it "returns 'global-variable' for $`" do
defined?($`).should == "global-variable"
end
it "returns 'global-variable' for $'" do
defined?($').should == "global-variable"
end
it "returns 'global-variable' for $+" do
defined?($+).should == "global-variable"
end
it "returns 'global-variable' for the capture references" do
defined?($1).should == "global-variable"
defined?($2).should == "global-variable"
end
it "returns nil for non-captures" do
defined?($4).should be_nil
defined?($7).should be_nil
defined?($10).should be_nil
defined?($200).should be_nil
end
end
it "returns 'global-variable' for a global variable that has been assigned" do
DefinedSpecs::Basic.new.global_variable_defined.should == "global-variable"
end
it "returns nil for a class variable that has not been read" do
DefinedSpecs::Basic.new.class_variable_undefined.should be_nil
end
# There is no spec for a class variable that is read before being assigned
# to because setting up the code for this raises a NameError before you
# get to the defined? call so it really has nothing to do with 'defined?'.
it "returns 'class variable' when called with the name of a class variable" do
DefinedSpecs::Basic.new.class_variable_defined.should == "class variable"
end
it "returns 'local-variable' when called with the name of a block local" do
block = Proc.new { |xxx| defined?(xxx) }
block.call(1).should == "local-variable"
end
end
describe "The defined? keyword for a simple constant" do
it "returns 'constant' when the constant is defined" do
defined?(DefinedSpecs).should == "constant"
end
it "returns nil when the constant is not defined" do
defined?(DefinedSpecsUndefined).should be_nil
end
it "does not call Object.const_missing if the constant is not defined" do
Object.should_not_receive(:const_missing)
defined?(DefinedSpecsUndefined).should be_nil
end
it "returns 'constant' for an included module" do
DefinedSpecs::Child.module_defined.should == "constant"
end
it "returns 'constant' for a constant defined in an included module" do
DefinedSpecs::Child.module_constant_defined.should == "constant"
end
end
describe "The defined? keyword for a top-level constant" do
it "returns 'constant' when passed the name of a top-level constant" do
defined?(::DefinedSpecs).should == "constant"
end
it "returns nil if the constant is not defined" do
defined?(::DefinedSpecsUndefined).should be_nil
end
it "does not call Object.const_missing if the constant is not defined" do
Object.should_not_receive(:const_missing)
defined?(::DefinedSpecsUndefined).should be_nil
end
end
describe "The defined? keyword for a scoped constant" do
it "returns 'constant' when the scoped constant is defined" do
defined?(DefinedSpecs::Basic).should == "constant"
end
it "returns nil when the scoped constant is not defined" do
defined?(DefinedSpecs::Undefined).should be_nil
end
it "does not call .const_missing if the constant is not defined" do
DefinedSpecs.should_not_receive(:const_missing)
defined?(DefinedSpecs::UnknownChild).should be_nil
end
it "returns nil when an undefined constant is scoped to a defined constant" do
defined?(DefinedSpecs::Child::Undefined).should be_nil
end
it "returns nil when a constant is scoped to an undefined constant" do
Object.should_not_receive(:const_missing)
defined?(Undefined::Object).should be_nil
end
it "returns nil when the undefined constant is scoped to an undefined constant" do
defined?(DefinedSpecs::Undefined::Undefined).should be_nil
end
it "returns nil when a constant is defined on top-level but not on the module" do
defined?(DefinedSpecs::String).should be_nil
end
it "returns nil when a constant is defined on top-level but not on the class" do
defined?(DefinedSpecs::Basic::String).should be_nil
end
it "returns 'constant' if the scoped-scoped constant is defined" do
defined?(DefinedSpecs::Child::A).should == "constant"
end
end
describe "The defined? keyword for a top-level scoped constant" do
it "returns 'constant' when the scoped constant is defined" do
defined?(::DefinedSpecs::Basic).should == "constant"
end
it "returns nil when the scoped constant is not defined" do
defined?(::DefinedSpecs::Undefined).should be_nil
end
it "returns nil when an undefined constant is scoped to a defined constant" do
defined?(::DefinedSpecs::Child::Undefined).should be_nil
end
it "returns nil when the undefined constant is scoped to an undefined constant" do
defined?(::DefinedSpecs::Undefined::Undefined).should be_nil
end
it "returns 'constant' if the scoped-scoped constant is defined" do
defined?(::DefinedSpecs::Child::A).should == "constant"
end
end
describe "The defined? keyword for a self-send method call scoped constant" do
it "returns nil if the constant is not defined in the scope of the method's value" do
defined?(defined_specs_method::Undefined).should be_nil
end
it "returns 'constant' if the constant is defined in the scope of the method's value" do
defined?(defined_specs_method::Basic).should == "constant"
end
it "returns nil if the last constant is not defined in the scope chain" do
defined?(defined_specs_method::Basic::Undefined).should be_nil
end
it "returns nil if the middle constant is not defined in the scope chain" do
defined?(defined_specs_method::Undefined::Undefined).should be_nil
end
it "returns 'constant' if all the constants in the scope chain are defined" do
defined?(defined_specs_method::Basic::A).should == "constant"
end
end
describe "The defined? keyword for a receiver method call scoped constant" do
it "returns nil if the constant is not defined in the scope of the method's value" do
defined?(defined_specs_receiver.defined_method::Undefined).should be_nil
end
it "returns 'constant' if the constant is defined in the scope of the method's value" do
defined?(defined_specs_receiver.defined_method::Basic).should == "constant"
end
it "returns nil if the last constant is not defined in the scope chain" do
defined?(defined_specs_receiver.defined_method::Basic::Undefined).should be_nil
end
it "returns nil if the middle constant is not defined in the scope chain" do
defined?(defined_specs_receiver.defined_method::Undefined::Undefined).should be_nil
end
it "returns 'constant' if all the constants in the scope chain are defined" do
defined?(defined_specs_receiver.defined_method::Basic::A).should == "constant"
end
end
describe "The defined? keyword for a module method call scoped constant" do
it "returns nil if the constant is not defined in the scope of the method's value" do
defined?(DefinedSpecs.defined_method::Undefined).should be_nil
end
it "returns 'constant' if the constant scoped by the method's value is defined" do
defined?(DefinedSpecs.defined_method::Basic).should == "constant"
end
it "returns nil if the last constant in the scope chain is not defined" do
defined?(DefinedSpecs.defined_method::Basic::Undefined).should be_nil
end
it "returns nil if the middle constant in the scope chain is not defined" do
defined?(DefinedSpecs.defined_method::Undefined::Undefined).should be_nil
end
it "returns 'constant' if all the constants in the scope chain are defined" do
defined?(DefinedSpecs.defined_method::Basic::A).should == "constant"
end
it "returns nil if the outer scope constant in the receiver is not defined" do
defined?(Undefined::DefinedSpecs.defined_method::Basic).should be_nil
end
it "returns nil if the scoped constant in the receiver is not defined" do
defined?(DefinedSpecs::Undefined.defined_method::Basic).should be_nil
end
it "returns 'constant' if all the constants in the receiver are defined" do
defined?(Object::DefinedSpecs.defined_method::Basic).should == "constant"
end
it "returns 'constant' if all the constants in the receiver and scope chain are defined" do
defined?(Object::DefinedSpecs.defined_method::Basic::A).should == "constant"
end
end
describe "The defined? keyword for a variable scoped constant" do
after :all do
if Object.class_variable_defined? :@@defined_specs_obj
Object.__send__(:remove_class_variable, :@@defined_specs_obj)
end
end
it "returns nil if the instance scoped constant is not defined" do
@defined_specs_obj = DefinedSpecs::Basic
defined?(@defined_specs_obj::Undefined).should be_nil
end
it "returns 'constant' if the constant is defined in the scope of the instance variable" do
@defined_specs_obj = DefinedSpecs::Basic
defined?(@defined_specs_obj::A).should == "constant"
end
it "returns nil if the global scoped constant is not defined" do
$defined_specs_obj = DefinedSpecs::Basic
defined?($defined_specs_obj::Undefined).should be_nil
end
it "returns 'constant' if the constant is defined in the scope of the global variable" do
$defined_specs_obj = DefinedSpecs::Basic
defined?($defined_specs_obj::A).should == "constant"
end
it "returns nil if the class scoped constant is not defined" do
eval(<<-END, binding, __FILE__, __LINE__)
class singleton_class::A
@@defined_specs_obj = DefinedSpecs::Basic
defined?(@@defined_specs_obj::Undefined).should be_nil
end
END
end
it "returns 'constant' if the constant is defined in the scope of the class variable" do
eval(<<-END, binding, __FILE__, __LINE__)
class singleton_class::A
@@defined_specs_obj = DefinedSpecs::Basic
defined?(@@defined_specs_obj::A).should == "constant"
end
END
end
it "returns nil if the local scoped constant is not defined" do
defined_specs_obj = DefinedSpecs::Basic
defined?(defined_specs_obj::Undefined).should be_nil
end
it "returns 'constant' if the constant is defined in the scope of the local variable" do
defined_specs_obj = DefinedSpecs::Basic
defined?(defined_specs_obj::A).should == "constant"
end
end
describe "The defined? keyword for a self:: scoped constant" do
it "returns 'constant' for a constant explicitly scoped to self:: when set" do
defined?(DefinedSpecs::SelfScoped).should == "constant"
end
it "returns 'constant' for a constant explicitly scoped to self:: in subclass's metaclass" do
DefinedSpecs::Child.parent_constant_defined.should == "constant"
end
end
describe "The defined? keyword for yield" do
it "returns nil if no block is passed to a method not taking a block parameter" do
DefinedSpecs::Basic.new.no_yield_block.should be_nil
end
it "returns nil if no block is passed to a method taking a block parameter" do
DefinedSpecs::Basic.new.no_yield_block_parameter.should be_nil
end
it "returns 'yield' if a block is passed to a method not taking a block parameter" do
DefinedSpecs::Basic.new.yield_block.should == "yield"
end
it "returns 'yield' if a block is passed to a method taking a block parameter" do
DefinedSpecs::Basic.new.yield_block_parameter.should == "yield"
end
end
describe "The defined? keyword for super" do
it "returns nil when a superclass undef's the method" do
DefinedSpecs::ClassWithoutMethod.new.test.should be_nil
end
describe "for a method taking no arguments" do
it "returns nil when no superclass method exists" do
DefinedSpecs::Super.new.no_super_method_no_args.should be_nil
end
it "returns nil from a block when no superclass method exists" do
DefinedSpecs::Super.new.no_super_method_block_no_args.should be_nil
end
it "returns nil from a #define_method when no superclass method exists" do
DefinedSpecs::Super.new.no_super_define_method_no_args.should be_nil
end
it "returns nil from a block in a #define_method when no superclass method exists" do
DefinedSpecs::Super.new.no_super_define_method_block_no_args.should be_nil
end
it "returns 'super' when a superclass method exists" do
DefinedSpecs::Super.new.method_no_args.should == "super"
end
it "returns 'super' from a block when a superclass method exists" do
DefinedSpecs::Super.new.method_block_no_args.should == "super"
end
it "returns 'super' from a #define_method when a superclass method exists" do
DefinedSpecs::Super.new.define_method_no_args.should == "super"
end
it "returns 'super' from a block in a #define_method when a superclass method exists" do
DefinedSpecs::Super.new.define_method_block_no_args.should == "super"
end
it "returns 'super' when the method exists in a supermodule" do
DefinedSpecs::SuperWithIntermediateModules.new.method_no_args.should == "super"
end
end
describe "for a method taking arguments" do
it "returns nil when no superclass method exists" do
DefinedSpecs::Super.new.no_super_method_args.should be_nil
end
it "returns nil from a block when no superclass method exists" do
DefinedSpecs::Super.new.no_super_method_block_args.should be_nil
end
it "returns nil from a #define_method when no superclass method exists" do
DefinedSpecs::Super.new.no_super_define_method_args.should be_nil
end
it "returns nil from a block in a #define_method when no superclass method exists" do
DefinedSpecs::Super.new.no_super_define_method_block_args.should be_nil
end
it "returns 'super' when a superclass method exists" do
DefinedSpecs::Super.new.method_args.should == "super"
end
it "returns 'super' from a block when a superclass method exists" do
DefinedSpecs::Super.new.method_block_args.should == "super"
end
it "returns 'super' from a #define_method when a superclass method exists" do
DefinedSpecs::Super.new.define_method_args.should == "super"
end
it "returns 'super' from a block in a #define_method when a superclass method exists" do
DefinedSpecs::Super.new.define_method_block_args.should == "super"
end
end
describe "within an included module's method" do
it "returns 'super' when a superclass method exists in the including hierarchy" do
DefinedSpecs::Child.new.defined_super.should == "super"
end
end
end
describe "The defined? keyword for instance variables" do
it "returns 'instance-variable' if assigned" do
@assigned_ivar = "some value"
defined?(@assigned_ivar).should == "instance-variable"
end
it "returns nil if not assigned" do
defined?(@unassigned_ivar).should be_nil
end
end
describe "The defined? keyword for pseudo-variables" do
it "returns 'expression' for __FILE__" do
defined?(__FILE__).should == "expression"
end
it "returns 'expression' for __LINE__" do
defined?(__LINE__).should == "expression"
end
it "returns 'expression' for __ENCODING__" do
defined?(__ENCODING__).should == "expression"
end
end
describe "The defined? keyword for conditional expressions" do
it "returns 'expression' for an 'if' conditional" do
defined?(if x then 'x' else '' end).should == "expression"
end
it "returns 'expression' for an 'unless' conditional" do
defined?(unless x then '' else 'x' end).should == "expression"
end
it "returns 'expression' for ternary expressions" do
defined?(x ? 'x' : '').should == "expression"
end
end
describe "The defined? keyword for case expressions" do
it "returns 'expression'" do
defined?(case x; when 'x'; 'y' end).should == "expression"
end
end
describe "The defined? keyword for loop expressions" do
it "returns 'expression' for a 'for' expression" do
defined?(for n in 1..3 do true end).should == "expression"
end
it "returns 'expression' for a 'while' expression" do
defined?(while x do y end).should == "expression"
end
it "returns 'expression' for an 'until' expression" do
defined?(until x do y end).should == "expression"
end
it "returns 'expression' for a 'break' expression" do
defined?(break).should == "expression"
end
it "returns 'expression' for a 'next' expression" do
defined?(next).should == "expression"
end
it "returns 'expression' for a 'redo' expression" do
defined?(redo).should == "expression"
end
it "returns 'expression' for a 'retry' expression" do
defined?(retry).should == "expression"
end
end
describe "The defined? keyword for return expressions" do
it "returns 'expression'" do
defined?(return).should == "expression"
end
end
describe "The defined? keyword for exception expressions" do
it "returns 'expression'" do
defined?(begin 1 end).should == "expression"
end
end