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

/TDDBC_Yokohama2_PCUnit/Ruby/doc/ruby/ruby-1.9.2/test/ruby/test_module.rb

https://bitbucket.org/aetos/tddbc_yokohama2
Ruby | 923 lines | 783 code | 135 blank | 5 comment | 2 complexity | 55992f113d718e50d2de65bbb161f20a MD5 | raw file
Possible License(s): BSD-3-Clause, GPL-2.0, AGPL-3.0, 0BSD, Unlicense
  1. require 'test/unit'
  2. require 'pp'
  3. require_relative 'envutil'
  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. end
  27. def teardown
  28. $VERBOSE = @verbose
  29. end
  30. def test_LT_0
  31. assert_equal true, String < Object
  32. assert_equal false, Object < String
  33. assert_nil String < Array
  34. assert_equal true, Array < Enumerable
  35. assert_equal false, Enumerable < Array
  36. assert_nil Proc < Comparable
  37. assert_nil Comparable < Proc
  38. end
  39. def test_GT_0
  40. assert_equal false, String > Object
  41. assert_equal true, Object > String
  42. assert_nil String > Array
  43. assert_equal false, Array > Enumerable
  44. assert_equal true, Enumerable > Array
  45. assert_nil Comparable > Proc
  46. assert_nil Proc > Comparable
  47. end
  48. def test_CMP_0
  49. assert_equal(-1, (String <=> Object))
  50. assert_equal 1, (Object <=> String)
  51. assert_nil(Array <=> String)
  52. end
  53. ExpectedException = NoMethodError
  54. # Support stuff
  55. def remove_pp_mixins(list)
  56. list.reject {|c| c == PP::ObjectMixin }
  57. end
  58. def remove_json_mixins(list)
  59. list.reject {|c| c.to_s.start_with?("JSON") }
  60. end
  61. def remove_rake_mixins(list)
  62. list.
  63. reject {|c| c.to_s == "RakeFileUtils" }.
  64. reject {|c| c.to_s.start_with?("FileUtils") }
  65. end
  66. module Mixin
  67. MIXIN = 1
  68. def mixin
  69. end
  70. end
  71. module User
  72. USER = 2
  73. include Mixin
  74. def user
  75. end
  76. end
  77. module Other
  78. def other
  79. end
  80. end
  81. class AClass
  82. def AClass.cm1
  83. "cm1"
  84. end
  85. def AClass.cm2
  86. cm1 + "cm2" + cm3
  87. end
  88. def AClass.cm3
  89. "cm3"
  90. end
  91. private_class_method :cm1, "cm3"
  92. def aClass
  93. :aClass
  94. end
  95. def aClass1
  96. :aClass1
  97. end
  98. def aClass2
  99. :aClass2
  100. end
  101. private :aClass1
  102. protected :aClass2
  103. end
  104. class BClass < AClass
  105. def bClass1
  106. :bClass1
  107. end
  108. private
  109. def bClass2
  110. :bClass2
  111. end
  112. protected
  113. def bClass3
  114. :bClass3
  115. end
  116. end
  117. class CClass < BClass
  118. def self.cClass
  119. end
  120. end
  121. MyClass = AClass.clone
  122. class MyClass
  123. public_class_method :cm1
  124. end
  125. # -----------------------------------------------------------
  126. def test_CMP # '<=>'
  127. assert_equal( 0, Mixin <=> Mixin)
  128. assert_equal(-1, User <=> Mixin)
  129. assert_equal( 1, Mixin <=> User)
  130. assert_equal( 0, Object <=> Object)
  131. assert_equal(-1, String <=> Object)
  132. assert_equal( 1, Object <=> String)
  133. end
  134. def test_GE # '>='
  135. assert(Mixin >= User)
  136. assert(Mixin >= Mixin)
  137. assert(!(User >= Mixin))
  138. assert(Object >= String)
  139. assert(String >= String)
  140. assert(!(String >= Object))
  141. end
  142. def test_GT # '>'
  143. assert(Mixin > User)
  144. assert(!(Mixin > Mixin))
  145. assert(!(User > Mixin))
  146. assert(Object > String)
  147. assert(!(String > String))
  148. assert(!(String > Object))
  149. end
  150. def test_LE # '<='
  151. assert(User <= Mixin)
  152. assert(Mixin <= Mixin)
  153. assert(!(Mixin <= User))
  154. assert(String <= Object)
  155. assert(String <= String)
  156. assert(!(Object <= String))
  157. end
  158. def test_LT # '<'
  159. assert(User < Mixin)
  160. assert(!(Mixin < Mixin))
  161. assert(!(Mixin < User))
  162. assert(String < Object)
  163. assert(!(String < String))
  164. assert(!(Object < String))
  165. end
  166. def test_VERY_EQUAL # '==='
  167. assert(Object === self)
  168. assert(Test::Unit::TestCase === self)
  169. assert(TestModule === self)
  170. assert(!(String === self))
  171. end
  172. def test_ancestors
  173. assert_equal([User, Mixin], User.ancestors)
  174. assert_equal([Mixin], Mixin.ancestors)
  175. assert_equal([Object, Kernel, BasicObject],
  176. remove_rake_mixins(remove_json_mixins(remove_pp_mixins(Object.ancestors))))
  177. assert_equal([String, Comparable, Object, Kernel, BasicObject],
  178. remove_rake_mixins(remove_json_mixins(remove_pp_mixins(String.ancestors))))
  179. end
  180. CLASS_EVAL = 2
  181. @@class_eval = 'b'
  182. def test_class_eval
  183. Other.class_eval("CLASS_EVAL = 1")
  184. assert_equal(1, Other::CLASS_EVAL)
  185. assert(Other.constants.include?(:CLASS_EVAL))
  186. assert_equal(2, Other.class_eval { CLASS_EVAL })
  187. Other.class_eval("@@class_eval = 'a'")
  188. assert_equal('a', Other.class_variable_get(:@@class_eval))
  189. assert_equal('b', Other.class_eval { @@class_eval })
  190. Other.class_eval do
  191. module_function
  192. def class_eval_test
  193. "foo"
  194. end
  195. end
  196. assert_equal("foo", Other.class_eval_test)
  197. assert_equal([Other], Other.class_eval { |*args| args })
  198. end
  199. def test_const_defined?
  200. assert(Math.const_defined?(:PI))
  201. assert(Math.const_defined?("PI"))
  202. assert(!Math.const_defined?(:IP))
  203. assert(!Math.const_defined?("IP"))
  204. end
  205. def test_const_get
  206. assert_equal(Math::PI, Math.const_get("PI"))
  207. assert_equal(Math::PI, Math.const_get(:PI))
  208. end
  209. def test_const_set
  210. assert(!Other.const_defined?(:KOALA))
  211. Other.const_set(:KOALA, 99)
  212. assert(Other.const_defined?(:KOALA))
  213. assert_equal(99, Other::KOALA)
  214. Other.const_set("WOMBAT", "Hi")
  215. assert_equal("Hi", Other::WOMBAT)
  216. end
  217. def test_constants
  218. assert_equal([:MIXIN], Mixin.constants)
  219. assert_equal([:MIXIN, :USER], User.constants.sort)
  220. end
  221. def test_included_modules
  222. assert_equal([], Mixin.included_modules)
  223. assert_equal([Mixin], User.included_modules)
  224. assert_equal([Kernel],
  225. remove_rake_mixins(remove_json_mixins(remove_pp_mixins(Object.included_modules))))
  226. assert_equal([Comparable, Kernel],
  227. remove_rake_mixins(remove_json_mixins(remove_pp_mixins(String.included_modules))))
  228. end
  229. def test_instance_methods
  230. assert_equal([:user], User.instance_methods(false))
  231. assert_equal([:user, :mixin].sort, User.instance_methods(true).sort)
  232. assert_equal([:mixin], Mixin.instance_methods)
  233. assert_equal([:mixin], Mixin.instance_methods(true))
  234. assert_equal([:cClass], (class << CClass; self; end).instance_methods(false))
  235. assert_equal([], (class << BClass; self; end).instance_methods(false))
  236. assert_equal([:cm2], (class << AClass; self; end).instance_methods(false))
  237. # Ruby 1.8 feature change:
  238. # #instance_methods includes protected methods.
  239. #assert_equal([:aClass], AClass.instance_methods(false))
  240. assert_equal([:aClass, :aClass2], AClass.instance_methods(false).sort)
  241. assert_equal([:aClass, :aClass2],
  242. (AClass.instance_methods(true) - Object.instance_methods(true)).sort)
  243. end
  244. def test_method_defined?
  245. assert_method_not_defined?(User, :wombat)
  246. assert_method_defined?(User, :user)
  247. assert_method_defined?(User, :mixin)
  248. assert_method_not_defined?(User, :wombat)
  249. assert_method_defined?(User, :user)
  250. assert_method_defined?(User, :mixin)
  251. end
  252. def module_exec_aux
  253. Proc.new do
  254. def dynamically_added_method_3; end
  255. end
  256. end
  257. def module_exec_aux_2(&block)
  258. User.module_exec(&block)
  259. end
  260. def test_module_exec
  261. User.module_exec do
  262. def dynamically_added_method_1; end
  263. end
  264. assert_method_defined?(User, :dynamically_added_method_1)
  265. block = Proc.new do
  266. def dynamically_added_method_2; end
  267. end
  268. User.module_exec(&block)
  269. assert_method_defined?(User, :dynamically_added_method_2)
  270. User.module_exec(&module_exec_aux)
  271. assert_method_defined?(User, :dynamically_added_method_3)
  272. module_exec_aux_2 do
  273. def dynamically_added_method_4; end
  274. end
  275. assert_method_defined?(User, :dynamically_added_method_4)
  276. end
  277. def test_module_eval
  278. User.module_eval("MODULE_EVAL = 1")
  279. assert_equal(1, User::MODULE_EVAL)
  280. assert(User.constants.include?(:MODULE_EVAL))
  281. User.instance_eval("remove_const(:MODULE_EVAL)")
  282. assert(!User.constants.include?(:MODULE_EVAL))
  283. end
  284. def test_name
  285. assert_equal("Fixnum", Fixnum.name)
  286. assert_equal("TestModule::Mixin", Mixin.name)
  287. assert_equal("TestModule::User", User.name)
  288. end
  289. def test_private_class_method
  290. assert_raise(ExpectedException) { AClass.cm1 }
  291. assert_raise(ExpectedException) { AClass.cm3 }
  292. assert_equal("cm1cm2cm3", AClass.cm2)
  293. end
  294. def test_private_instance_methods
  295. assert_equal([:aClass1], AClass.private_instance_methods(false))
  296. assert_equal([:bClass2], BClass.private_instance_methods(false))
  297. assert_equal([:aClass1, :bClass2],
  298. (BClass.private_instance_methods(true) -
  299. Object.private_instance_methods(true)).sort)
  300. end
  301. def test_protected_instance_methods
  302. assert_equal([:aClass2], AClass.protected_instance_methods)
  303. assert_equal([:bClass3], BClass.protected_instance_methods(false))
  304. assert_equal([:bClass3, :aClass2].sort,
  305. (BClass.protected_instance_methods(true) -
  306. Object.protected_instance_methods(true)).sort)
  307. end
  308. def test_public_class_method
  309. assert_equal("cm1", MyClass.cm1)
  310. assert_equal("cm1cm2cm3", MyClass.cm2)
  311. assert_raise(ExpectedException) { eval "MyClass.cm3" }
  312. end
  313. def test_public_instance_methods
  314. assert_equal([:aClass], AClass.public_instance_methods(false))
  315. assert_equal([:bClass1], BClass.public_instance_methods(false))
  316. end
  317. def test_s_constants
  318. c1 = Module.constants
  319. Object.module_eval "WALTER = 99"
  320. c2 = Module.constants
  321. assert_equal([:WALTER], c2 - c1)
  322. assert_equal([], Module.constants(true))
  323. assert_equal([], Module.constants(false))
  324. src = <<-INPUT
  325. ary = Module.constants
  326. module M
  327. WALTER = 99
  328. end
  329. class Module
  330. include M
  331. end
  332. p Module.constants - ary, Module.constants(true), Module.constants(false)
  333. INPUT
  334. assert_in_out_err([], src, %w([:M] [:WALTER] []), [])
  335. end
  336. module M1
  337. $m1 = Module.nesting
  338. module M2
  339. $m2 = Module.nesting
  340. end
  341. end
  342. def test_s_nesting
  343. assert_equal([], $m0)
  344. assert_equal([TestModule::M1, TestModule], $m1)
  345. assert_equal([TestModule::M1::M2,
  346. TestModule::M1, TestModule], $m2)
  347. end
  348. def test_s_new
  349. m = Module.new
  350. assert_instance_of(Module, m)
  351. end
  352. def test_freeze
  353. m = Module.new
  354. m.freeze
  355. assert_raise(RuntimeError) do
  356. m.module_eval do
  357. def foo; end
  358. end
  359. end
  360. end
  361. def test_attr_obsoleted_flag
  362. c = Class.new
  363. c.class_eval do
  364. def initialize
  365. @foo = :foo
  366. @bar = :bar
  367. end
  368. attr :foo, true
  369. attr :bar, false
  370. end
  371. o = c.new
  372. assert_equal(true, o.respond_to?(:foo))
  373. assert_equal(true, o.respond_to?(:foo=))
  374. assert_equal(true, o.respond_to?(:bar))
  375. assert_equal(false, o.respond_to?(:bar=))
  376. end
  377. def test_const_get2
  378. c1 = Class.new
  379. c2 = Class.new(c1)
  380. eval("c1::Foo = :foo")
  381. assert_equal(:foo, c1::Foo)
  382. assert_equal(:foo, c2::Foo)
  383. assert_equal(:foo, c2.const_get(:Foo))
  384. assert_raise(NameError) { c2.const_get(:Foo, false) }
  385. eval("c1::Foo = :foo")
  386. assert_raise(NameError) { c1::Bar }
  387. assert_raise(NameError) { c2::Bar }
  388. assert_raise(NameError) { c2.const_get(:Bar) }
  389. assert_raise(NameError) { c2.const_get(:Bar, false) }
  390. c1.instance_eval do
  391. def const_missing(x)
  392. x
  393. end
  394. end
  395. assert_equal(:Bar, c1::Bar)
  396. assert_equal(:Bar, c2::Bar)
  397. assert_equal(:Bar, c2.const_get(:Bar))
  398. assert_equal(:Bar, c2.const_get(:Bar, false))
  399. assert_raise(NameError) { c1.const_get(:foo) }
  400. end
  401. def test_const_set2
  402. c1 = Class.new
  403. assert_raise(NameError) { c1.const_set(:foo, :foo) }
  404. end
  405. def test_const_get3
  406. c1 = Class.new
  407. assert_raise(NameError) { c1.const_defined?(:foo) }
  408. end
  409. def test_class_variable_get
  410. c = Class.new
  411. c.class_eval('@@foo = :foo')
  412. assert_equal(:foo, c.class_variable_get(:@@foo))
  413. assert_raise(NameError) { c.class_variable_get(:@@bar) } # c.f. instance_variable_get
  414. assert_raise(NameError) { c.class_variable_get(:foo) }
  415. end
  416. def test_class_variable_set
  417. c = Class.new
  418. c.class_variable_set(:@@foo, :foo)
  419. assert_equal(:foo, c.class_eval('@@foo'))
  420. assert_raise(NameError) { c.class_variable_set(:foo, 1) }
  421. end
  422. def test_class_variable_defined
  423. c = Class.new
  424. c.class_eval('@@foo = :foo')
  425. assert_equal(true, c.class_variable_defined?(:@@foo))
  426. assert_equal(false, c.class_variable_defined?(:@@bar))
  427. assert_raise(NameError) { c.class_variable_defined?(:foo) }
  428. end
  429. def test_remove_class_variable
  430. c = Class.new
  431. c.class_eval('@@foo = :foo')
  432. c.class_eval { remove_class_variable(:@@foo) }
  433. assert_equal(false, c.class_variable_defined?(:@@foo))
  434. end
  435. def test_export_method
  436. m = Module.new
  437. assert_raise(NameError) do
  438. m.instance_eval { public(:foo) }
  439. end
  440. end
  441. def test_attr
  442. assert_in_out_err([], <<-INPUT, %w(:ok nil), /warning: private attribute\?$/)
  443. $VERBOSE = true
  444. c = Class.new
  445. c.instance_eval do
  446. private
  447. attr_reader :foo
  448. end
  449. o = c.new
  450. o.foo rescue p(:ok)
  451. p(o.instance_eval { foo })
  452. INPUT
  453. c = Class.new
  454. assert_raise(NameError) do
  455. c.instance_eval { attr_reader :"." }
  456. end
  457. end
  458. def test_undef
  459. assert_raise(SecurityError) do
  460. Thread.new do
  461. $SAFE = 4
  462. Class.instance_eval { undef_method(:foo) }
  463. end.join
  464. end
  465. c = Class.new
  466. assert_raise(NameError) do
  467. c.instance_eval { undef_method(:foo) }
  468. end
  469. m = Module.new
  470. assert_raise(NameError) do
  471. m.instance_eval { undef_method(:foo) }
  472. end
  473. o = Object.new
  474. assert_raise(NameError) do
  475. class << o; self; end.instance_eval { undef_method(:foo) }
  476. end
  477. %w(object_id __send__ initialize).each do |n|
  478. assert_in_out_err([], <<-INPUT, [], /warning: undefining `#{n}' may cause serious problems$/)
  479. $VERBOSE = false
  480. Class.new.instance_eval { undef_method(:#{n}) }
  481. INPUT
  482. end
  483. end
  484. def test_alias
  485. m = Module.new
  486. assert_raise(NameError) do
  487. m.class_eval { alias foo bar }
  488. end
  489. assert_in_out_err([], <<-INPUT, %w(2), /discarding old foo$/)
  490. $VERBOSE = true
  491. c = Class.new
  492. c.class_eval do
  493. def foo; 1; end
  494. def bar; 2; end
  495. end
  496. c.class_eval { alias foo bar }
  497. p c.new.foo
  498. INPUT
  499. end
  500. def test_mod_constants
  501. m = Module.new
  502. m.const_set(:Foo, :foo)
  503. assert_equal([:Foo], m.constants(true))
  504. assert_equal([:Foo], m.constants(false))
  505. m.instance_eval { remove_const(:Foo) }
  506. end
  507. def test_frozen_class
  508. m = Module.new
  509. m.freeze
  510. assert_raise(RuntimeError) do
  511. m.instance_eval { undef_method(:foo) }
  512. end
  513. c = Class.new
  514. c.freeze
  515. assert_raise(RuntimeError) do
  516. c.instance_eval { undef_method(:foo) }
  517. end
  518. o = Object.new
  519. c = class << o; self; end
  520. c.freeze
  521. assert_raise(RuntimeError) do
  522. c.instance_eval { undef_method(:foo) }
  523. end
  524. end
  525. def test_method_defined
  526. c = Class.new
  527. c.class_eval do
  528. def foo; end
  529. def bar; end
  530. def baz; end
  531. public :foo
  532. protected :bar
  533. private :baz
  534. end
  535. assert_equal(true, c.public_method_defined?(:foo))
  536. assert_equal(false, c.public_method_defined?(:bar))
  537. assert_equal(false, c.public_method_defined?(:baz))
  538. assert_equal(false, c.protected_method_defined?(:foo))
  539. assert_equal(true, c.protected_method_defined?(:bar))
  540. assert_equal(false, c.protected_method_defined?(:baz))
  541. assert_equal(false, c.private_method_defined?(:foo))
  542. assert_equal(false, c.private_method_defined?(:bar))
  543. assert_equal(true, c.private_method_defined?(:baz))
  544. end
  545. def test_change_visibility_under_safe4
  546. c = Class.new
  547. c.class_eval do
  548. def foo; end
  549. end
  550. assert_raise(SecurityError) do
  551. Thread.new do
  552. $SAFE = 4
  553. c.class_eval { private :foo }
  554. end.join
  555. end
  556. end
  557. def test_top_public_private
  558. assert_in_out_err([], <<-INPUT, %w([:foo] [:bar]), [])
  559. private
  560. def foo; :foo; end
  561. public
  562. def bar; :bar; end
  563. p self.private_methods.grep(/^foo$|^bar$/)
  564. p self.methods.grep(/^foo$|^bar$/)
  565. INPUT
  566. end
  567. def test_append_features
  568. t = nil
  569. m = Module.new
  570. m.module_eval do
  571. def foo; :foo; end
  572. end
  573. class << m; self; end.class_eval do
  574. define_method(:append_features) do |mod|
  575. t = mod
  576. super(mod)
  577. end
  578. end
  579. m2 = Module.new
  580. m2.module_eval { include(m) }
  581. assert_equal(m2, t)
  582. o = Object.new
  583. o.extend(m2)
  584. assert_equal(true, o.respond_to?(:foo))
  585. end
  586. def test_append_features_raise
  587. m = Module.new
  588. m.module_eval do
  589. def foo; :foo; end
  590. end
  591. class << m; self; end.class_eval do
  592. define_method(:append_features) {|mod| raise }
  593. end
  594. m2 = Module.new
  595. assert_raise(RuntimeError) do
  596. m2.module_eval { include(m) }
  597. end
  598. o = Object.new
  599. o.extend(m2)
  600. assert_equal(false, o.respond_to?(:foo))
  601. end
  602. def test_append_features_type_error
  603. assert_raise(TypeError) do
  604. Module.new.instance_eval { append_features(1) }
  605. end
  606. end
  607. def test_included
  608. m = Module.new
  609. m.module_eval do
  610. def foo; :foo; end
  611. end
  612. class << m; self; end.class_eval do
  613. define_method(:included) {|mod| raise }
  614. end
  615. m2 = Module.new
  616. assert_raise(RuntimeError) do
  617. m2.module_eval { include(m) }
  618. end
  619. o = Object.new
  620. o.extend(m2)
  621. assert_equal(true, o.respond_to?(:foo))
  622. end
  623. def test_cyclic_include
  624. m1 = Module.new
  625. m2 = Module.new
  626. m1.instance_eval { include(m2) }
  627. assert_raise(ArgumentError) do
  628. m2.instance_eval { include(m1) }
  629. end
  630. end
  631. def test_include_p
  632. m = Module.new
  633. c1 = Class.new
  634. c1.instance_eval { include(m) }
  635. c2 = Class.new(c1)
  636. assert_equal(true, c1.include?(m))
  637. assert_equal(true, c2.include?(m))
  638. assert_equal(false, m.include?(m))
  639. end
  640. def test_include_under_safe4
  641. m = Module.new
  642. c1 = Class.new
  643. assert_raise(SecurityError) do
  644. lambda {
  645. $SAFE = 4
  646. c1.instance_eval { include(m) }
  647. }.call
  648. end
  649. assert_nothing_raised do
  650. lambda {
  651. $SAFE = 4
  652. c2 = Class.new
  653. c2.instance_eval { include(m) }
  654. }.call
  655. end
  656. end
  657. def test_send
  658. a = AClass.new
  659. assert_equal(:aClass, a.__send__(:aClass))
  660. assert_equal(:aClass1, a.__send__(:aClass1))
  661. assert_equal(:aClass2, a.__send__(:aClass2))
  662. b = BClass.new
  663. assert_equal(:aClass, b.__send__(:aClass))
  664. assert_equal(:aClass1, b.__send__(:aClass1))
  665. assert_equal(:aClass2, b.__send__(:aClass2))
  666. assert_equal(:bClass1, b.__send__(:bClass1))
  667. assert_equal(:bClass2, b.__send__(:bClass2))
  668. assert_equal(:bClass3, b.__send__(:bClass3))
  669. end
  670. def test_nonascii_name
  671. c = eval("class ::C\u{df}; self; end")
  672. assert_equal("C\u{df}", c.name, '[ruby-core:24600]')
  673. c = eval("class C\u{df}; self; end")
  674. assert_equal("TestModule::C\u{df}", c.name, '[ruby-core:24600]')
  675. end
  676. def test_method_added
  677. memo = []
  678. mod = Module.new do
  679. mod = self
  680. (class << self ; self ; end).class_eval do
  681. define_method :method_added do |sym|
  682. memo << sym
  683. memo << mod.instance_methods(false)
  684. memo << (mod.instance_method(sym) rescue nil)
  685. end
  686. end
  687. def f
  688. end
  689. alias g f
  690. attr_reader :a
  691. attr_writer :a
  692. end
  693. assert_equal :f, memo.shift
  694. assert_equal [:f], memo.shift, '[ruby-core:25536]'
  695. assert_equal mod.instance_method(:f), memo.shift
  696. assert_equal :g, memo.shift
  697. assert_equal [:f, :g], memo.shift
  698. assert_equal mod.instance_method(:f), memo.shift
  699. assert_equal :a, memo.shift
  700. assert_equal [:f, :g, :a], memo.shift
  701. assert_equal mod.instance_method(:a), memo.shift
  702. assert_equal :a=, memo.shift
  703. assert_equal [:f, :g, :a, :a=], memo.shift
  704. assert_equal mod.instance_method(:a=), memo.shift
  705. end
  706. def test_method_redefinition
  707. feature2155 = '[ruby-dev:39400]'
  708. line = __LINE__+4
  709. stderr = EnvUtil.verbose_warning do
  710. Module.new do
  711. def foo; end
  712. def foo; end
  713. end
  714. end
  715. assert_match(/:#{line}: warning: method redefined; discarding old foo/, stderr)
  716. assert_match(/:#{line-1}: warning: previous definition of foo/, stderr, feature2155)
  717. stderr = EnvUtil.verbose_warning do
  718. Module.new do
  719. def foo; end
  720. alias bar foo
  721. def foo; end
  722. end
  723. end
  724. assert_equal("", stderr)
  725. stderr = EnvUtil.verbose_warning do
  726. Module.new do
  727. def foo; end
  728. alias bar foo
  729. alias bar foo
  730. end
  731. end
  732. assert_equal("", stderr)
  733. line = __LINE__+4
  734. stderr = EnvUtil.verbose_warning do
  735. Module.new do
  736. define_method(:foo) do end
  737. def foo; end
  738. end
  739. end
  740. assert_match(/:#{line}: warning: method redefined; discarding old foo/, stderr)
  741. assert_match(/:#{line-1}: warning: previous definition of foo/, stderr, feature2155)
  742. stderr = EnvUtil.verbose_warning do
  743. Module.new do
  744. define_method(:foo) do end
  745. alias bar foo
  746. alias barf oo
  747. end
  748. end
  749. assert_equal("", stderr)
  750. stderr = EnvUtil.verbose_warning do
  751. Module.new do
  752. module_function
  753. def foo; end
  754. module_function :foo
  755. end
  756. end
  757. assert_equal("", stderr, '[ruby-dev:39397]')
  758. stderr = EnvUtil.verbose_warning do
  759. Module.new do
  760. def foo; end
  761. undef foo
  762. end
  763. end
  764. assert_equal("", stderr)
  765. end
  766. def test_protected_singleton_method
  767. klass = Class.new
  768. x = klass.new
  769. class << x
  770. protected
  771. def foo
  772. end
  773. end
  774. assert_raise(NoMethodError) do
  775. x.foo
  776. end
  777. klass.send(:define_method, :bar) do
  778. x.foo
  779. end
  780. assert_nothing_raised do
  781. x.bar
  782. end
  783. y = klass.new
  784. assert_raise(NoMethodError) do
  785. y.bar
  786. end
  787. end
  788. end