PageRenderTime 34ms CodeModel.GetById 0ms RepoModel.GetById 0ms app.codeStats 0ms

/projects/jruby-1.7.3/test/externals/ruby1.9/ruby/test_module.rb

https://gitlab.com/essere.lab.public/qualitas.class-corpus
Ruby | 1223 lines | 1056 code | 161 blank | 6 comment | 3 complexity | a5748f200f071906d0995fbf9a699c17 MD5 | raw file
  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.reject {|c|
  63. name = c.name
  64. name.start_with?("Rake") or name.start_with?("FileUtils")
  65. }
  66. end
  67. def remove_minitest_mixins(list)
  68. list.reject {|c| c.to_s.start_with?("MiniTest") }
  69. end
  70. module Mixin
  71. MIXIN = 1
  72. def mixin
  73. end
  74. end
  75. module User
  76. USER = 2
  77. include Mixin
  78. def user
  79. end
  80. end
  81. module Other
  82. def other
  83. end
  84. end
  85. class AClass
  86. def AClass.cm1
  87. "cm1"
  88. end
  89. def AClass.cm2
  90. cm1 + "cm2" + cm3
  91. end
  92. def AClass.cm3
  93. "cm3"
  94. end
  95. private_class_method :cm1, "cm3"
  96. def aClass
  97. :aClass
  98. end
  99. def aClass1
  100. :aClass1
  101. end
  102. def aClass2
  103. :aClass2
  104. end
  105. private :aClass1
  106. protected :aClass2
  107. end
  108. class BClass < AClass
  109. def bClass1
  110. :bClass1
  111. end
  112. private
  113. def bClass2
  114. :bClass2
  115. end
  116. protected
  117. def bClass3
  118. :bClass3
  119. end
  120. end
  121. class CClass < BClass
  122. def self.cClass
  123. end
  124. end
  125. MyClass = AClass.clone
  126. class MyClass
  127. public_class_method :cm1
  128. end
  129. # -----------------------------------------------------------
  130. def test_CMP # '<=>'
  131. assert_equal( 0, Mixin <=> Mixin)
  132. assert_equal(-1, User <=> Mixin)
  133. assert_equal( 1, Mixin <=> User)
  134. assert_equal( 0, Object <=> Object)
  135. assert_equal(-1, String <=> Object)
  136. assert_equal( 1, Object <=> String)
  137. end
  138. def test_GE # '>='
  139. assert(Mixin >= User)
  140. assert(Mixin >= Mixin)
  141. assert(!(User >= Mixin))
  142. assert(Object >= String)
  143. assert(String >= String)
  144. assert(!(String >= Object))
  145. end
  146. def test_GT # '>'
  147. assert(Mixin > User)
  148. assert(!(Mixin > Mixin))
  149. assert(!(User > Mixin))
  150. assert(Object > String)
  151. assert(!(String > String))
  152. assert(!(String > Object))
  153. end
  154. def test_LE # '<='
  155. assert(User <= Mixin)
  156. assert(Mixin <= Mixin)
  157. assert(!(Mixin <= User))
  158. assert(String <= Object)
  159. assert(String <= String)
  160. assert(!(Object <= String))
  161. end
  162. def test_LT # '<'
  163. assert(User < Mixin)
  164. assert(!(Mixin < Mixin))
  165. assert(!(Mixin < User))
  166. assert(String < Object)
  167. assert(!(String < String))
  168. assert(!(Object < String))
  169. end
  170. def test_VERY_EQUAL # '==='
  171. assert(Object === self)
  172. assert(Test::Unit::TestCase === self)
  173. assert(TestModule === self)
  174. assert(!(String === self))
  175. end
  176. def test_ancestors
  177. assert_equal([User, Mixin], User.ancestors)
  178. assert_equal([Mixin], Mixin.ancestors)
  179. assert_equal([Object, Kernel, BasicObject],
  180. remove_minitest_mixins(remove_rake_mixins(remove_json_mixins(remove_pp_mixins(Object.ancestors)))))
  181. assert_equal([String, Comparable, Object, Kernel, BasicObject],
  182. remove_minitest_mixins(remove_rake_mixins(remove_json_mixins(remove_pp_mixins(String.ancestors)))))
  183. end
  184. CLASS_EVAL = 2
  185. @@class_eval = 'b'
  186. def test_class_eval
  187. Other.class_eval("CLASS_EVAL = 1")
  188. assert_equal(1, Other::CLASS_EVAL)
  189. assert(Other.constants.include?(:CLASS_EVAL))
  190. assert_equal(2, Other.class_eval { CLASS_EVAL })
  191. Other.class_eval("@@class_eval = 'a'")
  192. assert_equal('a', Other.class_variable_get(:@@class_eval))
  193. assert_equal('b', Other.class_eval { @@class_eval })
  194. Other.class_eval do
  195. module_function
  196. def class_eval_test
  197. "foo"
  198. end
  199. end
  200. assert_equal("foo", Other.class_eval_test)
  201. assert_equal([Other], Other.class_eval { |*args| args })
  202. end
  203. def test_const_defined?
  204. assert(Math.const_defined?(:PI))
  205. assert(Math.const_defined?("PI"))
  206. assert(!Math.const_defined?(:IP))
  207. assert(!Math.const_defined?("IP"))
  208. end
  209. def test_const_get
  210. assert_equal(Math::PI, Math.const_get("PI"))
  211. assert_equal(Math::PI, Math.const_get(:PI))
  212. end
  213. def test_const_set
  214. assert(!Other.const_defined?(:KOALA))
  215. Other.const_set(:KOALA, 99)
  216. assert(Other.const_defined?(:KOALA))
  217. assert_equal(99, Other::KOALA)
  218. Other.const_set("WOMBAT", "Hi")
  219. assert_equal("Hi", Other::WOMBAT)
  220. end
  221. def test_constants
  222. assert_equal([:MIXIN], Mixin.constants)
  223. assert_equal([:MIXIN, :USER], User.constants.sort)
  224. end
  225. def test_included_modules
  226. assert_equal([], Mixin.included_modules)
  227. assert_equal([Mixin], User.included_modules)
  228. assert_equal([Kernel],
  229. remove_minitest_mixins(remove_rake_mixins(remove_json_mixins(remove_pp_mixins(Object.included_modules)))))
  230. assert_equal([Comparable, Kernel],
  231. remove_minitest_mixins(remove_rake_mixins(remove_json_mixins(remove_pp_mixins(String.included_modules)))))
  232. end
  233. def test_instance_methods
  234. assert_equal([:user], User.instance_methods(false))
  235. assert_equal([:user, :mixin].sort, User.instance_methods(true).sort)
  236. assert_equal([:mixin], Mixin.instance_methods)
  237. assert_equal([:mixin], Mixin.instance_methods(true))
  238. assert_equal([:cClass], (class << CClass; self; end).instance_methods(false))
  239. assert_equal([], (class << BClass; self; end).instance_methods(false))
  240. assert_equal([:cm2], (class << AClass; self; end).instance_methods(false))
  241. # Ruby 1.8 feature change:
  242. # #instance_methods includes protected methods.
  243. #assert_equal([:aClass], AClass.instance_methods(false))
  244. assert_equal([:aClass, :aClass2], AClass.instance_methods(false).sort)
  245. assert_equal([:aClass, :aClass2],
  246. (AClass.instance_methods(true) - Object.instance_methods(true)).sort)
  247. end
  248. def test_method_defined?
  249. assert_method_not_defined?(User, :wombat)
  250. assert_method_defined?(User, :user)
  251. assert_method_defined?(User, :mixin)
  252. assert_method_not_defined?(User, :wombat)
  253. assert_method_defined?(User, :user)
  254. assert_method_defined?(User, :mixin)
  255. end
  256. def module_exec_aux
  257. Proc.new do
  258. def dynamically_added_method_3; end
  259. end
  260. end
  261. def module_exec_aux_2(&block)
  262. User.module_exec(&block)
  263. end
  264. def test_module_exec
  265. User.module_exec do
  266. def dynamically_added_method_1; end
  267. end
  268. assert_method_defined?(User, :dynamically_added_method_1)
  269. block = Proc.new do
  270. def dynamically_added_method_2; end
  271. end
  272. User.module_exec(&block)
  273. assert_method_defined?(User, :dynamically_added_method_2)
  274. User.module_exec(&module_exec_aux)
  275. assert_method_defined?(User, :dynamically_added_method_3)
  276. module_exec_aux_2 do
  277. def dynamically_added_method_4; end
  278. end
  279. assert_method_defined?(User, :dynamically_added_method_4)
  280. end
  281. def test_module_eval
  282. User.module_eval("MODULE_EVAL = 1")
  283. assert_equal(1, User::MODULE_EVAL)
  284. assert(User.constants.include?(:MODULE_EVAL))
  285. User.instance_eval("remove_const(:MODULE_EVAL)")
  286. assert(!User.constants.include?(:MODULE_EVAL))
  287. end
  288. def test_name
  289. assert_equal("Fixnum", Fixnum.name)
  290. assert_equal("TestModule::Mixin", Mixin.name)
  291. assert_equal("TestModule::User", User.name)
  292. end
  293. def test_private_class_method
  294. assert_raise(ExpectedException) { AClass.cm1 }
  295. assert_raise(ExpectedException) { AClass.cm3 }
  296. assert_equal("cm1cm2cm3", AClass.cm2)
  297. end
  298. def test_private_instance_methods
  299. assert_equal([:aClass1], AClass.private_instance_methods(false))
  300. assert_equal([:bClass2], BClass.private_instance_methods(false))
  301. assert_equal([:aClass1, :bClass2],
  302. (BClass.private_instance_methods(true) -
  303. Object.private_instance_methods(true)).sort)
  304. end
  305. def test_protected_instance_methods
  306. assert_equal([:aClass2], AClass.protected_instance_methods)
  307. assert_equal([:bClass3], BClass.protected_instance_methods(false))
  308. assert_equal([:bClass3, :aClass2].sort,
  309. (BClass.protected_instance_methods(true) -
  310. Object.protected_instance_methods(true)).sort)
  311. end
  312. def test_public_class_method
  313. assert_equal("cm1", MyClass.cm1)
  314. assert_equal("cm1cm2cm3", MyClass.cm2)
  315. assert_raise(ExpectedException) { eval "MyClass.cm3" }
  316. end
  317. def test_public_instance_methods
  318. assert_equal([:aClass], AClass.public_instance_methods(false))
  319. assert_equal([:bClass1], BClass.public_instance_methods(false))
  320. end
  321. def test_s_constants
  322. c1 = Module.constants
  323. Object.module_eval "WALTER = 99"
  324. c2 = Module.constants
  325. assert_equal([:WALTER], c2 - c1)
  326. assert_equal([], Module.constants(true))
  327. assert_equal([], Module.constants(false))
  328. src = <<-INPUT
  329. ary = Module.constants
  330. module M
  331. WALTER = 99
  332. end
  333. class Module
  334. include M
  335. end
  336. p Module.constants - ary, Module.constants(true), Module.constants(false)
  337. INPUT
  338. assert_in_out_err([], src, %w([:M] [:WALTER] []), [])
  339. klass = Class.new do
  340. const_set(:X, 123)
  341. end
  342. assert_equal(false, klass.class_eval { Module.constants }.include?(:X))
  343. end
  344. module M1
  345. $m1 = Module.nesting
  346. module M2
  347. $m2 = Module.nesting
  348. end
  349. end
  350. def test_s_nesting
  351. assert_equal([], $m0)
  352. assert_equal([TestModule::M1, TestModule], $m1)
  353. assert_equal([TestModule::M1::M2,
  354. TestModule::M1, TestModule], $m2)
  355. end
  356. def test_s_new
  357. m = Module.new
  358. assert_instance_of(Module, m)
  359. end
  360. def test_freeze
  361. m = Module.new
  362. m.freeze
  363. assert_raise(RuntimeError) do
  364. m.module_eval do
  365. def foo; end
  366. end
  367. end
  368. end
  369. def test_attr_obsoleted_flag
  370. c = Class.new
  371. c.class_eval do
  372. def initialize
  373. @foo = :foo
  374. @bar = :bar
  375. end
  376. attr :foo, true
  377. attr :bar, false
  378. end
  379. o = c.new
  380. assert_equal(true, o.respond_to?(:foo))
  381. assert_equal(true, o.respond_to?(:foo=))
  382. assert_equal(true, o.respond_to?(:bar))
  383. assert_equal(false, o.respond_to?(:bar=))
  384. end
  385. def test_const_get_evaled
  386. c1 = Class.new
  387. c2 = Class.new(c1)
  388. eval("c1::Foo = :foo")
  389. assert_equal(:foo, c1::Foo)
  390. assert_equal(:foo, c2::Foo)
  391. assert_equal(:foo, c2.const_get(:Foo))
  392. assert_raise(NameError) { c2.const_get(:Foo, false) }
  393. eval("c1::Foo = :foo")
  394. assert_raise(NameError) { c1::Bar }
  395. assert_raise(NameError) { c2::Bar }
  396. assert_raise(NameError) { c2.const_get(:Bar) }
  397. assert_raise(NameError) { c2.const_get(:Bar, false) }
  398. c1.instance_eval do
  399. def const_missing(x)
  400. x
  401. end
  402. end
  403. assert_equal(:Bar, c1::Bar)
  404. assert_equal(:Bar, c2::Bar)
  405. assert_equal(:Bar, c2.const_get(:Bar))
  406. assert_equal(:Bar, c2.const_get(:Bar, false))
  407. assert_raise(NameError) { c1.const_get(:foo) }
  408. end
  409. def test_const_set_invalid_name
  410. c1 = Class.new
  411. assert_raise(NameError) { c1.const_set(:foo, :foo) }
  412. end
  413. def test_const_get_invalid_name
  414. c1 = Class.new
  415. assert_raise(NameError) { c1.const_defined?(:foo) }
  416. end
  417. def test_const_get_no_inherited
  418. bug3422 = '[ruby-core:30719]'
  419. assert_in_out_err([], <<-INPUT, %w[1 NameError A], [], bug3422)
  420. BasicObject::A = 1
  421. puts [true, false].map {|inh|
  422. begin
  423. Object.const_get(:A, inh)
  424. rescue NameError => e
  425. [e.class, e.name]
  426. end
  427. }
  428. INPUT
  429. end
  430. def test_const_get_inherited
  431. bug3423 = '[ruby-core:30720]'
  432. assert_in_out_err([], <<-INPUT, %w[NameError A NameError A], [], bug3423)
  433. module Foo; A = 1; end
  434. class Object; include Foo; end
  435. class Bar; include Foo; end
  436. puts [Object, Bar].map {|klass|
  437. begin
  438. klass.const_get(:A, false)
  439. rescue NameError => e
  440. [e.class, e.name]
  441. end
  442. }
  443. INPUT
  444. end
  445. def test_const_in_module
  446. bug3423 = '[ruby-core:37698]'
  447. assert_in_out_err([], <<-INPUT, %w[ok], [], bug3423)
  448. module LangModuleSpecInObject
  449. module LangModuleTop
  450. end
  451. end
  452. include LangModuleSpecInObject
  453. module LangModuleTop
  454. end
  455. puts "ok" if LangModuleSpecInObject::LangModuleTop == LangModuleTop
  456. INPUT
  457. bug5264 = '[ruby-core:39227]'
  458. assert_in_out_err([], <<-'INPUT', [], [], bug5264)
  459. class A
  460. class X; end
  461. end
  462. class B < A
  463. module X; end
  464. end
  465. INPUT
  466. end
  467. def test_class_variable_get
  468. c = Class.new
  469. c.class_eval('@@foo = :foo')
  470. assert_equal(:foo, c.class_variable_get(:@@foo))
  471. assert_raise(NameError) { c.class_variable_get(:@@bar) } # c.f. instance_variable_get
  472. assert_raise(NameError) { c.class_variable_get(:foo) }
  473. end
  474. def test_class_variable_set
  475. c = Class.new
  476. c.class_variable_set(:@@foo, :foo)
  477. assert_equal(:foo, c.class_eval('@@foo'))
  478. assert_raise(NameError) { c.class_variable_set(:foo, 1) }
  479. end
  480. def test_class_variable_defined
  481. c = Class.new
  482. c.class_eval('@@foo = :foo')
  483. assert_equal(true, c.class_variable_defined?(:@@foo))
  484. assert_equal(false, c.class_variable_defined?(:@@bar))
  485. assert_raise(NameError) { c.class_variable_defined?(:foo) }
  486. end
  487. def test_remove_class_variable
  488. c = Class.new
  489. c.class_eval('@@foo = :foo')
  490. c.class_eval { remove_class_variable(:@@foo) }
  491. assert_equal(false, c.class_variable_defined?(:@@foo))
  492. end
  493. def test_export_method
  494. m = Module.new
  495. assert_raise(NameError) do
  496. m.instance_eval { public(:foo) }
  497. end
  498. end
  499. def test_attr
  500. assert_in_out_err([], <<-INPUT, %w(:ok nil), /warning: private attribute\?$/)
  501. $VERBOSE = true
  502. c = Class.new
  503. c.instance_eval do
  504. private
  505. attr_reader :foo
  506. end
  507. o = c.new
  508. o.foo rescue p(:ok)
  509. p(o.instance_eval { foo })
  510. INPUT
  511. c = Class.new
  512. assert_raise(NameError) do
  513. c.instance_eval { attr_reader :"." }
  514. end
  515. end
  516. def test_undef
  517. assert_raise(SecurityError) do
  518. Thread.new do
  519. $SAFE = 4
  520. Class.instance_eval { undef_method(:foo) }
  521. end.join
  522. end
  523. c = Class.new
  524. assert_raise(NameError) do
  525. c.instance_eval { undef_method(:foo) }
  526. end
  527. m = Module.new
  528. assert_raise(NameError) do
  529. m.instance_eval { undef_method(:foo) }
  530. end
  531. o = Object.new
  532. assert_raise(NameError) do
  533. class << o; self; end.instance_eval { undef_method(:foo) }
  534. end
  535. %w(object_id __send__ initialize).each do |n|
  536. assert_in_out_err([], <<-INPUT, [], /warning: undefining `#{n}' may cause serious problems$/)
  537. $VERBOSE = false
  538. Class.new.instance_eval { undef_method(:#{n}) }
  539. INPUT
  540. end
  541. end
  542. def test_alias
  543. m = Module.new
  544. assert_raise(NameError) do
  545. m.class_eval { alias foo bar }
  546. end
  547. assert_in_out_err([], <<-INPUT, %w(2), /discarding old foo$/)
  548. $VERBOSE = true
  549. c = Class.new
  550. c.class_eval do
  551. def foo; 1; end
  552. def bar; 2; end
  553. end
  554. c.class_eval { alias foo bar }
  555. p c.new.foo
  556. INPUT
  557. end
  558. def test_mod_constants
  559. m = Module.new
  560. m.const_set(:Foo, :foo)
  561. assert_equal([:Foo], m.constants(true))
  562. assert_equal([:Foo], m.constants(false))
  563. m.instance_eval { remove_const(:Foo) }
  564. end
  565. def test_frozen_class
  566. m = Module.new
  567. m.freeze
  568. assert_raise(RuntimeError) do
  569. m.instance_eval { undef_method(:foo) }
  570. end
  571. c = Class.new
  572. c.freeze
  573. assert_raise(RuntimeError) do
  574. c.instance_eval { undef_method(:foo) }
  575. end
  576. o = Object.new
  577. c = class << o; self; end
  578. c.freeze
  579. assert_raise(RuntimeError) do
  580. c.instance_eval { undef_method(:foo) }
  581. end
  582. end
  583. def test_method_defined
  584. c = Class.new
  585. c.class_eval do
  586. def foo; end
  587. def bar; end
  588. def baz; end
  589. public :foo
  590. protected :bar
  591. private :baz
  592. end
  593. assert_equal(true, c.public_method_defined?(:foo))
  594. assert_equal(false, c.public_method_defined?(:bar))
  595. assert_equal(false, c.public_method_defined?(:baz))
  596. assert_equal(false, c.protected_method_defined?(:foo))
  597. assert_equal(true, c.protected_method_defined?(:bar))
  598. assert_equal(false, c.protected_method_defined?(:baz))
  599. assert_equal(false, c.private_method_defined?(:foo))
  600. assert_equal(false, c.private_method_defined?(:bar))
  601. assert_equal(true, c.private_method_defined?(:baz))
  602. end
  603. def test_change_visibility_under_safe4
  604. c = Class.new
  605. c.class_eval do
  606. def foo; end
  607. end
  608. assert_raise(SecurityError) do
  609. Thread.new do
  610. $SAFE = 4
  611. c.class_eval { private :foo }
  612. end.join
  613. end
  614. end
  615. def test_top_public_private
  616. assert_in_out_err([], <<-INPUT, %w([:foo] [:bar]), [])
  617. private
  618. def foo; :foo; end
  619. public
  620. def bar; :bar; end
  621. p self.private_methods.grep(/^foo$|^bar$/)
  622. p self.methods.grep(/^foo$|^bar$/)
  623. INPUT
  624. end
  625. def test_append_features
  626. t = nil
  627. m = Module.new
  628. m.module_eval do
  629. def foo; :foo; end
  630. end
  631. class << m; self; end.class_eval do
  632. define_method(:append_features) do |mod|
  633. t = mod
  634. super(mod)
  635. end
  636. end
  637. m2 = Module.new
  638. m2.module_eval { include(m) }
  639. assert_equal(m2, t)
  640. o = Object.new
  641. o.extend(m2)
  642. assert_equal(true, o.respond_to?(:foo))
  643. end
  644. def test_append_features_raise
  645. m = Module.new
  646. m.module_eval do
  647. def foo; :foo; end
  648. end
  649. class << m; self; end.class_eval do
  650. define_method(:append_features) {|mod| raise }
  651. end
  652. m2 = Module.new
  653. assert_raise(RuntimeError) do
  654. m2.module_eval { include(m) }
  655. end
  656. o = Object.new
  657. o.extend(m2)
  658. assert_equal(false, o.respond_to?(:foo))
  659. end
  660. def test_append_features_type_error
  661. assert_raise(TypeError) do
  662. Module.new.instance_eval { append_features(1) }
  663. end
  664. end
  665. def test_included
  666. m = Module.new
  667. m.module_eval do
  668. def foo; :foo; end
  669. end
  670. class << m; self; end.class_eval do
  671. define_method(:included) {|mod| raise }
  672. end
  673. m2 = Module.new
  674. assert_raise(RuntimeError) do
  675. m2.module_eval { include(m) }
  676. end
  677. o = Object.new
  678. o.extend(m2)
  679. assert_equal(true, o.respond_to?(:foo))
  680. end
  681. def test_cyclic_include
  682. m1 = Module.new
  683. m2 = Module.new
  684. m1.instance_eval { include(m2) }
  685. assert_raise(ArgumentError) do
  686. m2.instance_eval { include(m1) }
  687. end
  688. end
  689. def test_include_p
  690. m = Module.new
  691. c1 = Class.new
  692. c1.instance_eval { include(m) }
  693. c2 = Class.new(c1)
  694. assert_equal(true, c1.include?(m))
  695. assert_equal(true, c2.include?(m))
  696. assert_equal(false, m.include?(m))
  697. end
  698. def test_include_under_safe4
  699. m = Module.new
  700. c1 = Class.new
  701. assert_raise(SecurityError) do
  702. lambda {
  703. $SAFE = 4
  704. c1.instance_eval { include(m) }
  705. }.call
  706. end
  707. assert_nothing_raised do
  708. lambda {
  709. $SAFE = 4
  710. c2 = Class.new
  711. c2.instance_eval { include(m) }
  712. }.call
  713. end
  714. end
  715. def test_send
  716. a = AClass.new
  717. assert_equal(:aClass, a.__send__(:aClass))
  718. assert_equal(:aClass1, a.__send__(:aClass1))
  719. assert_equal(:aClass2, a.__send__(:aClass2))
  720. b = BClass.new
  721. assert_equal(:aClass, b.__send__(:aClass))
  722. assert_equal(:aClass1, b.__send__(:aClass1))
  723. assert_equal(:aClass2, b.__send__(:aClass2))
  724. assert_equal(:bClass1, b.__send__(:bClass1))
  725. assert_equal(:bClass2, b.__send__(:bClass2))
  726. assert_equal(:bClass3, b.__send__(:bClass3))
  727. end
  728. def test_nonascii_name
  729. c = eval("class ::C\u{df}; self; end")
  730. assert_equal("C\u{df}", c.name, '[ruby-core:24600]')
  731. c = eval("class C\u{df}; self; end")
  732. assert_equal("TestModule::C\u{df}", c.name, '[ruby-core:24600]')
  733. end
  734. def test_method_added
  735. memo = []
  736. mod = Module.new do
  737. mod = self
  738. (class << self ; self ; end).class_eval do
  739. define_method :method_added do |sym|
  740. memo << sym
  741. memo << mod.instance_methods(false)
  742. memo << (mod.instance_method(sym) rescue nil)
  743. end
  744. end
  745. def f
  746. end
  747. alias g f
  748. attr_reader :a
  749. attr_writer :a
  750. end
  751. assert_equal :f, memo.shift
  752. assert_equal [:f], memo.shift, '[ruby-core:25536]'
  753. assert_equal mod.instance_method(:f), memo.shift
  754. assert_equal :g, memo.shift
  755. assert_equal [:f, :g], memo.shift
  756. assert_equal mod.instance_method(:f), memo.shift
  757. assert_equal :a, memo.shift
  758. assert_equal [:f, :g, :a], memo.shift
  759. assert_equal mod.instance_method(:a), memo.shift
  760. assert_equal :a=, memo.shift
  761. assert_equal [:f, :g, :a, :a=], memo.shift
  762. assert_equal mod.instance_method(:a=), memo.shift
  763. end
  764. def test_method_undefined
  765. added = []
  766. undefed = []
  767. removed = []
  768. mod = Module.new do
  769. mod = self
  770. def f
  771. end
  772. (class << self ; self ; end).class_eval do
  773. define_method :method_added do |sym|
  774. added << sym
  775. end
  776. define_method :method_undefined do |sym|
  777. undefed << sym
  778. end
  779. define_method :method_removed do |sym|
  780. removed << sym
  781. end
  782. end
  783. end
  784. assert_method_defined?(mod, :f)
  785. mod.module_eval do
  786. undef :f
  787. end
  788. assert_equal [], added
  789. assert_equal [:f], undefed
  790. assert_equal [], removed
  791. end
  792. def test_method_removed
  793. added = []
  794. undefed = []
  795. removed = []
  796. mod = Module.new do
  797. mod = self
  798. def f
  799. end
  800. (class << self ; self ; end).class_eval do
  801. define_method :method_added do |sym|
  802. added << sym
  803. end
  804. define_method :method_undefined do |sym|
  805. undefed << sym
  806. end
  807. define_method :method_removed do |sym|
  808. removed << sym
  809. end
  810. end
  811. end
  812. assert_method_defined?(mod, :f)
  813. mod.module_eval do
  814. remove_method :f
  815. end
  816. assert_equal [], added
  817. assert_equal [], undefed
  818. assert_equal [:f], removed
  819. end
  820. def test_method_redefinition
  821. feature2155 = '[ruby-dev:39400]'
  822. line = __LINE__+4
  823. stderr = EnvUtil.verbose_warning do
  824. Module.new do
  825. def foo; end
  826. def foo; end
  827. end
  828. end
  829. assert_match(/:#{line}: warning: method redefined; discarding old foo/, stderr)
  830. assert_match(/:#{line-1}: warning: previous definition of foo/, stderr, feature2155)
  831. stderr = EnvUtil.verbose_warning do
  832. Module.new do
  833. def foo; end
  834. alias bar foo
  835. def foo; end
  836. end
  837. end
  838. assert_equal("", stderr)
  839. stderr = EnvUtil.verbose_warning do
  840. Module.new do
  841. def foo; end
  842. alias bar foo
  843. alias bar foo
  844. end
  845. end
  846. assert_equal("", stderr)
  847. line = __LINE__+4
  848. stderr = EnvUtil.verbose_warning do
  849. Module.new do
  850. define_method(:foo) do end
  851. def foo; end
  852. end
  853. end
  854. assert_match(/:#{line}: warning: method redefined; discarding old foo/, stderr)
  855. assert_match(/:#{line-1}: warning: previous definition of foo/, stderr, feature2155)
  856. stderr = EnvUtil.verbose_warning do
  857. Module.new do
  858. define_method(:foo) do end
  859. alias bar foo
  860. alias barf oo
  861. end
  862. end
  863. assert_equal("", stderr)
  864. stderr = EnvUtil.verbose_warning do
  865. Module.new do
  866. module_function
  867. def foo; end
  868. module_function :foo
  869. end
  870. end
  871. assert_equal("", stderr, '[ruby-dev:39397]')
  872. stderr = EnvUtil.verbose_warning do
  873. Module.new do
  874. def foo; end
  875. undef foo
  876. end
  877. end
  878. assert_equal("", stderr)
  879. end
  880. def test_protected_singleton_method
  881. klass = Class.new
  882. x = klass.new
  883. class << x
  884. protected
  885. def foo
  886. end
  887. end
  888. assert_raise(NoMethodError) do
  889. x.foo
  890. end
  891. klass.send(:define_method, :bar) do
  892. x.foo
  893. end
  894. assert_nothing_raised do
  895. x.bar
  896. end
  897. y = klass.new
  898. assert_raise(NoMethodError) do
  899. y.bar
  900. end
  901. end
  902. def test_uninitialized_toplevel_constant
  903. bug3123 = '[ruby-dev:40951]'
  904. e = assert_raise(NameError) {eval("Bug3123", TOPLEVEL_BINDING)}
  905. assert_not_match(/Object::/, e.message, bug3123)
  906. end
  907. def test_attr_inherited_visibility
  908. bug3406 = '[ruby-core:30638]'
  909. c = Class.new do
  910. class << self
  911. private
  912. def attr_accessor(*); super; end
  913. end
  914. attr_accessor :x
  915. end.new
  916. assert_nothing_raised(bug3406) {c.x = 1}
  917. assert_equal(1, c.x, bug3406)
  918. end
  919. def test_private_constant
  920. c = Class.new
  921. c.const_set(:FOO, "foo")
  922. assert_equal("foo", c::FOO)
  923. c.private_constant(:FOO)
  924. assert_raise(NameError) { c::FOO }
  925. assert_equal("foo", c.class_eval("FOO"))
  926. assert_equal("foo", c.const_get("FOO"))
  927. $VERBOSE, verbose = nil, $VERBOSE
  928. c.const_set(:FOO, "foo")
  929. $VERBOSE = verbose
  930. assert_raise(NameError) { c::FOO }
  931. end
  932. def test_private_constant2
  933. c = Class.new
  934. c.const_set(:FOO, "foo")
  935. c.const_set(:BAR, "bar")
  936. assert_equal("foo", c::FOO)
  937. assert_equal("bar", c::BAR)
  938. c.private_constant(:FOO, :BAR)
  939. assert_raise(NameError) { c::FOO }
  940. assert_raise(NameError) { c::BAR }
  941. assert_equal("foo", c.class_eval("FOO"))
  942. assert_equal("bar", c.class_eval("BAR"))
  943. end
  944. class PrivateClass
  945. end
  946. private_constant :PrivateClass
  947. def test_define_module_under_private_constant
  948. assert_raise(NameError) do
  949. eval %q{class TestModule::PrivateClass; end}
  950. end
  951. assert_raise(NameError) do
  952. eval %q{module TestModule::PrivateClass::TestModule; end}
  953. end
  954. eval %q{class PrivateClass; end}
  955. eval %q{module PrivateClass::TestModule; end}
  956. assert_instance_of(Module, PrivateClass::TestModule)
  957. PrivateClass.class_eval { remove_const(:TestModule) }
  958. end
  959. def test_public_constant
  960. c = Class.new
  961. c.const_set(:FOO, "foo")
  962. assert_equal("foo", c::FOO)
  963. c.private_constant(:FOO)
  964. assert_raise(NameError) { c::FOO }
  965. assert_equal("foo", c.class_eval("FOO"))
  966. c.public_constant(:FOO)
  967. assert_equal("foo", c::FOO)
  968. end
  969. def test_constants_with_private_constant
  970. assert(!(::TestModule).constants.include?(:PrivateClass))
  971. end
  972. def test_toplevel_private_constant
  973. src = <<-INPUT
  974. class Object
  975. private_constant :Object
  976. end
  977. p Object
  978. begin
  979. p ::Object
  980. rescue
  981. p :ok
  982. end
  983. INPUT
  984. assert_in_out_err([], src, %w(Object :ok), [])
  985. end
  986. def test_private_constants_clear_inlinecache
  987. bug5702 = '[ruby-dev:44929]'
  988. src = <<-INPUT
  989. class A
  990. C = :Const
  991. def self.get_C
  992. A::C
  993. end
  994. # fill cache
  995. A.get_C
  996. private_constant :C, :D rescue nil
  997. begin
  998. A.get_C
  999. rescue NameError
  1000. puts "A.get_C"
  1001. end
  1002. end
  1003. INPUT
  1004. assert_in_out_err([], src, %w(A.get_C), [], bug5702)
  1005. end
  1006. def test_constant_lookup_in_method_defined_by_class_eval
  1007. src = <<-INPUT
  1008. class A
  1009. B = 42
  1010. end
  1011. A.class_eval do
  1012. def self.f
  1013. B
  1014. end
  1015. def f
  1016. B
  1017. end
  1018. end
  1019. begin
  1020. A.f
  1021. rescue NameError
  1022. puts "A.f"
  1023. end
  1024. begin
  1025. A.new.f
  1026. rescue NameError
  1027. puts "A.new.f"
  1028. end
  1029. INPUT
  1030. assert_in_out_err([], src, %w(A.f A.new.f), [])
  1031. end
  1032. def test_constant_lookup_in_toplevel_class_eval
  1033. src = <<-INPUT
  1034. module X
  1035. A = 123
  1036. end
  1037. begin
  1038. X.class_eval { A }
  1039. rescue NameError => e
  1040. puts e
  1041. end
  1042. INPUT
  1043. assert_in_out_err([], src, ["uninitialized constant A"], [])
  1044. end
  1045. def test_constant_lookup_in_module_in_class_eval
  1046. src = <<-INPUT
  1047. class A
  1048. B = 42
  1049. end
  1050. A.class_eval do
  1051. module C
  1052. begin
  1053. B
  1054. rescue NameError
  1055. puts "NameError"
  1056. end
  1057. end
  1058. end
  1059. INPUT
  1060. assert_in_out_err([], src, ["NameError"], [])
  1061. end
  1062. end