summaryrefslogtreecommitdiff
path: root/test/ruby/test_defined.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/ruby/test_defined.rb')
-rw-r--r--test/ruby/test_defined.rb147
1 files changed, 147 insertions, 0 deletions
diff --git a/test/ruby/test_defined.rb b/test/ruby/test_defined.rb
index b22db700da..db1fdc8e25 100644
--- a/test/ruby/test_defined.rb
+++ b/test/ruby/test_defined.rb
@@ -127,6 +127,53 @@ class TestDefined < Test::Unit::TestCase
assert_equal nil, defined?($2)
end
+ def test_defined_assignment
+ assert_equal("assignment", defined?(a = 1))
+ assert_equal("assignment", defined?(a += 1))
+ assert_equal("assignment", defined?(a &&= 1))
+ assert_equal("assignment", eval('defined?(A = 1)'))
+ assert_equal("assignment", eval('defined?(A += 1)'))
+ assert_equal("assignment", eval('defined?(A &&= 1)'))
+ assert_equal("assignment", eval('defined?(A::B = 1)'))
+ assert_equal("assignment", eval('defined?(A::B += 1)'))
+ assert_equal("assignment", eval('defined?(A::B &&= 1)'))
+ end
+
+ def test_defined_splat
+ assert_nil(defined?([*a]))
+ assert_nil(defined?(itself(*a)))
+ assert_equal("expression", defined?([*itself]))
+ assert_equal("method", defined?(itself(*itself)))
+ end
+
+ def test_defined_hash
+ assert_nil(defined?({a: a}))
+ assert_nil(defined?({a => 1}))
+ assert_nil(defined?({a => a}))
+ assert_nil(defined?({**a}))
+ assert_nil(defined?(itself(a: a)))
+ assert_nil(defined?(itself(a => 1)))
+ assert_nil(defined?(itself(a => a)))
+ assert_nil(defined?(itself(**a)))
+ assert_nil(defined?(itself({a: a})))
+ assert_nil(defined?(itself({a => 1})))
+ assert_nil(defined?(itself({a => a})))
+ assert_nil(defined?(itself({**a})))
+
+ assert_equal("expression", defined?({a: itself}))
+ assert_equal("expression", defined?({itself => 1}))
+ assert_equal("expression", defined?({itself => itself}))
+ assert_equal("expression", defined?({**itself}))
+ assert_equal("method", defined?(itself(a: itself)))
+ assert_equal("method", defined?(itself(itself => 1)))
+ assert_equal("method", defined?(itself(itself => itself)))
+ assert_equal("method", defined?(itself(**itself)))
+ assert_equal("method", defined?(itself({a: itself})))
+ assert_equal("method", defined?(itself({itself => 1})))
+ assert_equal("method", defined?(itself({itself => itself})))
+ assert_equal("method", defined?(itself({**itself})))
+ end
+
def test_defined_literal
assert_equal("nil", defined?(nil))
assert_equal("true", defined?(true))
@@ -134,6 +181,55 @@ class TestDefined < Test::Unit::TestCase
assert_equal("expression", defined?(1))
end
+ def test_defined_method
+ self_ = self
+ assert_equal("method", defined?(test_defined_method))
+ assert_equal("method", defined?(self.test_defined_method))
+ assert_equal("method", defined?(self_.test_defined_method))
+
+ assert_equal(nil, defined?(1.test_defined_method))
+ assert_equal("method", defined?(1.to_i))
+ assert_equal(nil, defined?(1.to_i.test_defined_method))
+ assert_equal(nil, defined?(1.test_defined_method.to_i))
+
+ assert_equal("method", defined?("x".reverse))
+ assert_equal("method", defined?("x".reverse(1)))
+ assert_equal("method", defined?("x".reverse.reverse))
+ assert_equal(nil, defined?("x".reverse(1).reverse))
+
+ assert_equal("method", defined?(1.to_i(10)))
+ assert_equal("method", defined?(1.to_i("x")))
+ assert_equal(nil, defined?(1.to_i("x").undefined))
+ assert_equal(nil, defined?(1.to_i(undefined).to_i))
+ assert_equal(nil, defined?(1.to_i("x").undefined.to_i))
+ assert_equal(nil, defined?(1.to_i(undefined).to_i.to_i))
+ end
+
+ def test_defined_method_single_call
+ times_called = 0
+ define_singleton_method(:t) do
+ times_called += 1
+ self
+ end
+ assert_equal("method", defined?(t))
+ assert_equal(0, times_called)
+
+ assert_equal("method", defined?(t.t))
+ assert_equal(1, times_called)
+
+ times_called = 0
+ assert_equal("method", defined?(t.t.t))
+ assert_equal(2, times_called)
+
+ times_called = 0
+ assert_equal("method", defined?(t.t.t.t))
+ assert_equal(3, times_called)
+
+ times_called = 0
+ assert_equal("method", defined?(t.t.t.t.t))
+ assert_equal(4, times_called)
+ end
+
def test_defined_empty_paren_expr
bug8224 = '[ruby-core:54024] [Bug #8224]'
(1..3).each do |level|
@@ -147,6 +243,26 @@ class TestDefined < Test::Unit::TestCase
assert_nil(defined?(p () + 1))
end
+ def test_defined_paren_void_stmts
+ assert_equal("expression", defined? (;x))
+ assert_equal("expression", defined? (x;))
+ assert_nil(defined? (
+
+ x
+
+ ))
+
+ x = 1
+
+ assert_equal("expression", defined? (;x))
+ assert_equal("expression", defined? (x;))
+ assert_equal("local-variable", defined? (
+
+ x
+
+ ))
+ end
+
def test_defined_impl_specific
feature7035 = '[ruby-core:47558]' # not spec
assert_predicate(defined?(Foo), :frozen?, feature7035)
@@ -254,10 +370,41 @@ class TestDefined < Test::Unit::TestCase
assert_equal("super", o.x, bug8367)
end
+ def test_super_in_basic_object
+ BasicObject.class_eval do
+ def a
+ defined?(super)
+ end
+ end
+
+ assert_nil(a)
+ ensure
+ BasicObject.class_eval do
+ undef_method :a if defined?(a)
+ end
+ end
+
def test_super_toplevel
assert_separately([], "assert_nil(defined?(super))")
end
+ def test_respond_to
+ obj = "#{self.class.name}##{__method__}"
+ class << obj
+ def respond_to?(mid)
+ true
+ end
+ end
+ assert_warn(/deprecated method signature.*\n.*respond_to\? is defined here/) do
+ Warning[:deprecated] = true
+ defined?(obj.foo)
+ end
+ assert_warn('') do
+ Warning[:deprecated] = false
+ defined?(obj.foo)
+ end
+ end
+
class ExampleRespondToMissing
attr_reader :called