PageRenderTime 49ms CodeModel.GetById 10ms RepoModel.GetById 0ms app.codeStats 0ms

/test/ruby/test_module.rb

http://github.com/ruby/ruby
Ruby | 2622 lines | 2264 code | 346 blank | 12 comment | 10 complexity | 3869d58833ed1449ebfb9a9f408e42e7 MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause, AGPL-3.0

Large files files are truncated, but you can click here to view the full file

  1. # frozen_string_literal: false
  2. require 'test/unit'
  3. require 'pp'
  4. $m0 = Module.nesting
  5. class TestModule < Test::Unit::TestCase
  6. def _wrap_assertion
  7. yield
  8. end
  9. def assert_method_defined?(klass, mid, message="")
  10. message = build_message(message, "#{klass}\##{mid} expected to be defined.")
  11. _wrap_assertion do
  12. klass.method_defined?(mid) or
  13. raise Test::Unit::AssertionFailedError, message, caller(3)
  14. end
  15. end
  16. def assert_method_not_defined?(klass, mid, message="")
  17. message = build_message(message, "#{klass}\##{mid} expected to not be defined.")
  18. _wrap_assertion do
  19. klass.method_defined?(mid) and
  20. raise Test::Unit::AssertionFailedError, message, caller(3)
  21. end
  22. end
  23. def setup
  24. @verbose = $VERBOSE
  25. $VERBOSE = nil
  26. @deprecated = Warning[:deprecated]
  27. Warning[:deprecated] = true
  28. end
  29. def teardown
  30. $VERBOSE = @verbose
  31. Warning[:deprecated] = @deprecated
  32. end
  33. def test_LT_0
  34. assert_equal true, String < Object
  35. assert_equal false, Object < String
  36. assert_nil String < Array
  37. assert_equal true, Array < Enumerable
  38. assert_equal false, Enumerable < Array
  39. assert_nil Proc < Comparable
  40. assert_nil Comparable < Proc
  41. end
  42. def test_GT_0
  43. assert_equal false, String > Object
  44. assert_equal true, Object > String
  45. assert_nil String > Array
  46. assert_equal false, Array > Enumerable
  47. assert_equal true, Enumerable > Array
  48. assert_nil Comparable > Proc
  49. assert_nil Proc > Comparable
  50. end
  51. def test_CMP_0
  52. assert_equal(-1, (String <=> Object))
  53. assert_equal 1, (Object <=> String)
  54. assert_nil(Array <=> String)
  55. end
  56. ExpectedException = NoMethodError
  57. # Support stuff
  58. module Mixin
  59. MIXIN = 1
  60. def mixin
  61. end
  62. end
  63. module User
  64. USER = 2
  65. include Mixin
  66. def user
  67. end
  68. def user2
  69. end
  70. protected :user2
  71. def user3
  72. end
  73. private :user3
  74. end
  75. OtherSetup = -> do
  76. remove_const :Other if defined? ::TestModule::Other
  77. module Other
  78. def other
  79. end
  80. end
  81. end
  82. class AClass
  83. def AClass.cm1
  84. "cm1"
  85. end
  86. def AClass.cm2
  87. cm1 + "cm2" + cm3
  88. end
  89. def AClass.cm3
  90. "cm3"
  91. end
  92. private_class_method :cm1, "cm3"
  93. def aClass
  94. :aClass
  95. end
  96. def aClass1
  97. :aClass1
  98. end
  99. def aClass2
  100. :aClass2
  101. end
  102. private :aClass1
  103. protected :aClass2
  104. end
  105. class BClass < AClass
  106. def bClass1
  107. :bClass1
  108. end
  109. private
  110. def bClass2
  111. :bClass2
  112. end
  113. protected
  114. def bClass3
  115. :bClass3
  116. end
  117. end
  118. class CClass < BClass
  119. def self.cClass
  120. end
  121. end
  122. MyClass = AClass.clone
  123. class MyClass
  124. public_class_method :cm1
  125. end
  126. # -----------------------------------------------------------
  127. def test_CMP # '<=>'
  128. assert_equal( 0, Mixin <=> Mixin)
  129. assert_equal(-1, User <=> Mixin)
  130. assert_equal( 1, Mixin <=> User)
  131. assert_equal( 0, Object <=> Object)
  132. assert_equal(-1, String <=> Object)
  133. assert_equal( 1, Object <=> String)
  134. end
  135. def test_GE # '>='
  136. assert_operator(Mixin, :>=, User)
  137. assert_operator(Mixin, :>=, Mixin)
  138. assert_not_operator(User, :>=, Mixin)
  139. assert_operator(Object, :>=, String)
  140. assert_operator(String, :>=, String)
  141. assert_not_operator(String, :>=, Object)
  142. end
  143. def test_GT # '>'
  144. assert_operator(Mixin, :>, User)
  145. assert_not_operator(Mixin, :>, Mixin)
  146. assert_not_operator(User, :>, Mixin)
  147. assert_operator(Object, :>, String)
  148. assert_not_operator(String, :>, String)
  149. assert_not_operator(String, :>, Object)
  150. end
  151. def test_LE # '<='
  152. assert_operator(User, :<=, Mixin)
  153. assert_operator(Mixin, :<=, Mixin)
  154. assert_not_operator(Mixin, :<=, User)
  155. assert_operator(String, :<=, Object)
  156. assert_operator(String, :<=, String)
  157. assert_not_operator(Object, :<=, String)
  158. end
  159. def test_LT # '<'
  160. assert_operator(User, :<, Mixin)
  161. assert_not_operator(Mixin, :<, Mixin)
  162. assert_not_operator(Mixin, :<, User)
  163. assert_operator(String, :<, Object)
  164. assert_not_operator(String, :<, String)
  165. assert_not_operator(Object, :<, String)
  166. end
  167. def test_VERY_EQUAL # '==='
  168. assert_operator(Object, :===, self)
  169. assert_operator(Test::Unit::TestCase, :===, self)
  170. assert_operator(TestModule, :===, self)
  171. assert_not_operator(String, :===, self)
  172. end
  173. def test_ancestors
  174. assert_equal([User, Mixin], User.ancestors)
  175. assert_equal([Mixin], Mixin.ancestors)
  176. ancestors = Object.ancestors
  177. mixins = ancestors - [Object, Kernel, BasicObject]
  178. mixins << JSON::Ext::Generator::GeneratorMethods::String if defined?(JSON::Ext::Generator::GeneratorMethods::String)
  179. assert_equal([Object, Kernel, BasicObject], ancestors - mixins)
  180. assert_equal([String, Comparable, Object, Kernel, BasicObject], String.ancestors - mixins)
  181. end
  182. CLASS_EVAL = 2
  183. @@class_eval = 'b'
  184. def test_class_eval
  185. OtherSetup.call
  186. Other.class_eval("CLASS_EVAL = 1")
  187. assert_equal(1, Other::CLASS_EVAL)
  188. assert_include(Other.constants, :CLASS_EVAL)
  189. assert_equal(2, Other.class_eval { CLASS_EVAL })
  190. Other.class_eval("@@class_eval = 'a'")
  191. assert_equal('a', Other.class_variable_get(:@@class_eval))
  192. assert_equal('b', Other.class_eval { @@class_eval })
  193. Other.class_eval do
  194. module_function
  195. def class_eval_test
  196. "foo"
  197. end
  198. end
  199. assert_equal("foo", Other.class_eval_test)
  200. assert_equal([Other], Other.class_eval { |*args| args })
  201. end
  202. def test_const_defined?
  203. assert_operator(Math, :const_defined?, :PI)
  204. assert_operator(Math, :const_defined?, "PI")
  205. assert_not_operator(Math, :const_defined?, :IP)
  206. assert_not_operator(Math, :const_defined?, "IP")
  207. end
  208. def each_bad_constants(m, &b)
  209. [
  210. "#<Class:0x7b8b718b>",
  211. ":Object",
  212. "",
  213. ":",
  214. ["String::", "[Bug #7573]"],
  215. "\u3042",
  216. "Name?",
  217. ].each do |name, msg|
  218. expected = "wrong constant name %s" % name
  219. msg = "#{msg}#{': ' if msg}wrong constant name #{name.dump}"
  220. assert_raise_with_message(NameError, expected, "#{msg} to #{m}") do
  221. yield name
  222. end
  223. end
  224. end
  225. def test_bad_constants_get
  226. each_bad_constants("get") {|name|
  227. Object.const_get name
  228. }
  229. end
  230. def test_bad_constants_defined
  231. each_bad_constants("defined?") {|name|
  232. Object.const_defined? name
  233. }
  234. end
  235. def test_leading_colons
  236. assert_equal Object, AClass.const_get('::Object')
  237. end
  238. def test_const_get
  239. assert_equal(Math::PI, Math.const_get("PI"))
  240. assert_equal(Math::PI, Math.const_get(:PI))
  241. n = Object.new
  242. def n.to_str; @count = defined?(@count) ? @count + 1 : 1; "PI"; end
  243. def n.count; @count; end
  244. assert_equal(Math::PI, Math.const_get(n))
  245. assert_equal(1, n.count)
  246. end
  247. def test_nested_get
  248. OtherSetup.call
  249. assert_equal Other, Object.const_get([self.class, 'Other'].join('::'))
  250. assert_equal User::USER, self.class.const_get([User, 'USER'].join('::'))
  251. assert_raise(NameError) {
  252. Object.const_get([self.class.name, 'String'].join('::'))
  253. }
  254. end
  255. def test_nested_get_symbol
  256. OtherSetup.call
  257. const = [self.class, Other].join('::').to_sym
  258. assert_raise(NameError) {Object.const_get(const)}
  259. const = [User, 'USER'].join('::').to_sym
  260. assert_raise(NameError) {self.class.const_get(const)}
  261. end
  262. def test_nested_get_const_missing
  263. classes = []
  264. klass = Class.new {
  265. define_singleton_method(:const_missing) { |name|
  266. classes << name
  267. klass
  268. }
  269. }
  270. klass.const_get("Foo::Bar::Baz")
  271. assert_equal [:Foo, :Bar, :Baz], classes
  272. end
  273. def test_nested_get_bad_class
  274. assert_raise(TypeError) do
  275. self.class.const_get([User, 'USER', 'Foo'].join('::'))
  276. end
  277. end
  278. def test_nested_defined
  279. OtherSetup.call
  280. assert_send([Object, :const_defined?, [self.class.name, 'Other'].join('::')])
  281. assert_send([self.class, :const_defined?, 'User::USER'])
  282. assert_not_send([self.class, :const_defined?, 'User::Foo'])
  283. assert_not_send([Object, :const_defined?, [self.class.name, 'String'].join('::')])
  284. end
  285. def test_nested_defined_symbol
  286. OtherSetup.call
  287. const = [self.class, Other].join('::').to_sym
  288. assert_raise(NameError) {Object.const_defined?(const)}
  289. const = [User, 'USER'].join('::').to_sym
  290. assert_raise(NameError) {self.class.const_defined?(const)}
  291. end
  292. def test_nested_defined_inheritance
  293. assert_send([Object, :const_defined?, [self.class.name, 'User', 'MIXIN'].join('::')])
  294. assert_send([self.class, :const_defined?, 'User::MIXIN'])
  295. assert_send([Object, :const_defined?, 'File::SEEK_SET'])
  296. # const_defined? with `false`
  297. assert_not_send([Object, :const_defined?, [self.class.name, 'User', 'MIXIN'].join('::'), false])
  298. assert_not_send([self.class, :const_defined?, 'User::MIXIN', false])
  299. assert_not_send([Object, :const_defined?, 'File::SEEK_SET', false])
  300. end
  301. def test_nested_defined_bad_class
  302. assert_raise(TypeError) do
  303. self.class.const_defined?('User::USER::Foo')
  304. end
  305. end
  306. def test_const_set
  307. OtherSetup.call
  308. assert_not_operator(Other, :const_defined?, :KOALA)
  309. Other.const_set(:KOALA, 99)
  310. assert_operator(Other, :const_defined?, :KOALA)
  311. assert_equal(99, Other::KOALA)
  312. Other.const_set("WOMBAT", "Hi")
  313. assert_equal("Hi", Other::WOMBAT)
  314. n = Object.new
  315. def n.to_str; @count = defined?(@count) ? @count + 1 : 1; "HOGE"; end
  316. def n.count; @count; end
  317. def n.count=(v); @count=v; end
  318. assert_not_operator(Other, :const_defined?, :HOGE)
  319. Other.const_set(n, 999)
  320. assert_equal(1, n.count)
  321. n.count = 0
  322. assert_equal(999, Other.const_get(n))
  323. assert_equal(1, n.count)
  324. n.count = 0
  325. assert_equal(true, Other.const_defined?(n))
  326. assert_equal(1, n.count)
  327. end
  328. def test_constants
  329. assert_equal([:MIXIN], Mixin.constants)
  330. assert_equal([:MIXIN, :USER], User.constants.sort)
  331. end
  332. def test_self_initialize_copy
  333. bug9535 = '[ruby-dev:47989] [Bug #9535]'
  334. m = Module.new do
  335. def foo
  336. :ok
  337. end
  338. initialize_copy(self)
  339. end
  340. assert_equal(:ok, Object.new.extend(m).foo, bug9535)
  341. end
  342. def test_initialize_copy_empty
  343. bug9813 = '[ruby-dev:48182] [Bug #9813]'
  344. m = Module.new do
  345. def x
  346. end
  347. const_set(:X, 1)
  348. @x = 2
  349. end
  350. assert_equal([:x], m.instance_methods)
  351. assert_equal([:@x], m.instance_variables)
  352. assert_equal([:X], m.constants)
  353. m.module_eval do
  354. initialize_copy(Module.new)
  355. end
  356. assert_empty(m.instance_methods, bug9813)
  357. assert_empty(m.instance_variables, bug9813)
  358. assert_empty(m.constants, bug9813)
  359. end
  360. def test_dup
  361. OtherSetup.call
  362. bug6454 = '[ruby-core:45132]'
  363. a = Module.new
  364. Other.const_set :BUG6454, a
  365. b = a.dup
  366. Other.const_set :BUG6454_dup, b
  367. assert_equal "TestModule::Other::BUG6454_dup", b.inspect, bug6454
  368. end
  369. def test_dup_anonymous
  370. bug6454 = '[ruby-core:45132]'
  371. a = Module.new
  372. original = a.inspect
  373. b = a.dup
  374. assert_not_equal original, b.inspect, bug6454
  375. end
  376. def test_public_include
  377. assert_nothing_raised('#8846') do
  378. Module.new.include(Module.new { def foo; end }).instance_methods == [:foo]
  379. end
  380. end
  381. def test_include_toplevel
  382. assert_separately([], <<-EOS)
  383. Mod = Module.new {def foo; :include_foo end}
  384. TOPLEVEL_BINDING.eval('include Mod')
  385. assert_equal(:include_foo, TOPLEVEL_BINDING.eval('foo'))
  386. assert_equal([Object, Mod], Object.ancestors.slice(0, 2))
  387. EOS
  388. end
  389. def test_include_with_no_args
  390. assert_raise(ArgumentError) { Module.new { include } }
  391. end
  392. def test_include_into_module_already_included
  393. c = Class.new{def foo; [:c] end}
  394. modules = lambda do ||
  395. sub = Class.new(c){def foo; [:sc] + super end}
  396. [
  397. Module.new{def foo; [:m1] + super end},
  398. Module.new{def foo; [:m2] + super end},
  399. Module.new{def foo; [:m3] + super end},
  400. sub,
  401. sub.new
  402. ]
  403. end
  404. m1, m2, m3, sc, o = modules.call
  405. assert_equal([:sc, :c], o.foo)
  406. sc.include m1
  407. assert_equal([:sc, :m1, :c], o.foo)
  408. m1.include m2
  409. assert_equal([:sc, :m1, :m2, :c], o.foo)
  410. m2.include m3
  411. assert_equal([:sc, :m1, :m2, :m3, :c], o.foo)
  412. m1, m2, m3, sc, o = modules.call
  413. sc.prepend m1
  414. assert_equal([:m1, :sc, :c], o.foo)
  415. m1.include m2
  416. assert_equal([:m1, :m2, :sc, :c], o.foo)
  417. m2.include m3
  418. assert_equal([:m1, :m2, :m3, :sc, :c], o.foo)
  419. m1, m2, m3, sc, o = modules.call
  420. sc.include m2
  421. assert_equal([:sc, :m2, :c], o.foo)
  422. sc.prepend m1
  423. assert_equal([:m1, :sc, :m2, :c], o.foo)
  424. m1.include m2
  425. assert_equal([:m1, :sc, :m2, :c], o.foo)
  426. m1.include m3
  427. assert_equal([:m1, :m3, :sc, :m2, :c], o.foo)
  428. m1, m2, m3, sc, o = modules.call
  429. sc.include m3
  430. sc.include m2
  431. assert_equal([:sc, :m2, :m3, :c], o.foo)
  432. sc.prepend m1
  433. assert_equal([:m1, :sc, :m2, :m3, :c], o.foo)
  434. m1.include m2
  435. m1.include m3
  436. assert_equal([:m1, :sc, :m2, :m3, :c], o.foo)
  437. end
  438. def test_included_modules
  439. assert_equal([], Mixin.included_modules)
  440. assert_equal([Mixin], User.included_modules)
  441. mixins = Object.included_modules - [Kernel]
  442. mixins << JSON::Ext::Generator::GeneratorMethods::String if defined?(JSON::Ext::Generator::GeneratorMethods::String)
  443. assert_equal([Kernel], Object.included_modules - mixins)
  444. assert_equal([Comparable, Kernel], String.included_modules - mixins)
  445. end
  446. def test_instance_methods
  447. assert_equal([:user, :user2], User.instance_methods(false).sort)
  448. assert_equal([:user, :user2, :mixin].sort, User.instance_methods(true).sort)
  449. assert_equal([:mixin], Mixin.instance_methods)
  450. assert_equal([:mixin], Mixin.instance_methods(true))
  451. assert_equal([:cClass], (class << CClass; self; end).instance_methods(false))
  452. assert_equal([], (class << BClass; self; end).instance_methods(false))
  453. assert_equal([:cm2], (class << AClass; self; end).instance_methods(false))
  454. assert_equal([:aClass, :aClass2], AClass.instance_methods(false).sort)
  455. assert_equal([:aClass, :aClass2],
  456. (AClass.instance_methods(true) - Object.instance_methods(true)).sort)
  457. end
  458. def test_method_defined?
  459. [User, Class.new{include User}, Class.new{prepend User}].each do |klass|
  460. [[], [true]].each do |args|
  461. assert !klass.method_defined?(:wombat, *args)
  462. assert klass.method_defined?(:mixin, *args)
  463. assert klass.method_defined?(:user, *args)
  464. assert klass.method_defined?(:user2, *args)
  465. assert !klass.method_defined?(:user3, *args)
  466. assert !klass.method_defined?("wombat", *args)
  467. assert klass.method_defined?("mixin", *args)
  468. assert klass.method_defined?("user", *args)
  469. assert klass.method_defined?("user2", *args)
  470. assert !klass.method_defined?("user3", *args)
  471. end
  472. end
  473. end
  474. def test_method_defined_without_include_super
  475. assert User.method_defined?(:user, false)
  476. assert !User.method_defined?(:mixin, false)
  477. assert Mixin.method_defined?(:mixin, false)
  478. User.const_set(:FOO, c = Class.new)
  479. c.prepend(User)
  480. assert !c.method_defined?(:user, false)
  481. c.define_method(:user){}
  482. assert c.method_defined?(:user, false)
  483. assert !c.method_defined?(:mixin, false)
  484. c.define_method(:mixin){}
  485. assert c.method_defined?(:mixin, false)
  486. assert !c.method_defined?(:userx, false)
  487. c.define_method(:userx){}
  488. assert c.method_defined?(:userx, false)
  489. # cleanup
  490. User.class_eval do
  491. remove_const :FOO
  492. end
  493. end
  494. def module_exec_aux
  495. Proc.new do
  496. def dynamically_added_method_3; end
  497. end
  498. end
  499. def module_exec_aux_2(&block)
  500. User.module_exec(&block)
  501. end
  502. def test_module_exec
  503. User.module_exec do
  504. def dynamically_added_method_1; end
  505. end
  506. assert_method_defined?(User, :dynamically_added_method_1)
  507. block = Proc.new do
  508. def dynamically_added_method_2; end
  509. end
  510. User.module_exec(&block)
  511. assert_method_defined?(User, :dynamically_added_method_2)
  512. User.module_exec(&module_exec_aux)
  513. assert_method_defined?(User, :dynamically_added_method_3)
  514. module_exec_aux_2 do
  515. def dynamically_added_method_4; end
  516. end
  517. assert_method_defined?(User, :dynamically_added_method_4)
  518. # cleanup
  519. User.class_eval do
  520. remove_method :dynamically_added_method_1
  521. remove_method :dynamically_added_method_2
  522. remove_method :dynamically_added_method_3
  523. remove_method :dynamically_added_method_4
  524. end
  525. end
  526. def test_module_eval
  527. User.module_eval("MODULE_EVAL = 1")
  528. assert_equal(1, User::MODULE_EVAL)
  529. assert_include(User.constants, :MODULE_EVAL)
  530. User.instance_eval("remove_const(:MODULE_EVAL)")
  531. assert_not_include(User.constants, :MODULE_EVAL)
  532. end
  533. def test_name
  534. assert_equal("Integer", Integer.name)
  535. assert_equal("TestModule::Mixin", Mixin.name)
  536. assert_equal("TestModule::User", User.name)
  537. assert_predicate Integer.name, :frozen?
  538. assert_predicate Mixin.name, :frozen?
  539. assert_predicate User.name, :frozen?
  540. end
  541. def test_accidental_singleton_naming_with_module
  542. o = Object.new
  543. assert_nil(o.singleton_class.name)
  544. class << o
  545. module Hi; end
  546. end
  547. assert_nil(o.singleton_class.name)
  548. end
  549. def test_accidental_singleton_naming_with_class
  550. o = Object.new
  551. assert_nil(o.singleton_class.name)
  552. class << o
  553. class Hi; end
  554. end
  555. assert_nil(o.singleton_class.name)
  556. end
  557. def test_classpath
  558. m = Module.new
  559. n = Module.new
  560. m.const_set(:N, n)
  561. assert_nil(m.name)
  562. assert_nil(n.name)
  563. assert_equal([:N], m.constants)
  564. m.module_eval("module O end")
  565. assert_equal([:N, :O], m.constants.sort)
  566. m.module_eval("class C; end")
  567. assert_equal([:C, :N, :O], m.constants.sort)
  568. assert_nil(m::N.name)
  569. assert_match(/\A#<Module:.*>::O\z/, m::O.name)
  570. assert_match(/\A#<Module:.*>::C\z/, m::C.name)
  571. self.class.const_set(:M, m)
  572. prefix = self.class.name + "::M::"
  573. assert_equal(prefix+"N", m.const_get(:N).name)
  574. assert_equal(prefix+"O", m.const_get(:O).name)
  575. assert_equal(prefix+"C", m.const_get(:C).name)
  576. c = m.class_eval("Bug15891 = Class.new.freeze")
  577. assert_equal(prefix+"Bug15891", c.name)
  578. end
  579. def test_private_class_method
  580. assert_raise(ExpectedException) { AClass.cm1 }
  581. assert_raise(ExpectedException) { AClass.cm3 }
  582. assert_equal("cm1cm2cm3", AClass.cm2)
  583. end
  584. def test_private_instance_methods
  585. assert_equal([:aClass1], AClass.private_instance_methods(false))
  586. assert_equal([:bClass2], BClass.private_instance_methods(false))
  587. assert_equal([:aClass1, :bClass2],
  588. (BClass.private_instance_methods(true) -
  589. Object.private_instance_methods(true)).sort)
  590. end
  591. def test_protected_instance_methods
  592. assert_equal([:aClass2], AClass.protected_instance_methods)
  593. assert_equal([:bClass3], BClass.protected_instance_methods(false))
  594. assert_equal([:bClass3, :aClass2].sort,
  595. (BClass.protected_instance_methods(true) -
  596. Object.protected_instance_methods(true)).sort)
  597. end
  598. def test_public_class_method
  599. assert_equal("cm1", MyClass.cm1)
  600. assert_equal("cm1cm2cm3", MyClass.cm2)
  601. assert_raise(ExpectedException) { eval "MyClass.cm3" }
  602. end
  603. def test_public_instance_methods
  604. assert_equal([:aClass], AClass.public_instance_methods(false))
  605. assert_equal([:bClass1], BClass.public_instance_methods(false))
  606. end
  607. def test_s_constants
  608. c1 = Module.constants
  609. Object.module_eval "WALTER = 99"
  610. c2 = Module.constants
  611. assert_equal([:WALTER], c2 - c1)
  612. Object.class_eval do
  613. remove_const :WALTER
  614. end
  615. assert_equal([], Module.constants(true))
  616. assert_equal([], Module.constants(false))
  617. src = <<-INPUT
  618. ary = Module.constants
  619. module M
  620. WALTER = 99
  621. end
  622. class Module
  623. include M
  624. end
  625. p Module.constants - ary, Module.constants(true), Module.constants(false)
  626. INPUT
  627. assert_in_out_err([], src, %w([:M] [:WALTER] []), [])
  628. klass = Class.new do
  629. const_set(:X, 123)
  630. end
  631. assert_equal(false, klass.class_eval { Module.constants }.include?(:X))
  632. assert_equal(false, Complex.constants(false).include?(:compatible))
  633. end
  634. module M1
  635. $m1 = Module.nesting
  636. module M2
  637. $m2 = Module.nesting
  638. end
  639. end
  640. def test_s_nesting
  641. assert_equal([], $m0)
  642. assert_equal([TestModule::M1, TestModule], $m1)
  643. assert_equal([TestModule::M1::M2,
  644. TestModule::M1, TestModule], $m2)
  645. end
  646. def test_s_new
  647. m = Module.new
  648. assert_instance_of(Module, m)
  649. end
  650. def test_freeze
  651. m = Module.new do
  652. def self.baz; end
  653. def bar; end
  654. end
  655. m.freeze
  656. assert_raise(FrozenError) do
  657. m.module_eval do
  658. def foo; end
  659. end
  660. end
  661. assert_raise(FrozenError) do
  662. m.__send__ :private, :bar
  663. end
  664. assert_raise(FrozenError) do
  665. m.private_class_method :baz
  666. end
  667. end
  668. def test_attr_obsoleted_flag
  669. c = Class.new
  670. c.class_eval do
  671. def initialize
  672. @foo = :foo
  673. @bar = :bar
  674. end
  675. attr :foo, true
  676. attr :bar, false
  677. end
  678. o = c.new
  679. assert_equal(true, o.respond_to?(:foo))
  680. assert_equal(true, o.respond_to?(:foo=))
  681. assert_equal(true, o.respond_to?(:bar))
  682. assert_equal(false, o.respond_to?(:bar=))
  683. end
  684. def test_attr_public_at_toplevel
  685. s = Object.new
  686. TOPLEVEL_BINDING.eval(<<-END).call(s.singleton_class)
  687. proc do |c|
  688. c.send(:attr_accessor, :x)
  689. c.send(:attr, :y)
  690. c.send(:attr_reader, :z)
  691. c.send(:attr_writer, :w)
  692. end
  693. END
  694. assert_nil s.x
  695. s.x = 1
  696. assert_equal 1, s.x
  697. assert_nil s.y
  698. s.instance_variable_set(:@y, 2)
  699. assert_equal 2, s.y
  700. assert_nil s.z
  701. s.instance_variable_set(:@z, 3)
  702. assert_equal 3, s.z
  703. s.w = 4
  704. assert_equal 4, s.instance_variable_get(:@w)
  705. end
  706. def test_const_get_evaled
  707. c1 = Class.new
  708. c2 = Class.new(c1)
  709. eval("c1::Foo = :foo")
  710. assert_equal(:foo, c1::Foo)
  711. assert_equal(:foo, c2::Foo)
  712. assert_equal(:foo, c2.const_get(:Foo))
  713. assert_raise(NameError) { c2.const_get(:Foo, false) }
  714. eval("c1::Foo = :foo")
  715. assert_raise(NameError) { c1::Bar }
  716. assert_raise(NameError) { c2::Bar }
  717. assert_raise(NameError) { c2.const_get(:Bar) }
  718. assert_raise(NameError) { c2.const_get(:Bar, false) }
  719. assert_raise(NameError) { c2.const_get("Bar", false) }
  720. assert_raise(NameError) { c2.const_get("BaR11", false) }
  721. assert_raise(NameError) { Object.const_get("BaR11", false) }
  722. c1.instance_eval do
  723. def const_missing(x)
  724. x
  725. end
  726. end
  727. assert_equal(:Bar, c1::Bar)
  728. assert_equal(:Bar, c2::Bar)
  729. assert_equal(:Bar, c2.const_get(:Bar))
  730. assert_equal(:Bar, c2.const_get(:Bar, false))
  731. assert_equal(:Bar, c2.const_get("Bar"))
  732. assert_equal(:Bar, c2.const_get("Bar", false))
  733. v = c2.const_get("Bar11", false)
  734. assert_equal("Bar11".to_sym, v)
  735. assert_raise(NameError) { c1.const_get(:foo) }
  736. end
  737. def test_const_set_invalid_name
  738. c1 = Class.new
  739. assert_raise_with_message(NameError, /foo/) { c1.const_set(:foo, :foo) }
  740. assert_raise_with_message(NameError, /bar/) { c1.const_set("bar", :foo) }
  741. assert_raise_with_message(TypeError, /1/) { c1.const_set(1, :foo) }
  742. assert_nothing_raised(NameError) { c1.const_set("X\u{3042}", :foo) }
  743. assert_raise(NameError) { c1.const_set("X\u{3042}".encode("utf-16be"), :foo) }
  744. assert_raise(NameError) { c1.const_set("X\u{3042}".encode("utf-16le"), :foo) }
  745. assert_raise(NameError) { c1.const_set("X\u{3042}".encode("utf-32be"), :foo) }
  746. assert_raise(NameError) { c1.const_set("X\u{3042}".encode("utf-32le"), :foo) }
  747. cx = EnvUtil.labeled_class("X\u{3042}")
  748. assert_raise_with_message(TypeError, /X\u{3042}/) { c1.const_set(cx, :foo) }
  749. end
  750. def test_const_get_invalid_name
  751. c1 = Class.new
  752. assert_raise(NameError) { c1.const_get(:foo) }
  753. bug5084 = '[ruby-dev:44200]'
  754. assert_raise(TypeError, bug5084) { c1.const_get(1) }
  755. end
  756. def test_const_defined_invalid_name
  757. c1 = Class.new
  758. assert_raise(NameError) { c1.const_defined?(:foo) }
  759. bug5084 = '[ruby-dev:44200]'
  760. assert_raise(TypeError, bug5084) { c1.const_defined?(1) }
  761. end
  762. def test_const_get_no_inherited
  763. bug3422 = '[ruby-core:30719]'
  764. assert_in_out_err([], <<-INPUT, %w[1 NameError A], [], bug3422)
  765. BasicObject::A = 1
  766. puts [true, false].map {|inh|
  767. begin
  768. Object.const_get(:A, inh)
  769. rescue NameError => e
  770. [e.class, e.name]
  771. end
  772. }
  773. INPUT
  774. end
  775. def test_const_get_inherited
  776. bug3423 = '[ruby-core:30720]'
  777. assert_in_out_err([], <<-INPUT, %w[NameError A NameError A], [], bug3423)
  778. module Foo; A = 1; end
  779. class Object; include Foo; end
  780. class Bar; include Foo; end
  781. puts [Object, Bar].map {|klass|
  782. begin
  783. klass.const_get(:A, false)
  784. rescue NameError => e
  785. [e.class, e.name]
  786. end
  787. }
  788. INPUT
  789. end
  790. def test_const_in_module
  791. bug3423 = '[ruby-core:37698]'
  792. assert_in_out_err([], <<-INPUT, %w[ok], [], bug3423)
  793. module LangModuleSpecInObject
  794. module LangModuleTop
  795. end
  796. end
  797. include LangModuleSpecInObject
  798. module LangModuleTop
  799. end
  800. puts "ok" if LangModuleSpecInObject::LangModuleTop == LangModuleTop
  801. INPUT
  802. bug5264 = '[ruby-core:39227]'
  803. assert_in_out_err([], <<-'INPUT', [], [], bug5264)
  804. class A
  805. class X; end
  806. end
  807. class B < A
  808. module X; end
  809. end
  810. INPUT
  811. end
  812. def test_class_variable_get
  813. c = Class.new
  814. c.class_eval('@@foo = :foo')
  815. assert_equal(:foo, c.class_variable_get(:@@foo))
  816. assert_raise(NameError) { c.class_variable_get(:@@bar) } # c.f. instance_variable_get
  817. assert_raise(NameError) { c.class_variable_get(:'@@') }
  818. assert_raise(NameError) { c.class_variable_get('@@') }
  819. assert_raise(NameError) { c.class_variable_get(:foo) }
  820. assert_raise(NameError) { c.class_variable_get("bar") }
  821. assert_raise(TypeError) { c.class_variable_get(1) }
  822. n = Object.new
  823. def n.to_str; @count = defined?(@count) ? @count + 1 : 1; "@@foo"; end
  824. def n.count; @count; end
  825. assert_equal(:foo, c.class_variable_get(n))
  826. assert_equal(1, n.count)
  827. end
  828. def test_class_variable_set
  829. c = Class.new
  830. c.class_variable_set(:@@foo, :foo)
  831. assert_equal(:foo, c.class_eval('@@foo'))
  832. assert_raise(NameError) { c.class_variable_set(:'@@', 1) }
  833. assert_raise(NameError) { c.class_variable_set('@@', 1) }
  834. assert_raise(NameError) { c.class_variable_set(:foo, 1) }
  835. assert_raise(NameError) { c.class_variable_set("bar", 1) }
  836. assert_raise(TypeError) { c.class_variable_set(1, 1) }
  837. n = Object.new
  838. def n.to_str; @count = defined?(@count) ? @count + 1 : 1; "@@foo"; end
  839. def n.count; @count; end
  840. c.class_variable_set(n, :bar)
  841. assert_equal(:bar, c.class_eval('@@foo'))
  842. assert_equal(1, n.count)
  843. end
  844. def test_class_variable_defined
  845. c = Class.new
  846. c.class_eval('@@foo = :foo')
  847. assert_equal(true, c.class_variable_defined?(:@@foo))
  848. assert_equal(false, c.class_variable_defined?(:@@bar))
  849. assert_raise(NameError) { c.class_variable_defined?(:'@@') }
  850. assert_raise(NameError) { c.class_variable_defined?('@@') }
  851. assert_raise(NameError) { c.class_variable_defined?(:foo) }
  852. assert_raise(NameError) { c.class_variable_defined?("bar") }
  853. assert_raise(TypeError) { c.class_variable_defined?(1) }
  854. n = Object.new
  855. def n.to_str; @count = defined?(@count) ? @count + 1 : 1; "@@foo"; end
  856. def n.count; @count; end
  857. assert_equal(true, c.class_variable_defined?(n))
  858. assert_equal(1, n.count)
  859. end
  860. def test_remove_class_variable
  861. c = Class.new
  862. c.class_eval('@@foo = :foo')
  863. c.class_eval { remove_class_variable(:@@foo) }
  864. assert_equal(false, c.class_variable_defined?(:@@foo))
  865. assert_raise(NameError) do
  866. c.class_eval { remove_class_variable(:@var) }
  867. end
  868. end
  869. def test_export_method
  870. m = Module.new
  871. assert_raise(NameError) do
  872. m.instance_eval { public(:foo) }
  873. end
  874. end
  875. def test_attr
  876. assert_in_out_err([], <<-INPUT, %w(nil))
  877. $VERBOSE = true
  878. c = Class.new
  879. c.instance_eval do
  880. private
  881. attr_reader :foo
  882. end
  883. o = c.new
  884. p(o.instance_eval { foo })
  885. INPUT
  886. c = Class.new
  887. assert_raise(NameError) do
  888. c.instance_eval { attr_reader :"." }
  889. end
  890. end
  891. def test_undef
  892. c = Class.new
  893. assert_raise(NameError) do
  894. c.instance_eval { undef_method(:foo) }
  895. end
  896. m = Module.new
  897. assert_raise(NameError) do
  898. m.instance_eval { undef_method(:foo) }
  899. end
  900. o = Object.new
  901. assert_raise(NameError) do
  902. class << o; self; end.instance_eval { undef_method(:foo) }
  903. end
  904. %w(object_id __send__ initialize).each do |n|
  905. assert_in_out_err([], <<-INPUT, [], %r"warning: undefining `#{n}' may cause serious problems$")
  906. $VERBOSE = false
  907. Class.new.instance_eval { undef_method(:#{n}) }
  908. INPUT
  909. end
  910. end
  911. def test_alias
  912. m = Module.new
  913. assert_raise(NameError) do
  914. m.class_eval { alias foo bar }
  915. end
  916. assert_in_out_err([], <<-INPUT, %w(2), /discarding old foo$/)
  917. $VERBOSE = true
  918. c = Class.new
  919. c.class_eval do
  920. def foo; 1; end
  921. def bar; 2; end
  922. end
  923. c.class_eval { alias foo bar }
  924. p c.new.foo
  925. INPUT
  926. end
  927. def test_mod_constants
  928. m = Module.new
  929. m.const_set(:Foo, :foo)
  930. assert_equal([:Foo], m.constants(true))
  931. assert_equal([:Foo], m.constants(false))
  932. m.instance_eval { remove_const(:Foo) }
  933. end
  934. class Bug9413
  935. class << self
  936. Foo = :foo
  937. end
  938. end
  939. def test_singleton_constants
  940. bug9413 = '[ruby-core:59763] [Bug #9413]'
  941. c = Bug9413.singleton_class
  942. assert_include(c.constants(true), :Foo, bug9413)
  943. assert_include(c.constants(false), :Foo, bug9413)
  944. end
  945. def test_frozen_module
  946. m = Module.new
  947. m.freeze
  948. assert_raise(FrozenError) do
  949. m.instance_eval { undef_method(:foo) }
  950. end
  951. end
  952. def test_frozen_class
  953. c = Class.new
  954. c.freeze
  955. assert_raise(FrozenError) do
  956. c.instance_eval { undef_method(:foo) }
  957. end
  958. end
  959. def test_frozen_singleton_class
  960. klass = Class.new
  961. o = klass.new
  962. c = class << o; self; end
  963. c.freeze
  964. assert_raise_with_message(FrozenError, /frozen/) do
  965. c.instance_eval { undef_method(:foo) }
  966. end
  967. klass.class_eval do
  968. def self.foo
  969. end
  970. end
  971. end
  972. def test_method_defined
  973. cl = Class.new
  974. def_methods = proc do
  975. def foo; end
  976. def bar; end
  977. def baz; end
  978. public :foo
  979. protected :bar
  980. private :baz
  981. end
  982. cl.class_eval(&def_methods)
  983. sc = Class.new(cl)
  984. mod = Module.new(&def_methods)
  985. only_prepend = Class.new{prepend(mod)}
  986. empty_prepend = cl.clone
  987. empty_prepend.prepend(Module.new)
  988. overlap_prepend = cl.clone
  989. overlap_prepend.prepend(mod)
  990. [[], [true], [false]].each do |args|
  991. [cl, sc, only_prepend, empty_prepend, overlap_prepend].each do |c|
  992. always_false = [sc, only_prepend].include?(c) && args == [false]
  993. assert_equal(always_false ? false : true, c.public_method_defined?(:foo, *args))
  994. assert_equal(always_false ? false : false, c.public_method_defined?(:bar, *args))
  995. assert_equal(always_false ? false : false, c.public_method_defined?(:baz, *args))
  996. # Test if string arguments are converted to symbols
  997. assert_equal(always_false ? false : true, c.public_method_defined?("foo", *args))
  998. assert_equal(always_false ? false : false, c.public_method_defined?("bar", *args))
  999. assert_equal(always_false ? false : false, c.public_method_defined?("baz", *args))
  1000. assert_equal(always_false ? false : false, c.protected_method_defined?(:foo, *args))
  1001. assert_equal(always_false ? false : true, c.protected_method_defined?(:bar, *args))
  1002. assert_equal(always_false ? false : false, c.protected_method_defined?(:baz, *args))
  1003. # Test if string arguments are converted to symbols
  1004. assert_equal(always_false ? false : false, c.protected_method_defined?("foo", *args))
  1005. assert_equal(always_false ? false : true, c.protected_method_defined?("bar", *args))
  1006. assert_equal(always_false ? false : false, c.protected_method_defined?("baz", *args))
  1007. assert_equal(always_false ? false : false, c.private_method_defined?(:foo, *args))
  1008. assert_equal(always_false ? false : false, c.private_method_defined?(:bar, *args))
  1009. assert_equal(always_false ? false : true, c.private_method_defined?(:baz, *args))
  1010. # Test if string arguments are converted to symbols
  1011. assert_equal(always_false ? false : false, c.private_method_defined?("foo", *args))
  1012. assert_equal(always_false ? false : false, c.private_method_defined?("bar", *args))
  1013. assert_equal(always_false ? false : true, c.private_method_defined?("baz", *args))
  1014. end
  1015. end
  1016. end
  1017. def test_top_public_private
  1018. assert_in_out_err([], <<-INPUT, %w([:foo] [:bar]), [])
  1019. private
  1020. def foo; :foo; end
  1021. public
  1022. def bar; :bar; end
  1023. p self.private_methods.grep(/^foo$|^bar$/)
  1024. p self.methods.grep(/^foo$|^bar$/)
  1025. INPUT
  1026. end
  1027. def test_append_features
  1028. t = nil
  1029. m = Module.new
  1030. m.module_eval do
  1031. def foo; :foo; end
  1032. end
  1033. class << m; self; end.class_eval do
  1034. define_method(:append_features) do |mod|
  1035. t = mod
  1036. super(mod)
  1037. end
  1038. end
  1039. m2 = Module.new
  1040. m2.module_eval { include(m) }
  1041. assert_equal(m2, t)
  1042. o = Object.new
  1043. o.extend(m2)
  1044. assert_equal(true, o.respond_to?(:foo))
  1045. end
  1046. def test_append_features_raise
  1047. m = Module.new
  1048. m.module_eval do
  1049. def foo; :foo; end
  1050. end
  1051. class << m; self; end.class_eval do
  1052. define_method(:append_features) {|mod| raise }
  1053. end
  1054. m2 = Module.new
  1055. assert_raise(RuntimeError) do
  1056. m2.module_eval { include(m) }
  1057. end
  1058. o = Object.new
  1059. o.extend(m2)
  1060. assert_equal(false, o.respond_to?(:foo))
  1061. end
  1062. def test_append_features_type_error
  1063. assert_raise(TypeError) do
  1064. Module.new.instance_eval { append_features(1) }
  1065. end
  1066. end
  1067. def test_included
  1068. m = Module.new
  1069. m.module_eval do
  1070. def foo; :foo; end
  1071. end
  1072. class << m; self; end.class_eval do
  1073. define_method(:included) {|mod| raise }
  1074. end
  1075. m2 = Module.new
  1076. assert_raise(RuntimeError) do
  1077. m2.module_eval { include(m) }
  1078. end
  1079. o = Object.new
  1080. o.extend(m2)
  1081. assert_equal(true, o.respond_to?(:foo))
  1082. end
  1083. def test_cyclic_include
  1084. m1 = Module.new
  1085. m2 = Module.new
  1086. m1.instance_eval { include(m2) }
  1087. assert_raise(ArgumentError) do
  1088. m2.instance_eval { include(m1) }
  1089. end
  1090. end
  1091. def test_include_p
  1092. m = Module.new
  1093. c1 = Class.new
  1094. c1.instance_eval { include(m) }
  1095. c2 = Class.new(c1)
  1096. assert_equal(true, c1.include?(m))
  1097. assert_equal(true, c2.include?(m))
  1098. assert_equal(false, m.include?(m))
  1099. end
  1100. def test_send
  1101. a = AClass.new
  1102. assert_equal(:aClass, a.__send__(:aClass))
  1103. assert_equal(:aClass1, a.__send__(:aClass1))
  1104. assert_equal(:aClass2, a.__send__(:aClass2))
  1105. b = BClass.new
  1106. assert_equal(:aClass, b.__send__(:aClass))
  1107. assert_equal(:aClass1, b.__send__(:aClass1))
  1108. assert_equal(:aClass2, b.__send__(:aClass2))
  1109. assert_equal(:bClass1, b.__send__(:bClass1))
  1110. assert_equal(:bClass2, b.__send__(:bClass2))
  1111. assert_equal(:bClass3, b.__send__(:bClass3))
  1112. end
  1113. def test_nonascii_name
  1114. c = eval("class ::C\u{df}; self; end")
  1115. assert_equal("C\u{df}", c.name, '[ruby-core:24600]')
  1116. c = eval("class C\u{df}; self; end")
  1117. assert_equal("TestModule::C\u{df}", c.name, '[ruby-core:24600]')
  1118. c = Module.new.module_eval("class X\u{df} < Module; self; end")
  1119. assert_match(/::X\u{df}:/, c.new.to_s)
  1120. end
  1121. def test_method_added
  1122. memo = []
  1123. mod = Module.new do
  1124. mod = self
  1125. (class << self ; self ; end).class_eval do
  1126. define_method :method_added do |sym|
  1127. memo << sym
  1128. memo << mod.instance_methods(false)
  1129. memo << (mod.instance_method(sym) rescue nil)
  1130. end
  1131. end
  1132. def f
  1133. end
  1134. alias g f
  1135. attr_reader :a
  1136. attr_writer :a
  1137. end
  1138. assert_equal :f, memo.shift
  1139. assert_equal [:f], memo.shift, '[ruby-core:25536]'
  1140. assert_equal mod.instance_method(:f), memo.shift
  1141. assert_equal :g, memo.shift
  1142. assert_equal [:f, :g].sort, memo.shift.sort
  1143. assert_equal mod.instance_method(:f), memo.shift
  1144. assert_equal :a, memo.shift
  1145. assert_equal [:f, :g, :a].sort, memo.shift.sort
  1146. assert_equal mod.instance_method(:a), memo.shift
  1147. assert_equal :a=, memo.shift
  1148. assert_equal [:f, :g, :a, :a=].sort, memo.shift.sort
  1149. assert_equal mod.instance_method(:a=), memo.shift
  1150. end
  1151. def test_method_undefined
  1152. added = []
  1153. undefed = []
  1154. removed = []
  1155. mod = Module.new do
  1156. mod = self
  1157. def f
  1158. end
  1159. (class << self ; self ; end).class_eval do
  1160. define_method :method_added do |sym|
  1161. added << sym
  1162. end
  1163. define_method :method_undefined do |sym|
  1164. undefed << sym
  1165. end
  1166. define_method :method_removed do |sym|
  1167. removed << sym
  1168. end
  1169. end
  1170. end
  1171. assert_method_defined?(mod, :f)
  1172. mod.module_eval do
  1173. undef :f
  1174. end
  1175. assert_equal [], added
  1176. assert_equal [:f], undefed
  1177. assert_equal [], removed
  1178. end
  1179. def test_method_removed
  1180. added = []
  1181. undefed = []
  1182. removed = []
  1183. mod = Module.new do
  1184. mod = self
  1185. def f
  1186. end
  1187. (class << self ; self ; end).class_eval do
  1188. define_method :method_added do |sym|
  1189. added << sym
  1190. end
  1191. define_method :method_undefined do |sym|
  1192. undefed << sym
  1193. end
  1194. define_method :method_removed do |sym|
  1195. removed << sym
  1196. end
  1197. end
  1198. end
  1199. assert_method_defined?(mod, :f)
  1200. mod.module_eval do
  1201. remove_method :f
  1202. end
  1203. assert_equal [], added
  1204. assert_equal [], undefed
  1205. assert_equal [:f], removed
  1206. end
  1207. def test_method_redefinition
  1208. feature2155 = '[ruby-dev:39400]'
  1209. line = __LINE__+4
  1210. stderr = EnvUtil.verbose_warning do
  1211. Module.new do
  1212. def foo; end
  1213. def foo; end
  1214. end
  1215. end
  1216. assert_match(/:#{line}: warning: method redefined; discarding old foo/, stderr)
  1217. assert_match(/:#{line-1}: warning: previous definition of foo/, stderr, feature2155)
  1218. assert_warning '' do
  1219. Module.new do
  1220. def foo; end
  1221. alias bar foo
  1222. def foo; end
  1223. end
  1224. end
  1225. assert_warning '' do
  1226. Module.new do
  1227. def foo; end
  1228. alias bar foo
  1229. alias bar foo
  1230. end
  1231. end
  1232. line = __LINE__+4
  1233. stderr = EnvUtil.verbose_warning do
  1234. Module.new do
  1235. define_method(:foo) do end
  1236. def foo; end
  1237. end
  1238. end
  1239. assert_match(/:#{line}: warning: method redefined; discarding old foo/, stderr)
  1240. assert_match(/:#{line-1}: warning: previous definition of foo/, stderr, feature2155)
  1241. assert_warning '' do
  1242. Module.new do
  1243. define_method(:foo) do end
  1244. alias bar foo
  1245. alias bar foo
  1246. end
  1247. end
  1248. assert_warning('', '[ruby-dev:39397]') do
  1249. Module.new do
  1250. module_function
  1251. def foo; end
  1252. module_function :foo
  1253. end
  1254. end
  1255. assert_warning '' do
  1256. Module.new do
  1257. def foo; end
  1258. undef foo
  1259. end
  1260. end
  1261. stderr = EnvUtil.verbose_warning do
  1262. Module.new do
  1263. def foo; end
  1264. mod = self
  1265. c = Class.new do
  1266. include mod
  1267. end
  1268. c.new.foo
  1269. def foo; end
  1270. end
  1271. end
  1272. assert_match(/: warning: method redefined; discarding old foo/, stderr)
  1273. assert_match(/: warning: previous definition of foo/, stderr)
  1274. end
  1275. def test_module_function_inside_method
  1276. assert_warn(/calling module_function without arguments inside a method may not have the intended effect/, '[ruby-core:79751]') do
  1277. Module.new do
  1278. def self.foo
  1279. module_function
  1280. end
  1281. foo
  1282. end
  1283. end
  1284. end
  1285. def test_protected_singleton_method
  1286. klass = Class.new
  1287. x = klass.new
  1288. class << x
  1289. protected
  1290. def foo
  1291. end
  1292. end
  1293. assert_raise(NoMethodError) do
  1294. x.foo
  1295. end
  1296. klass.send(:define_method, :bar) do
  1297. x.foo
  1298. end
  1299. assert_nothing_raised do
  1300. x.bar
  1301. end
  1302. y = klass.new
  1303. assert_raise(NoMethodError) do
  1304. y.bar
  1305. end
  1306. end
  1307. def test_uninitialized_toplevel_constant
  1308. bug3123 = '[ruby-dev:40951]'
  1309. e = assert_raise(NameError) {eval("Bug3123", TOPLEVEL_BINDING)}
  1310. assert_not_match(/Object::/, e.message, bug3123)
  1311. end
  1312. def test_attr_inherited_visibility
  1313. bug3406 = '[ruby-core:30638]'
  1314. c = Class.new do
  1315. class << self
  1316. private
  1317. def attr_accessor(*); super; end
  1318. end
  1319. attr_accessor :x
  1320. end.new
  1321. assert_nothing_raised(bug3406) {c.x = 1}
  1322. assert_equal(1, c.x, bug3406)
  1323. end
  1324. def test_attr_writer_with_no_arguments
  1325. bug8540 = "[ruby-core:55543]"
  1326. c = Class.new do
  1327. attr_writer :foo
  1328. end
  1329. assert_raise(ArgumentError, bug8540) { c.new.send :foo= }
  1330. end
  1331. def test_private_constant_in_class
  1332. c = Class.new
  1333. c.const_set(:FOO, "foo")
  1334. assert_equal("foo", c::FOO)
  1335. c.private_constant(:FOO)
  1336. e = assert_raise(NameError) {c::FOO}
  1337. assert_equal(c, e.receiver)
  1338. assert_equal(:FOO, e.name)
  1339. assert_equal("foo", c.class_eval("FOO"))
  1340. assert_equal("foo", c.const_get("FOO"))
  1341. $VERBOSE, verbose = nil, $VERBOSE
  1342. c.const_set(:FOO, "foo")
  1343. $VERBOSE = verbose
  1344. e = assert_raise(NameError) {c::FOO}
  1345. assert_equal(c, e.receiver)
  1346. assert_equal(:FOO, e.name)
  1347. e = assert_raise_with_message(NameError, /#{c}::FOO/) do
  1348. Class.new(c)::FOO
  1349. end
  1350. assert_equal(c, e.receiver)
  1351. assert_equal(:FOO, e.name)
  1352. end
  1353. def test_private_constant_in_module
  1354. m = Module.new
  1355. m.const_set(:FOO, "foo")
  1356. assert_equal("foo", m::FOO)
  1357. m.private_constant(:FOO)
  1358. e = assert_raise(NameError) {m::FOO}
  1359. assert_equal(m, e.receiver)
  1360. assert_equal(:FOO, e.name)
  1361. assert_equal("foo", m.class_eval("FOO"))
  1362. assert_equal("foo", m.const_get("FOO"))
  1363. $VERBOSE, verbose = nil, $VERBOSE
  1364. m.const_set(:FOO, "foo")
  1365. $VERBOSE = verbose
  1366. e = assert_raise(NameError) {m::FOO}
  1367. assert_equal(m, e.receiver)
  1368. assert_equal(:FOO, e.name)
  1369. e = assert_raise(NameError, /#{m}::FOO/) do
  1370. Module.new {include m}::FOO
  1371. end
  1372. assert_equal(m, e.receiver)
  1373. assert_equal(:FOO, e.name)
  1374. e = assert_raise(NameError, /#{m}::FOO/) do
  1375. Class.new {include m}::FOO
  1376. end
  1377. assert_equal(m, e.receiver)
  1378. assert_equal(:FOO, e.name)
  1379. end
  1380. def test_private_constant2
  1381. c = Class.new
  1382. c.const_set(:FOO, "foo")
  1383. c.const_set(:BAR, "bar")
  1384. assert_equal("foo", c::FOO)
  1385. assert_equal("bar", c::BAR)
  1386. c.private_constant(:FOO, :BAR)
  1387. assert_raise(NameError) { c::FOO }
  1388. assert_raise(NameError) { c::BAR }
  1389. assert_equal("foo", c.class_eval("FOO"))
  1390. assert_equal("bar", c.class_eval("BAR"))
  1391. end
  1392. def test_private_constant_with_no_args
  1393. assert_in_out_err([], <<-RUBY, [], ["-:3: warning: private_constant with no argument is just ignored"])
  1394. $-w = true
  1395. class X
  1396. private_constant
  1397. end
  1398. RUBY
  1399. end
  1400. def test_private_constant_const_missing
  1401. c = Class.new
  1402. c.const_set(:FOO, "foo")
  1403. c.private_constant(:FOO)
  1404. class << c
  1405. attr_reader :const_missing_arg
  1406. def const_missing(name)
  1407. @const_missing_arg = name
  1408. name == :FOO ? const_get(:FOO) : super
  1409. end
  1410. end
  1411. assert_equal("foo", c::FOO)
  1412. assert_equal(:FOO, c.const_missing_arg)
  1413. end
  1414. class PrivateClass
  1415. end
  1416. private_constant :PrivateClass
  1417. def test_define_module_under_private_constant
  1418. assert_raise(NameError) do
  1419. eval %q{class TestModule::PrivateClass; end}
  1420. end
  1421. assert_raise(NameError) do
  1422. eval %q{module TestModule::PrivateClass::TestModule; end}
  1423. end
  1424. eval %q{class PrivateClass; end}
  1425. eval %q{module PrivateClass::TestModule; end}
  1426. assert_instance_of(Module, PrivateClass::TestModule)
  1427. PrivateClass.class_eval { remove_const(:TestModule) }
  1428. end
  1429. def test_public_constant
  1430. c = Class.new
  1431. c.const_set(:FOO, "foo")
  1432. assert_equal("foo", c::FOO)
  1433. c.private_constant(:FOO)
  1434. assert_raise(NameError) { c::FOO }
  1435. assert_equal("foo", c.class_eval("FOO"))
  1436. c.public_constant(:FOO)
  1437. assert_equal("foo", c::FOO)
  1438. end
  1439. def test_deprecate_constant
  1440. c = Class.new
  1441. c.const_set(:FOO, "foo")
  1442. c.deprecate_constant(:FOO)
  1443. assert_warn(/deprecated/) {c::FOO}
  1444. assert_warn(/#{c}::FOO is deprecated/) {Class.new(c)::FOO}
  1445. bug12382 = '[ruby-core:75505] [Bug #12382]'
  1446. assert_warn(/deprecated/, bug12382) {c.class_eval "FOO"}
  1447. Warning[:deprecated] = false
  1448. assert_warn('') {c::FOO}
  1449. end
  1450. NIL = nil
  1451. FALSE = false
  1452. deprecate_constant(:NIL, :FALSE)
  1453. def test_deprecate_nil_constant
  1454. w = EnvUtil.verbose_warning {2.times {FALSE}}
  1455. assert_equal(1, w.scan("::FALSE").size, w)
  1456. w = EnvUtil.verbose_warning {2.times {NIL}}
  1457. assert_equal(1, w.scan("::NIL").size, w)
  1458. end
  1459. def test_constants_with_private_constant
  1460. assert_not_include(::TestModule.constants, :PrivateClass)
  1461. assert_not_include(::TestModule.constants(true), :PrivateClass)
  1462. assert_not_include(::TestModule.constants(false), :PrivateClass)
  1463. end
  1464. def test_toplevel_private_constant
  1465. src = <<-INPUT
  1466. class Object
  1467. private_constant :Object
  1468. end
  1469. p Object
  1470. begin
  1471. p ::Object
  1472. rescue
  1473. p :ok
  1474. end
  1475. INPUT
  1476. assert_in_out_err([], src, %w(Object :ok), [])
  1477. end
  1478. def test_private_constants_clear_inlinecache
  1479. bug5702 = '[ruby-dev:44929]'
  1480. src = <<-INPUT
  1481. class A
  1482. C = :Const
  1483. def self.get_C
  1484. A::C
  1485. end
  1486. # fill cache
  1487. A.get_C
  1488. private_constant :C, :D rescue nil
  1489. begin
  1490. A.get_C
  1491. rescue NameError
  1492. puts "A.get_C"
  1493. end
  1494. end
  1495. INPUT
  1496. assert_in_out_err([], src, %w(A.get_C), [], bug5702)
  1497. end
  1498. def test_constant_lookup_in_method_defined_by_class_eval
  1499. src = <<-INPUT
  1500. class A
  1501. B = 42
  1502. end
  1503. A.class_eval do
  1504. def self.f
  1505. B
  1506. end
  1507. def f
  1508. B
  1509. end
  1510. end
  1511. begin
  1512. A.f
  1513. rescue NameError
  1514. puts "A.f"
  1515. end
  1516. begin
  1517. A.new.f
  1518. rescue NameError
  1519. puts "A.new.f"
  1520. end
  1521. INPUT
  1522. assert_in_out_err([], src, %w(A.f A.new.f), [])
  1523. end
  1524. def test_constant_lookup_in_toplevel_class_eval
  1525. src = <<-INPUT
  1526. module X
  1527. A = 123
  1528. end
  1529. begin
  1530. X.class_eval { A }
  1531. rescue NameError => e
  1532. puts e
  1533. end
  1534. INPUT
  1535. assert_in_out_err([], src, ["uninitialized constant A"], [])
  1536. end
  1537. def test_constant_lookup_in_module_in_class_eval
  1538. src = <<-INPUT
  1539. class A
  1540. B = 42
  1541. end
  1542. A.class_eval do
  1543. module C
  1544. begin
  1545. B
  1546. rescue NameError
  1547. puts "NameError"
  1548. end
  1549. end
  1550. end
  1551. INPUT
  1552. assert_in_out_err([], src, ["NameError"], [])
  1553. end
  1554. module M0
  1555. def m1; [:M0] end
  1556. end
  1557. module M1
  1558. def m1; [:M1, *super] end
  1559. end
  1560. module M2
  1561. def m1; [:M2, *super] end
  1562. end
  1563. M3 = Module.new do
  1564. def m1; [:M3, *super] end
  1565. end
  1566. module M4
  1567. def m1; [:M4, *super] end
  1568. end
  1569. class C
  1570. def m1; end
  1571. end
  1572. class C0 < C
  1573. include M0
  1574. prepend M1
  1575. def m1; [:C0, *super] end
  1576. end
  1577. class C1 < C0
  1578. prepend M2, M3
  1579. include M4
  1580. def m1; [:C1, *super] end
  1581. end
  1582. def test_prepend
  1583. obj = C0.new
  1584. expected = [:M1,:C0,:M0]
  1585. assert_equal(expected, obj.m1)
  1586. obj = C1.new
  1587. expected = [:M2,:M3,:C1,:M4,:M1,:C0,:M0]
  1588. assert_equal(expected, obj.m1)
  1589. end
  1590. def test_public_prepend
  1591. assert_nothing_raised('#8846') do
  1592. Class.new.prepend(Module.new)
  1593. end
  1594. end
  1595. def test_prepend_CMP
  1596. bug11878 = '[ruby-core:72493] [Bug #11878]'
  1597. assert_equal(-1, C1 <=> M2)
  1598. assert_equal(+1, M2 <=> C1, bug11878)
  1599. end
  1600. def test_prepend_inheritance
  1601. bug6654 = '[ruby-core:45914]'
  1602. a = labeled_module("a")
  1603. b = labeled_module("b") {include a}
  1604. c = labeled_class("c") {prepend b}
  1605. assert_operator(c, :<, b, bug6654)
  1606. assert_operator(c, :<, a, bug6654)
  1607. bug8357 = '[ruby-core:54736] [Bug #8357]'
  1608. b = labeled_module("b") {prepend a}
  1609. c = labeled_class("c") {include b}
  1610. assert_operator(c, :<, b, bug8357)
  1611. assert_operator(c, :<, a, bug8357)
  1612. bug8357 = '[ruby-core:54742] [Bug #8357]'
  1613. assert_kind_of(b, c.new, bug8357)
  1614. end
  1615. def test_prepend_instance_methods
  1616. bug6655 = '[ruby-core:45915]'
  1617. assert_equal(Object.instance_methods, Class.new {prepend Module.new}.instance_methods, bug6655)
  1618. end
  1619. def test_prepend_singleton_methods
  1620. o = Object.new
  1621. o.singleton_class.class_eval {prepend Module.new}
  1622. assert_equal([], o.singleton_methods)
  1623. end
  1624. def test_prepend_remove_method
  1625. c = Class.new do
  1626. prepend Module.new {def foo; end}
  1627. end
  1628. assert_raise(NameError) do
  1629. c.class_eval do
  1630. remove_method(:foo)
  1631. end
  1632. end
  1633. c.class_eval do
  1634. def foo; end
  1635. end
  1636. removed = nil
  1637. c.singleton_class.class_eval do
  1638. define_method(:method_removed) {|id| removed = id}
  1639. end
  1640. assert_nothing_raised(NoMethodError, NameError, '[Bug #7843]') do
  1641. c.class_eval do
  1642. remove_method(:foo)
  1643. end
  1644. end
  1645. assert_equal(:foo, removed)
  1646. end
  1647. def test_prepend_class_ancestors
  1648. bug6658 = '[ruby-core:45919]'
  1649. m = labeled_module("m")
  1650. c = labeled_class("c") {prepend m}
  1651. asser

Large files files are truncated, but you can click here to view the full file