PageRenderTime 139ms CodeModel.GetById 25ms RepoModel.GetById 6ms app.codeStats 0ms

/test/ruby/test_method.rb

http://github.com/ruby/ruby
Ruby | 1290 lines | 1129 code | 147 blank | 14 comment | 21 complexity | f88b2a8edd1ec6af5d79ffcc30785292 MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause, AGPL-3.0
  1. # -*- coding: us-ascii -*-
  2. # frozen_string_literal: false
  3. require 'test/unit'
  4. class TestMethod < Test::Unit::TestCase
  5. def setup
  6. @verbose = $VERBOSE
  7. $VERBOSE = nil
  8. end
  9. def teardown
  10. $VERBOSE = @verbose
  11. end
  12. def m0() end
  13. def m1(a) end
  14. def m2(a, b) end
  15. def mo1(a = nil, &b) end
  16. def mo2(a, b = nil) end
  17. def mo3(*a) end
  18. def mo4(a, *b, &c) end
  19. def mo5(a, *b, c) end
  20. def mo6(a, *b, c, &d) end
  21. def mo7(a, b = nil, *c, d, &e) end
  22. def mo8(a, b = nil, *, d, &e) end
  23. def ma1((a), &b) nil && a end
  24. def mk1(**) end
  25. def mk2(**o) nil && o end
  26. def mk3(a, **o) nil && o end
  27. def mk4(a = nil, **o) nil && o end
  28. def mk5(a, b = nil, **o) nil && o end
  29. def mk6(a, b = nil, c, **o) nil && o end
  30. def mk7(a, b = nil, *c, d, **o) nil && o end
  31. def mk8(a, b = nil, *c, d, e:, f: nil, **o) nil && o end
  32. def mnk(**nil) end
  33. def mf(...) end
  34. class Base
  35. def foo() :base end
  36. end
  37. class Derived < Base
  38. def foo() :derived end
  39. end
  40. class T
  41. def initialize; end
  42. def initialize_copy(*) super end
  43. def initialize_clone(*) super end
  44. def initialize_dup(*) super end
  45. def respond_to_missing?(*) super end
  46. def normal_method; end
  47. end
  48. module M
  49. def func; end
  50. module_function :func
  51. def meth; :meth end
  52. end
  53. def mv1() end
  54. def mv2() end
  55. private :mv2
  56. def mv3() end
  57. protected :mv3
  58. class Visibility
  59. def mv1() end
  60. def mv2() end
  61. private :mv2
  62. def mv3() end
  63. protected :mv3
  64. end
  65. def test_arity
  66. assert_equal(0, method(:m0).arity)
  67. assert_equal(1, method(:m1).arity)
  68. assert_equal(2, method(:m2).arity)
  69. assert_equal(-1, method(:mo1).arity)
  70. assert_equal(-2, method(:mo2).arity)
  71. assert_equal(-1, method(:mo3).arity)
  72. assert_equal(-2, method(:mo4).arity)
  73. assert_equal(-3, method(:mo5).arity)
  74. assert_equal(-3, method(:mo6).arity)
  75. assert_equal(-1, method(:mk1).arity)
  76. assert_equal(-1, method(:mk2).arity)
  77. assert_equal(-2, method(:mk3).arity)
  78. assert_equal(-1, method(:mk4).arity)
  79. assert_equal(-2, method(:mk5).arity)
  80. assert_equal(-3, method(:mk6).arity)
  81. assert_equal(-3, method(:mk7).arity)
  82. end
  83. def test_arity_special
  84. assert_equal(-1, method(:__send__).arity)
  85. end
  86. def test_unbind
  87. assert_equal(:derived, Derived.new.foo)
  88. um = Derived.new.method(:foo).unbind
  89. assert_instance_of(UnboundMethod, um)
  90. Derived.class_eval do
  91. def foo() :changed end
  92. end
  93. assert_equal(:changed, Derived.new.foo)
  94. assert_equal(:derived, um.bind(Derived.new).call)
  95. assert_raise(TypeError) do
  96. um.bind(Base.new)
  97. end
  98. # cleanup
  99. Derived.class_eval do
  100. remove_method :foo
  101. def foo() :derived; end
  102. end
  103. end
  104. def test_callee
  105. assert_equal(:test_callee, __method__)
  106. assert_equal(:m, Class.new {def m; __method__; end}.new.m)
  107. assert_equal(:m, Class.new {def m; tap{return __method__}; end}.new.m)
  108. assert_equal(:m, Class.new {define_method(:m) {__method__}}.new.m)
  109. assert_equal(:m, Class.new {define_method(:m) {tap{return __method__}}}.new.m)
  110. assert_nil(eval("class TestCallee; __method__; end"))
  111. assert_equal(:test_callee, __callee__)
  112. [
  113. ["method", Class.new {def m; __callee__; end},],
  114. ["block", Class.new {def m; tap{return __callee__}; end},],
  115. ["define_method", Class.new {define_method(:m) {__callee__}}],
  116. ["define_method block", Class.new {define_method(:m) {tap{return __callee__}}}],
  117. ].each do |mesg, c|
  118. c.class_eval {alias m2 m}
  119. o = c.new
  120. assert_equal(:m, o.m, mesg)
  121. assert_equal(:m2, o.m2, mesg)
  122. end
  123. assert_nil(eval("class TestCallee; __callee__; end"))
  124. end
  125. def test_orphan_callee
  126. c = Class.new{def foo; proc{__callee__}; end; alias alias_foo foo}
  127. assert_equal(:alias_foo, c.new.alias_foo.call, '[Bug #11046]')
  128. end
  129. def test_method_in_define_method_block
  130. bug4606 = '[ruby-core:35386]'
  131. c = Class.new do
  132. [:m1, :m2].each do |m|
  133. define_method(m) do
  134. __method__
  135. end
  136. end
  137. end
  138. assert_equal(:m1, c.new.m1, bug4606)
  139. assert_equal(:m2, c.new.m2, bug4606)
  140. end
  141. def test_method_in_block_in_define_method_block
  142. bug4606 = '[ruby-core:35386]'
  143. c = Class.new do
  144. [:m1, :m2].each do |m|
  145. define_method(m) do
  146. tap { return __method__ }
  147. end
  148. end
  149. end
  150. assert_equal(:m1, c.new.m1, bug4606)
  151. assert_equal(:m2, c.new.m2, bug4606)
  152. end
  153. def test_body
  154. o = Object.new
  155. def o.foo; end
  156. assert_nothing_raised { RubyVM::InstructionSequence.disasm(o.method(:foo)) }
  157. assert_nothing_raised { RubyVM::InstructionSequence.disasm("x".method(:upcase)) }
  158. assert_nothing_raised { RubyVM::InstructionSequence.disasm(method(:to_s).to_proc) }
  159. end
  160. def test_new
  161. c1 = Class.new
  162. c1.class_eval { def foo; :foo; end }
  163. c2 = Class.new(c1)
  164. c2.class_eval { private :foo }
  165. o = c2.new
  166. o.extend(Module.new)
  167. assert_raise(NameError) { o.method(:bar) }
  168. assert_raise(NameError) { o.public_method(:foo) }
  169. assert_equal(:foo, o.method(:foo).call)
  170. end
  171. def test_eq
  172. o = Object.new
  173. class << o
  174. def foo; end
  175. alias bar foo
  176. def baz; end
  177. end
  178. assert_not_equal(o.method(:foo), nil)
  179. m = o.method(:foo)
  180. def m.foo; end
  181. assert_not_equal(o.method(:foo), m)
  182. assert_equal(o.method(:foo), o.method(:foo))
  183. assert_equal(o.method(:foo), o.method(:bar))
  184. assert_not_equal(o.method(:foo), o.method(:baz))
  185. end
  186. def test_hash
  187. o = Object.new
  188. def o.foo; end
  189. assert_kind_of(Integer, o.method(:foo).hash)
  190. assert_equal(Array.instance_method(:map).hash, Array.instance_method(:collect).hash)
  191. assert_kind_of(String, o.method(:foo).hash.to_s)
  192. end
  193. def test_owner
  194. c = Class.new do
  195. def foo; end
  196. end
  197. assert_equal(c, c.instance_method(:foo).owner)
  198. c2 = Class.new(c)
  199. assert_equal(c, c2.instance_method(:foo).owner)
  200. end
  201. def test_owner_missing
  202. c = Class.new do
  203. def respond_to_missing?(name, bool)
  204. name == :foo
  205. end
  206. end
  207. c2 = Class.new(c)
  208. assert_equal(c, c.new.method(:foo).owner)
  209. assert_equal(c2, c2.new.method(:foo).owner)
  210. end
  211. def test_receiver_name_owner
  212. o = Object.new
  213. def o.foo; end
  214. m = o.method(:foo)
  215. assert_equal(o, m.receiver)
  216. assert_equal(:foo, m.name)
  217. assert_equal(class << o; self; end, m.owner)
  218. assert_equal(:foo, m.unbind.name)
  219. assert_equal(class << o; self; end, m.unbind.owner)
  220. class << o
  221. alias bar foo
  222. end
  223. m = o.method(:bar)
  224. assert_equal(:bar, m.name)
  225. assert_equal(:foo, m.original_name)
  226. end
  227. def test_instance_method
  228. c = Class.new
  229. c.class_eval do
  230. def foo; :foo; end
  231. private :foo
  232. end
  233. o = c.new
  234. o.method(:foo).unbind
  235. assert_raise(NoMethodError) { o.foo }
  236. c.instance_method(:foo).bind(o)
  237. assert_equal(:foo, o.instance_eval { foo })
  238. assert_raise(NameError) { c.public_instance_method(:foo) }
  239. def o.bar; end
  240. m = o.method(:bar).unbind
  241. assert_raise(TypeError) { m.bind(Object.new) }
  242. cx = EnvUtil.labeled_class("X\u{1f431}")
  243. assert_raise_with_message(TypeError, /X\u{1f431}/) do
  244. o.method(cx)
  245. end
  246. end
  247. def test_bind_module_instance_method
  248. feature4254 = '[ruby-core:34267]'
  249. m = M.instance_method(:meth)
  250. assert_equal(:meth, m.bind(Object.new).call, feature4254)
  251. end
  252. def test_define_method
  253. c = Class.new
  254. c.class_eval { def foo; :foo; end }
  255. o = c.new
  256. def o.bar; :bar; end
  257. assert_raise(TypeError) do
  258. c.class_eval { define_method(:foo, :foo) }
  259. end
  260. assert_raise(ArgumentError) do
  261. c.class_eval { define_method }
  262. end
  263. c2 = Class.new(c)
  264. c2.class_eval { define_method(:baz, o.method(:foo)) }
  265. assert_equal(:foo, c2.new.baz)
  266. assert_raise(TypeError) do
  267. Class.new.class_eval { define_method(:foo, o.method(:foo)) }
  268. end
  269. assert_raise(TypeError) do
  270. Class.new.class_eval { define_method(:bar, o.method(:bar)) }
  271. end
  272. cx = EnvUtil.labeled_class("X\u{1f431}")
  273. assert_raise_with_message(TypeError, /X\u{1F431}/) do
  274. Class.new {define_method(cx) {}}
  275. end
  276. end
  277. def test_define_method_no_proc
  278. o = Object.new
  279. def o.foo(c)
  280. c.class_eval { define_method(:foo) }
  281. end
  282. c = Class.new
  283. assert_raise(ArgumentError) {o.foo(c)}
  284. bug11283 = '[ruby-core:69655] [Bug #11283]'
  285. assert_raise(ArgumentError, bug11283) {o.foo(c) {:foo}}
  286. end
  287. def test_define_singleton_method
  288. o = Object.new
  289. o.instance_eval { define_singleton_method(:foo) { :foo } }
  290. assert_equal(:foo, o.foo)
  291. end
  292. def test_define_singleton_method_no_proc
  293. o = Object.new
  294. assert_raise(ArgumentError) {
  295. o.instance_eval { define_singleton_method(:bar) }
  296. }
  297. bug11283 = '[ruby-core:69655] [Bug #11283]'
  298. def o.define(n)
  299. define_singleton_method(n)
  300. end
  301. assert_raise(ArgumentError, bug11283) {o.define(:bar) {:bar}}
  302. end
  303. def test_define_method_invalid_arg
  304. assert_raise(TypeError) do
  305. Class.new.class_eval { define_method(:foo, Object.new) }
  306. end
  307. assert_raise(TypeError) do
  308. Module.new.module_eval {define_method(:foo, Base.instance_method(:foo))}
  309. end
  310. end
  311. def test_define_singleton_method_with_extended_method
  312. bug8686 = "[ruby-core:56174]"
  313. m = Module.new do
  314. extend self
  315. def a
  316. "a"
  317. end
  318. end
  319. assert_nothing_raised(bug8686) do
  320. m.define_singleton_method(:a, m.method(:a))
  321. end
  322. end
  323. def test_define_method_transplating
  324. feature4254 = '[ruby-core:34267]'
  325. m = Module.new {define_method(:meth, M.instance_method(:meth))}
  326. assert_equal(:meth, Object.new.extend(m).meth, feature4254)
  327. c = Class.new {define_method(:meth, M.instance_method(:meth))}
  328. assert_equal(:meth, c.new.meth, feature4254)
  329. end
  330. def test_define_method_visibility
  331. c = Class.new do
  332. public
  333. define_method(:foo) {:foo}
  334. protected
  335. define_method(:bar) {:bar}
  336. private
  337. define_method(:baz) {:baz}
  338. end
  339. assert_equal(true, c.public_method_defined?(:foo))
  340. assert_equal(false, c.public_method_defined?(:bar))
  341. assert_equal(false, c.public_method_defined?(:baz))
  342. assert_equal(false, c.protected_method_defined?(:foo))
  343. assert_equal(true, c.protected_method_defined?(:bar))
  344. assert_equal(false, c.protected_method_defined?(:baz))
  345. assert_equal(false, c.private_method_defined?(:foo))
  346. assert_equal(false, c.private_method_defined?(:bar))
  347. assert_equal(true, c.private_method_defined?(:baz))
  348. m = Module.new do
  349. module_function
  350. define_method(:foo) {:foo}
  351. end
  352. assert_equal(true, m.respond_to?(:foo))
  353. assert_equal(false, m.public_method_defined?(:foo))
  354. assert_equal(false, m.protected_method_defined?(:foo))
  355. assert_equal(true, m.private_method_defined?(:foo))
  356. end
  357. def test_define_method_in_private_scope
  358. bug9005 = '[ruby-core:57747] [Bug #9005]'
  359. c = Class.new
  360. class << c
  361. public :define_method
  362. end
  363. TOPLEVEL_BINDING.eval("proc{|c|c.define_method(:x) {|x|throw x}}").call(c)
  364. o = c.new
  365. assert_throw(bug9005) {o.x(bug9005)}
  366. end
  367. def test_singleton_define_method_in_private_scope
  368. bug9141 = '[ruby-core:58497] [Bug #9141]'
  369. o = Object.new
  370. class << o
  371. public :define_singleton_method
  372. end
  373. TOPLEVEL_BINDING.eval("proc{|o|o.define_singleton_method(:x) {|x|throw x}}").call(o)
  374. assert_throw(bug9141) do
  375. o.x(bug9141)
  376. end
  377. end
  378. def test_super_in_proc_from_define_method
  379. c1 = Class.new {
  380. def m
  381. :m1
  382. end
  383. }
  384. c2 = Class.new(c1) { define_method(:m) { Proc.new { super() } } }
  385. assert_equal(:m1, c2.new.m.call, 'see [Bug #4881] and [Bug #3136]')
  386. end
  387. def test_clone
  388. o = Object.new
  389. def o.foo; :foo; end
  390. m = o.method(:foo)
  391. def m.bar; :bar; end
  392. assert_equal(:foo, m.clone.call)
  393. assert_equal(:bar, m.clone.bar)
  394. end
  395. def test_inspect
  396. o = Object.new
  397. def o.foo; end; line_no = __LINE__
  398. m = o.method(:foo)
  399. assert_equal("#<Method: #{ o.inspect }.foo() #{__FILE__}:#{line_no}>", m.inspect)
  400. m = o.method(:foo)
  401. assert_match("#<UnboundMethod: #{ class << o; self; end.inspect }#foo() #{__FILE__}:#{line_no}", m.unbind.inspect)
  402. c = Class.new
  403. c.class_eval { def foo; end; }; line_no = __LINE__
  404. m = c.new.method(:foo)
  405. assert_equal("#<Method: #{ c.inspect }#foo() #{__FILE__}:#{line_no}>", m.inspect)
  406. m = c.instance_method(:foo)
  407. assert_equal("#<UnboundMethod: #{ c.inspect }#foo() #{__FILE__}:#{line_no}>", m.inspect)
  408. c2 = Class.new(c)
  409. c2.class_eval { private :foo }
  410. m2 = c2.new.method(:foo)
  411. assert_equal("#<Method: #{ c2.inspect }(#{ c.inspect })#foo() #{__FILE__}:#{line_no}>", m2.inspect)
  412. bug7806 = '[ruby-core:52048] [Bug #7806]'
  413. c3 = Class.new(c)
  414. c3.class_eval { alias bar foo }
  415. m3 = c3.new.method(:bar)
  416. assert_equal("#<Method: #{c3.inspect}(#{c.inspect})#bar(foo)() #{__FILE__}:#{line_no}>", m3.inspect, bug7806)
  417. bug15608 = '[ruby-core:91570] [Bug #15608]'
  418. c4 = Class.new(c)
  419. c4.class_eval { alias bar foo }
  420. o = c4.new
  421. o.singleton_class
  422. m4 = o.method(:bar)
  423. assert_equal("#<Method: #{c4.inspect}(#{c.inspect})#bar(foo)() #{__FILE__}:#{line_no}>", m4.inspect, bug15608)
  424. end
  425. def test_callee_top_level
  426. assert_in_out_err([], "p __callee__", %w(nil), [])
  427. end
  428. def test_caller_top_level
  429. assert_in_out_err([], "p caller", %w([]), [])
  430. end
  431. def test_caller_negative_level
  432. assert_raise(ArgumentError) { caller(-1) }
  433. end
  434. def test_attrset_ivar
  435. c = Class.new
  436. c.class_eval { attr_accessor :foo }
  437. o = c.new
  438. o.method(:foo=).call(42)
  439. assert_equal(42, o.foo)
  440. assert_raise(ArgumentError) { o.method(:foo=).call(1, 2, 3) }
  441. assert_raise(ArgumentError) { o.method(:foo).call(1) }
  442. end
  443. def test_default_accessibility
  444. tmethods = T.public_instance_methods
  445. assert_include tmethods, :normal_method, 'normal methods are public by default'
  446. assert_not_include tmethods, :initialize, '#initialize is private'
  447. assert_not_include tmethods, :initialize_copy, '#initialize_copy is private'
  448. assert_not_include tmethods, :initialize_clone, '#initialize_clone is private'
  449. assert_not_include tmethods, :initialize_dup, '#initialize_dup is private'
  450. assert_not_include tmethods, :respond_to_missing?, '#respond_to_missing? is private'
  451. mmethods = M.public_instance_methods
  452. assert_not_include mmethods, :func, 'module methods are private by default'
  453. assert_include mmethods, :meth, 'normal methods are public by default'
  454. end
  455. def test_respond_to_missing_argument
  456. obj = Struct.new(:mid).new
  457. def obj.respond_to_missing?(id, *)
  458. self.mid = id
  459. true
  460. end
  461. assert_kind_of(Method, obj.method("bug15640"))
  462. assert_kind_of(Symbol, obj.mid)
  463. assert_equal("bug15640", obj.mid.to_s)
  464. arg = Struct.new(:to_str).new("bug15640_2")
  465. assert_kind_of(Method, obj.method(arg))
  466. assert_kind_of(Symbol, obj.mid)
  467. assert_equal("bug15640_2", obj.mid.to_s)
  468. end
  469. define_method(:pm0) {||}
  470. define_method(:pm1) {|a|}
  471. define_method(:pm2) {|a, b|}
  472. define_method(:pmo1) {|a = nil, &b|}
  473. define_method(:pmo2) {|a, b = nil|}
  474. define_method(:pmo3) {|*a|}
  475. define_method(:pmo4) {|a, *b, &c|}
  476. define_method(:pmo5) {|a, *b, c|}
  477. define_method(:pmo6) {|a, *b, c, &d|}
  478. define_method(:pmo7) {|a, b = nil, *c, d, &e|}
  479. define_method(:pma1) {|(a), &b| nil && a}
  480. define_method(:pmk1) {|**|}
  481. define_method(:pmk2) {|**o|}
  482. define_method(:pmk3) {|a, **o|}
  483. define_method(:pmk4) {|a = nil, **o|}
  484. define_method(:pmk5) {|a, b = nil, **o|}
  485. define_method(:pmk6) {|a, b = nil, c, **o|}
  486. define_method(:pmk7) {|a, b = nil, *c, d, **o|}
  487. define_method(:pmk8) {|a, b = nil, *c, d, e:, f: nil, **o|}
  488. define_method(:pmnk) {|**nil|}
  489. def test_bound_parameters
  490. assert_equal([], method(:m0).parameters)
  491. assert_equal([[:req, :a]], method(:m1).parameters)
  492. assert_equal([[:req, :a], [:req, :b]], method(:m2).parameters)
  493. assert_equal([[:opt, :a], [:block, :b]], method(:mo1).parameters)
  494. assert_equal([[:req, :a], [:opt, :b]], method(:mo2).parameters)
  495. assert_equal([[:rest, :a]], method(:mo3).parameters)
  496. assert_equal([[:req, :a], [:rest, :b], [:block, :c]], method(:mo4).parameters)
  497. assert_equal([[:req, :a], [:rest, :b], [:req, :c]], method(:mo5).parameters)
  498. assert_equal([[:req, :a], [:rest, :b], [:req, :c], [:block, :d]], method(:mo6).parameters)
  499. assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:block, :e]], method(:mo7).parameters)
  500. assert_equal([[:req, :a], [:opt, :b], [:rest], [:req, :d], [:block, :e]], method(:mo8).parameters)
  501. assert_equal([[:req], [:block, :b]], method(:ma1).parameters)
  502. assert_equal([[:keyrest]], method(:mk1).parameters)
  503. assert_equal([[:keyrest, :o]], method(:mk2).parameters)
  504. assert_equal([[:req, :a], [:keyrest, :o]], method(:mk3).parameters)
  505. assert_equal([[:opt, :a], [:keyrest, :o]], method(:mk4).parameters)
  506. assert_equal([[:req, :a], [:opt, :b], [:keyrest, :o]], method(:mk5).parameters)
  507. assert_equal([[:req, :a], [:opt, :b], [:req, :c], [:keyrest, :o]], method(:mk6).parameters)
  508. assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:keyrest, :o]], method(:mk7).parameters)
  509. assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:keyreq, :e], [:key, :f], [:keyrest, :o]], method(:mk8).parameters)
  510. assert_equal([[:nokey]], method(:mnk).parameters)
  511. # pending
  512. assert_equal([[:rest, :*], [:block, :&]], method(:mf).parameters)
  513. end
  514. def test_unbound_parameters
  515. assert_equal([], self.class.instance_method(:m0).parameters)
  516. assert_equal([[:req, :a]], self.class.instance_method(:m1).parameters)
  517. assert_equal([[:req, :a], [:req, :b]], self.class.instance_method(:m2).parameters)
  518. assert_equal([[:opt, :a], [:block, :b]], self.class.instance_method(:mo1).parameters)
  519. assert_equal([[:req, :a], [:opt, :b]], self.class.instance_method(:mo2).parameters)
  520. assert_equal([[:rest, :a]], self.class.instance_method(:mo3).parameters)
  521. assert_equal([[:req, :a], [:rest, :b], [:block, :c]], self.class.instance_method(:mo4).parameters)
  522. assert_equal([[:req, :a], [:rest, :b], [:req, :c]], self.class.instance_method(:mo5).parameters)
  523. assert_equal([[:req, :a], [:rest, :b], [:req, :c], [:block, :d]], self.class.instance_method(:mo6).parameters)
  524. assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:block, :e]], self.class.instance_method(:mo7).parameters)
  525. assert_equal([[:req, :a], [:opt, :b], [:rest], [:req, :d], [:block, :e]], self.class.instance_method(:mo8).parameters)
  526. assert_equal([[:req], [:block, :b]], self.class.instance_method(:ma1).parameters)
  527. assert_equal([[:keyrest]], self.class.instance_method(:mk1).parameters)
  528. assert_equal([[:keyrest, :o]], self.class.instance_method(:mk2).parameters)
  529. assert_equal([[:req, :a], [:keyrest, :o]], self.class.instance_method(:mk3).parameters)
  530. assert_equal([[:opt, :a], [:keyrest, :o]], self.class.instance_method(:mk4).parameters)
  531. assert_equal([[:req, :a], [:opt, :b], [:keyrest, :o]], self.class.instance_method(:mk5).parameters)
  532. assert_equal([[:req, :a], [:opt, :b], [:req, :c], [:keyrest, :o]], self.class.instance_method(:mk6).parameters)
  533. assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:keyrest, :o]], self.class.instance_method(:mk7).parameters)
  534. assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:keyreq, :e], [:key, :f], [:keyrest, :o]], self.class.instance_method(:mk8).parameters)
  535. assert_equal([[:nokey]], self.class.instance_method(:mnk).parameters)
  536. # pending
  537. assert_equal([[:rest, :*], [:block, :&]], self.class.instance_method(:mf).parameters)
  538. end
  539. def test_bmethod_bound_parameters
  540. assert_equal([], method(:pm0).parameters)
  541. assert_equal([[:req, :a]], method(:pm1).parameters)
  542. assert_equal([[:req, :a], [:req, :b]], method(:pm2).parameters)
  543. assert_equal([[:opt, :a], [:block, :b]], method(:pmo1).parameters)
  544. assert_equal([[:req, :a], [:opt, :b]], method(:pmo2).parameters)
  545. assert_equal([[:rest, :a]], method(:pmo3).parameters)
  546. assert_equal([[:req, :a], [:rest, :b], [:block, :c]], method(:pmo4).parameters)
  547. assert_equal([[:req, :a], [:rest, :b], [:req, :c]], method(:pmo5).parameters)
  548. assert_equal([[:req, :a], [:rest, :b], [:req, :c], [:block, :d]], method(:pmo6).parameters)
  549. assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:block, :e]], method(:pmo7).parameters)
  550. assert_equal([[:req], [:block, :b]], method(:pma1).parameters)
  551. assert_equal([[:keyrest]], method(:pmk1).parameters)
  552. assert_equal([[:keyrest, :o]], method(:pmk2).parameters)
  553. assert_equal([[:req, :a], [:keyrest, :o]], method(:pmk3).parameters)
  554. assert_equal([[:opt, :a], [:keyrest, :o]], method(:pmk4).parameters)
  555. assert_equal([[:req, :a], [:opt, :b], [:keyrest, :o]], method(:pmk5).parameters)
  556. assert_equal([[:req, :a], [:opt, :b], [:req, :c], [:keyrest, :o]], method(:pmk6).parameters)
  557. assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:keyrest, :o]], method(:pmk7).parameters)
  558. assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:keyreq, :e], [:key, :f], [:keyrest, :o]], method(:pmk8).parameters)
  559. assert_equal([[:nokey]], method(:pmnk).parameters)
  560. end
  561. def test_bmethod_unbound_parameters
  562. assert_equal([], self.class.instance_method(:pm0).parameters)
  563. assert_equal([[:req, :a]], self.class.instance_method(:pm1).parameters)
  564. assert_equal([[:req, :a], [:req, :b]], self.class.instance_method(:pm2).parameters)
  565. assert_equal([[:opt, :a], [:block, :b]], self.class.instance_method(:pmo1).parameters)
  566. assert_equal([[:req, :a], [:opt, :b]], self.class.instance_method(:pmo2).parameters)
  567. assert_equal([[:rest, :a]], self.class.instance_method(:pmo3).parameters)
  568. assert_equal([[:req, :a], [:rest, :b], [:block, :c]], self.class.instance_method(:pmo4).parameters)
  569. assert_equal([[:req, :a], [:rest, :b], [:req, :c]], self.class.instance_method(:pmo5).parameters)
  570. assert_equal([[:req, :a], [:rest, :b], [:req, :c], [:block, :d]], self.class.instance_method(:pmo6).parameters)
  571. assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:block, :e]], self.class.instance_method(:pmo7).parameters)
  572. assert_equal([[:req], [:block, :b]], self.class.instance_method(:pma1).parameters)
  573. assert_equal([[:req], [:block, :b]], self.class.instance_method(:pma1).parameters)
  574. assert_equal([[:keyrest]], self.class.instance_method(:pmk1).parameters)
  575. assert_equal([[:keyrest, :o]], self.class.instance_method(:pmk2).parameters)
  576. assert_equal([[:req, :a], [:keyrest, :o]], self.class.instance_method(:pmk3).parameters)
  577. assert_equal([[:opt, :a], [:keyrest, :o]], self.class.instance_method(:pmk4).parameters)
  578. assert_equal([[:req, :a], [:opt, :b], [:keyrest, :o]], self.class.instance_method(:pmk5).parameters)
  579. assert_equal([[:req, :a], [:opt, :b], [:req, :c], [:keyrest, :o]], self.class.instance_method(:pmk6).parameters)
  580. assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:keyrest, :o]], self.class.instance_method(:pmk7).parameters)
  581. assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:keyreq, :e], [:key, :f], [:keyrest, :o]], self.class.instance_method(:pmk8).parameters)
  582. assert_equal([[:nokey]], self.class.instance_method(:pmnk).parameters)
  583. end
  584. def test_hidden_parameters
  585. instance_eval("def m((_)"+",(_)"*256+");end")
  586. assert_empty(method(:m).parameters.map{|_,n|n}.compact)
  587. end
  588. def test_method_parameters_inspect
  589. assert_include(method(:m0).inspect, "()")
  590. assert_include(method(:m1).inspect, "(a)")
  591. assert_include(method(:m2).inspect, "(a, b)")
  592. assert_include(method(:mo1).inspect, "(a=..., &b)")
  593. assert_include(method(:mo2).inspect, "(a, b=...)")
  594. assert_include(method(:mo3).inspect, "(*a)")
  595. assert_include(method(:mo4).inspect, "(a, *b, &c)")
  596. assert_include(method(:mo5).inspect, "(a, *b, c)")
  597. assert_include(method(:mo6).inspect, "(a, *b, c, &d)")
  598. assert_include(method(:mo7).inspect, "(a, b=..., *c, d, &e)")
  599. assert_include(method(:mo8).inspect, "(a, b=..., *, d, &e)")
  600. assert_include(method(:ma1).inspect, "(_, &b)")
  601. assert_include(method(:mk1).inspect, "(**)")
  602. assert_include(method(:mk2).inspect, "(**o)")
  603. assert_include(method(:mk3).inspect, "(a, **o)")
  604. assert_include(method(:mk4).inspect, "(a=..., **o)")
  605. assert_include(method(:mk5).inspect, "(a, b=..., **o)")
  606. assert_include(method(:mk6).inspect, "(a, b=..., c, **o)")
  607. assert_include(method(:mk7).inspect, "(a, b=..., *c, d, **o)")
  608. assert_include(method(:mk8).inspect, "(a, b=..., *c, d, e:, f: ..., **o)")
  609. assert_include(method(:mnk).inspect, "(**nil)")
  610. assert_include(method(:mf).inspect, "(...)")
  611. end
  612. def test_unbound_method_parameters_inspect
  613. assert_include(self.class.instance_method(:m0).inspect, "()")
  614. assert_include(self.class.instance_method(:m1).inspect, "(a)")
  615. assert_include(self.class.instance_method(:m2).inspect, "(a, b)")
  616. assert_include(self.class.instance_method(:mo1).inspect, "(a=..., &b)")
  617. assert_include(self.class.instance_method(:mo2).inspect, "(a, b=...)")
  618. assert_include(self.class.instance_method(:mo3).inspect, "(*a)")
  619. assert_include(self.class.instance_method(:mo4).inspect, "(a, *b, &c)")
  620. assert_include(self.class.instance_method(:mo5).inspect, "(a, *b, c)")
  621. assert_include(self.class.instance_method(:mo6).inspect, "(a, *b, c, &d)")
  622. assert_include(self.class.instance_method(:mo7).inspect, "(a, b=..., *c, d, &e)")
  623. assert_include(self.class.instance_method(:mo8).inspect, "(a, b=..., *, d, &e)")
  624. assert_include(self.class.instance_method(:ma1).inspect, "(_, &b)")
  625. assert_include(self.class.instance_method(:mk1).inspect, "(**)")
  626. assert_include(self.class.instance_method(:mk2).inspect, "(**o)")
  627. assert_include(self.class.instance_method(:mk3).inspect, "(a, **o)")
  628. assert_include(self.class.instance_method(:mk4).inspect, "(a=..., **o)")
  629. assert_include(self.class.instance_method(:mk5).inspect, "(a, b=..., **o)")
  630. assert_include(self.class.instance_method(:mk6).inspect, "(a, b=..., c, **o)")
  631. assert_include(self.class.instance_method(:mk7).inspect, "(a, b=..., *c, d, **o)")
  632. assert_include(self.class.instance_method(:mk8).inspect, "(a, b=..., *c, d, e:, f: ..., **o)")
  633. assert_include(self.class.instance_method(:mnk).inspect, "(**nil)")
  634. assert_include(self.class.instance_method(:mf).inspect, "(...)")
  635. end
  636. def test_public_method_with_zsuper_method
  637. c = Class.new
  638. c.class_eval do
  639. def foo
  640. :ok
  641. end
  642. private :foo
  643. end
  644. d = Class.new(c)
  645. d.class_eval do
  646. public :foo
  647. end
  648. assert_equal(:ok, d.new.public_method(:foo).call)
  649. end
  650. def test_public_methods_with_extended
  651. m = Module.new do def m1; end end
  652. a = Class.new do def a; end end
  653. bug = '[ruby-dev:41553]'
  654. obj = a.new
  655. assert_equal([:a], obj.public_methods(false), bug)
  656. obj.extend(m)
  657. assert_equal([:m1, :a], obj.public_methods(false), bug)
  658. end
  659. def test_visibility
  660. assert_equal('method', defined?(mv1))
  661. assert_equal('method', defined?(mv2))
  662. assert_equal('method', defined?(mv3))
  663. assert_equal('method', defined?(self.mv1))
  664. assert_equal(nil, defined?(self.mv2))
  665. assert_equal('method', defined?(self.mv3))
  666. assert_equal(true, respond_to?(:mv1))
  667. assert_equal(false, respond_to?(:mv2))
  668. assert_equal(false, respond_to?(:mv3))
  669. assert_equal(true, respond_to?(:mv1, true))
  670. assert_equal(true, respond_to?(:mv2, true))
  671. assert_equal(true, respond_to?(:mv3, true))
  672. assert_nothing_raised { mv1 }
  673. assert_nothing_raised { mv2 }
  674. assert_nothing_raised { mv3 }
  675. assert_nothing_raised { self.mv1 }
  676. assert_nothing_raised { self.mv2 }
  677. assert_raise(NoMethodError) { (self).mv2 }
  678. assert_nothing_raised { self.mv3 }
  679. v = Visibility.new
  680. assert_equal('method', defined?(v.mv1))
  681. assert_equal(nil, defined?(v.mv2))
  682. assert_equal(nil, defined?(v.mv3))
  683. assert_equal(true, v.respond_to?(:mv1))
  684. assert_equal(false, v.respond_to?(:mv2))
  685. assert_equal(false, v.respond_to?(:mv3))
  686. assert_equal(true, v.respond_to?(:mv1, true))
  687. assert_equal(true, v.respond_to?(:mv2, true))
  688. assert_equal(true, v.respond_to?(:mv3, true))
  689. assert_nothing_raised { v.mv1 }
  690. assert_raise(NoMethodError) { v.mv2 }
  691. assert_raise(NoMethodError) { v.mv3 }
  692. assert_nothing_raised { v.__send__(:mv1) }
  693. assert_nothing_raised { v.__send__(:mv2) }
  694. assert_nothing_raised { v.__send__(:mv3) }
  695. assert_nothing_raised { v.instance_eval { mv1 } }
  696. assert_nothing_raised { v.instance_eval { mv2 } }
  697. assert_nothing_raised { v.instance_eval { mv3 } }
  698. end
  699. def test_bound_method_entry
  700. bug6171 = '[ruby-core:43383]'
  701. assert_ruby_status([], <<-EOC, bug6171)
  702. class Bug6171
  703. def initialize(target)
  704. define_singleton_method(:reverse, target.method(:reverse).to_proc)
  705. end
  706. end
  707. 100.times {p = Bug6171.new('test'); 1000.times {p.reverse}}
  708. EOC
  709. end
  710. def test_unbound_method_proc_coerce
  711. # '&' coercion of an UnboundMethod raises TypeError
  712. assert_raise(TypeError) do
  713. Class.new do
  714. define_method('foo', &Object.instance_method(:to_s))
  715. end
  716. end
  717. end
  718. def test___dir__
  719. assert_instance_of String, __dir__
  720. assert_equal(File.dirname(File.realpath(__FILE__)), __dir__)
  721. bug8436 = '[ruby-core:55123] [Bug #8436]'
  722. file, line = *binding.source_location
  723. file = File.realpath(file)
  724. assert_equal(__dir__, eval("__dir__", binding, file, line), bug8436)
  725. bug8662 = '[ruby-core:56099] [Bug #8662]'
  726. assert_equal("arbitrary", eval("__dir__", binding, "arbitrary/file.rb"), bug8662)
  727. assert_equal("arbitrary", Object.new.instance_eval("__dir__", "arbitrary/file.rb"), bug8662)
  728. end
  729. def test_alias_owner
  730. bug7613 = '[ruby-core:51105]'
  731. bug7993 = '[Bug #7993]'
  732. c = Class.new {
  733. def foo
  734. end
  735. prepend Module.new
  736. attr_reader :zot
  737. }
  738. x = c.new
  739. class << x
  740. alias bar foo
  741. end
  742. assert_equal(c, c.instance_method(:foo).owner)
  743. assert_equal(c, x.method(:foo).owner)
  744. assert_equal(x.singleton_class, x.method(:bar).owner)
  745. assert_equal(x.method(:foo), x.method(:bar), bug7613)
  746. assert_equal(c, x.method(:zot).owner, bug7993)
  747. assert_equal(c, c.instance_method(:zot).owner, bug7993)
  748. end
  749. def test_included
  750. m = Module.new {
  751. def foo
  752. end
  753. }
  754. c = Class.new {
  755. def foo
  756. end
  757. include m
  758. }
  759. assert_equal(c, c.instance_method(:foo).owner)
  760. end
  761. def test_prepended
  762. bug7836 = '[ruby-core:52160] [Bug #7836]'
  763. bug7988 = '[ruby-core:53038] [Bug #7988]'
  764. m = Module.new {
  765. def foo
  766. end
  767. }
  768. c = Class.new {
  769. def foo
  770. end
  771. prepend m
  772. }
  773. assert_raise(NameError, bug7988) {Module.new{prepend m}.instance_method(:bar)}
  774. true || c || bug7836
  775. end
  776. def test_gced_bmethod
  777. assert_normal_exit %q{
  778. require 'irb'
  779. IRB::Irb.module_eval do
  780. define_method(:eval_input) do
  781. IRB::Irb.module_eval { alias_method :eval_input, :to_s }
  782. GC.start
  783. Kernel
  784. end
  785. end
  786. IRB.start
  787. }, '[Bug #7825]'
  788. end
  789. def test_singleton_method
  790. feature8391 = '[ruby-core:54914] [Feature #8391]'
  791. c1 = Class.new
  792. c1.class_eval { def foo; :foo; end }
  793. o = c1.new
  794. def o.bar; :bar; end
  795. assert_nothing_raised(NameError) {o.method(:foo)}
  796. assert_raise(NameError, feature8391) {o.singleton_method(:foo)}
  797. m = assert_nothing_raised(NameError, feature8391) {break o.singleton_method(:bar)}
  798. assert_equal(:bar, m.call, feature8391)
  799. end
  800. def test_singleton_method_prepend
  801. bug14658 = '[Bug #14658]'
  802. c1 = Class.new
  803. o = c1.new
  804. def o.bar; :bar; end
  805. class << o; prepend Module.new; end
  806. m = assert_nothing_raised(NameError, bug14658) {o.singleton_method(:bar)}
  807. assert_equal(:bar, m.call, bug14658)
  808. o = Object.new
  809. assert_raise(NameError, bug14658) {o.singleton_method(:bar)}
  810. end
  811. Feature9783 = '[ruby-core:62212] [Feature #9783]'
  812. def assert_curry_three_args(m)
  813. curried = m.curry
  814. assert_equal(6, curried.(1).(2).(3), Feature9783)
  815. curried = m.curry(3)
  816. assert_equal(6, curried.(1).(2).(3), Feature9783)
  817. assert_raise_with_message(ArgumentError, /wrong number/) {m.curry(2)}
  818. end
  819. def test_curry_method
  820. c = Class.new {
  821. def three_args(a,b,c) a + b + c end
  822. }
  823. assert_curry_three_args(c.new.method(:three_args))
  824. end
  825. def test_curry_from_proc
  826. c = Class.new {
  827. define_method(:three_args) {|x,y,z| x + y + z}
  828. }
  829. assert_curry_three_args(c.new.method(:three_args))
  830. end
  831. def assert_curry_var_args(m)
  832. curried = m.curry(3)
  833. assert_equal([1, 2, 3], curried.(1).(2).(3), Feature9783)
  834. curried = m.curry(2)
  835. assert_equal([1, 2], curried.(1).(2), Feature9783)
  836. curried = m.curry(0)
  837. assert_equal([1], curried.(1), Feature9783)
  838. end
  839. def test_curry_var_args
  840. c = Class.new {
  841. def var_args(*args) args end
  842. }
  843. assert_curry_var_args(c.new.method(:var_args))
  844. end
  845. def test_curry_from_proc_var_args
  846. c = Class.new {
  847. define_method(:var_args) {|*args| args}
  848. }
  849. assert_curry_var_args(c.new.method(:var_args))
  850. end
  851. Feature9781 = '[ruby-core:62202] [Feature #9781]'
  852. def test_super_method
  853. o = Derived.new
  854. m = o.method(:foo).super_method
  855. assert_equal(Base, m.owner, Feature9781)
  856. assert_same(o, m.receiver, Feature9781)
  857. assert_equal(:foo, m.name, Feature9781)
  858. m = assert_nothing_raised(NameError, Feature9781) {break m.super_method}
  859. assert_nil(m, Feature9781)
  860. end
  861. def test_super_method_unbound
  862. m = Derived.instance_method(:foo)
  863. m = m.super_method
  864. assert_equal(Base.instance_method(:foo), m, Feature9781)
  865. m = assert_nothing_raised(NameError, Feature9781) {break m.super_method}
  866. assert_nil(m, Feature9781)
  867. bug11419 = '[ruby-core:70254]'
  868. m = Object.instance_method(:tap)
  869. m = assert_nothing_raised(NameError, bug11419) {break m.super_method}
  870. assert_nil(m, bug11419)
  871. end
  872. def test_super_method_module
  873. m1 = Module.new {def foo; end}
  874. c1 = Class.new(Derived) {include m1; def foo; end}
  875. m = c1.instance_method(:foo)
  876. assert_equal(c1, m.owner, Feature9781)
  877. m = m.super_method
  878. assert_equal(m1, m.owner, Feature9781)
  879. m = m.super_method
  880. assert_equal(Derived, m.owner, Feature9781)
  881. m = m.super_method
  882. assert_equal(Base, m.owner, Feature9781)
  883. m2 = Module.new {def foo; end}
  884. o = c1.new.extend(m2)
  885. m = o.method(:foo)
  886. assert_equal(m2, m.owner, Feature9781)
  887. m = m.super_method
  888. assert_equal(c1, m.owner, Feature9781)
  889. assert_same(o, m.receiver, Feature9781)
  890. c1 = Class.new {def foo; end}
  891. c2 = Class.new(c1) {include m1; include m2}
  892. m = c2.instance_method(:foo)
  893. assert_equal(m2, m.owner)
  894. m = m.super_method
  895. assert_equal(m1, m.owner)
  896. m = m.super_method
  897. assert_equal(c1, m.owner)
  898. assert_nil(m.super_method)
  899. end
  900. def test_super_method_bind_unbind_clone
  901. bug15629_m1 = Module.new do
  902. def foo; end
  903. end
  904. bug15629_m2 = Module.new do
  905. def foo; end
  906. end
  907. bug15629_c = Class.new do
  908. include bug15629_m1
  909. include bug15629_m2
  910. end
  911. o = bug15629_c.new
  912. m = o.method(:foo)
  913. sm = m.super_method
  914. im = bug15629_c.instance_method(:foo)
  915. sim = im.super_method
  916. assert_equal(sm, m.clone.super_method)
  917. assert_equal(sim, m.unbind.super_method)
  918. assert_equal(sim, m.unbind.clone.super_method)
  919. assert_equal(sim, im.clone.super_method)
  920. assert_equal(sm, m.unbind.bind(o).super_method)
  921. assert_equal(sm, m.unbind.clone.bind(o).super_method)
  922. assert_equal(sm, im.bind(o).super_method)
  923. assert_equal(sm, im.clone.bind(o).super_method)
  924. end
  925. def test_super_method_removed
  926. c1 = Class.new {private def foo; end}
  927. c2 = Class.new(c1) {public :foo}
  928. c3 = Class.new(c2) {def foo; end}
  929. c1.class_eval {undef foo}
  930. m = c3.instance_method(:foo)
  931. m = assert_nothing_raised(NameError, Feature9781) {break m.super_method}
  932. assert_nil(m, Feature9781)
  933. end
  934. def test_prepended_public_zsuper
  935. mod = EnvUtil.labeled_module("Mod") {private def foo; :ok end}
  936. mods = [mod]
  937. obj = Object.new.extend(mod)
  938. class << obj
  939. public :foo
  940. end
  941. 2.times do |i|
  942. mods.unshift(mod = EnvUtil.labeled_module("Mod#{i}") {def foo; end})
  943. obj.singleton_class.prepend(mod)
  944. end
  945. m = obj.method(:foo)
  946. assert_equal(mods, mods.map {m.owner.tap {m = m.super_method}})
  947. assert_nil(m)
  948. end
  949. def test_super_method_with_prepended_module
  950. bug = '[ruby-core:81666] [Bug #13656] should be the method of the parent'
  951. c1 = EnvUtil.labeled_class("C1") {def m; end}
  952. c2 = EnvUtil.labeled_class("C2", c1) {def m; end}
  953. c2.prepend(EnvUtil.labeled_module("M"))
  954. m1 = c1.instance_method(:m)
  955. m2 = c2.instance_method(:m).super_method
  956. assert_equal(m1, m2, bug)
  957. assert_equal(c1, m2.owner, bug)
  958. assert_equal(m1.source_location, m2.source_location, bug)
  959. end
  960. def test_super_method_after_bind
  961. assert_nil String.instance_method(:length).bind(String.new).super_method,
  962. '[ruby-core:85231] [Bug #14421]'
  963. end
  964. def rest_parameter(*rest)
  965. rest
  966. end
  967. def test_splat_long_array
  968. if File.exist?('/etc/os-release') && File.read('/etc/os-release').include?('openSUSE Leap')
  969. # For RubyCI's openSUSE machine http://rubyci.s3.amazonaws.com/opensuseleap/ruby-trunk/recent.html, which tends to die with NoMemoryError here.
  970. skip 'do not exhaust memory on RubyCI openSUSE Leap machine'
  971. end
  972. n = 10_000_000
  973. assert_equal n , rest_parameter(*(1..n)).size, '[Feature #10440]'
  974. end
  975. class C
  976. D = "Const_D"
  977. def foo
  978. a = b = c = a = b = c = 12345
  979. end
  980. end
  981. def test_to_proc_binding
  982. bug11012 = '[ruby-core:68673] [Bug #11012]'
  983. b = C.new.method(:foo).to_proc.binding
  984. assert_equal([], b.local_variables, bug11012)
  985. assert_equal("Const_D", b.eval("D"), bug11012) # Check CREF
  986. assert_raise(NameError, bug11012){ b.local_variable_get(:foo) }
  987. assert_equal(123, b.local_variable_set(:foo, 123), bug11012)
  988. assert_equal(123, b.local_variable_get(:foo), bug11012)
  989. assert_equal(456, b.local_variable_set(:bar, 456), bug11012)
  990. assert_equal(123, b.local_variable_get(:foo), bug11012)
  991. assert_equal(456, b.local_variable_get(:bar), bug11012)
  992. assert_equal([:bar, :foo], b.local_variables.sort, bug11012)
  993. end
  994. MethodInMethodClass_Setup = -> do
  995. remove_const :MethodInMethodClass if defined? MethodInMethodClass
  996. class MethodInMethodClass
  997. def m1
  998. def m2
  999. end
  1000. self.class.send(:define_method, :m3){} # [Bug #11754]
  1001. end
  1002. private
  1003. end
  1004. end
  1005. def test_method_in_method_visibility_should_be_public
  1006. MethodInMethodClass_Setup.call
  1007. assert_equal([:m1].sort, MethodInMethodClass.public_instance_methods(false).sort)
  1008. assert_equal([].sort, MethodInMethodClass.private_instance_methods(false).sort)
  1009. MethodInMethodClass.new.m1
  1010. assert_equal([:m1, :m2, :m3].sort, MethodInMethodClass.public_instance_methods(false).sort)
  1011. assert_equal([].sort, MethodInMethodClass.private_instance_methods(false).sort)
  1012. end
  1013. def test_define_method_with_symbol
  1014. assert_normal_exit %q{
  1015. define_method(:foo, &:to_s)
  1016. define_method(:bar, :to_s.to_proc)
  1017. }, '[Bug #11850]'
  1018. c = Class.new{
  1019. define_method(:foo, &:to_s)
  1020. define_method(:bar, :to_s.to_proc)
  1021. }
  1022. obj = c.new
  1023. assert_equal('1', obj.foo(1))
  1024. assert_equal('1', obj.bar(1))
  1025. end
  1026. def test_argument_error_location
  1027. body = <<-'END_OF_BODY'
  1028. eval <<-'EOS'
  1029. $line_lambda = __LINE__; $f = lambda do
  1030. _x = 1
  1031. end
  1032. $line_method = __LINE__; def foo
  1033. _x = 1
  1034. end
  1035. begin
  1036. $f.call(1)
  1037. rescue ArgumentError => e
  1038. assert_equal "(eval):#{$line_lambda.to_s}:in `block in <main>'", e.backtrace.first
  1039. end
  1040. begin
  1041. foo(1)
  1042. rescue ArgumentError => e
  1043. assert_equal "(eval):#{$line_method}:in `foo'", e.backtrace.first
  1044. end
  1045. EOS
  1046. END_OF_BODY
  1047. assert_separately [], body
  1048. # without trace insn
  1049. assert_separately [], "RubyVM::InstructionSequence.compile_option = {trace_instruction: false}\n" + body
  1050. end
  1051. def test_eqq
  1052. assert_operator(0.method(:<), :===, 5)
  1053. assert_not_operator(0.method(:<), :===, -5)
  1054. end
  1055. def test_compose_with_method
  1056. c = Class.new {
  1057. def f(x) x * 2 end
  1058. def g(x) x + 1 end
  1059. }
  1060. f = c.new.method(:f)
  1061. g = c.new.method(:g)
  1062. assert_equal(6, (f << g).call(2))
  1063. assert_equal(6, (g >> f).call(2))
  1064. end
  1065. def test_compose_with_proc
  1066. c = Class.new {
  1067. def f(x) x * 2 end
  1068. }
  1069. f = c.new.method(:f)
  1070. g = proc {|x| x + 1}
  1071. assert_equal(6, (f << g).call(2))
  1072. assert_equal(6, (g >> f).call(2))
  1073. end
  1074. def test_compose_with_callable
  1075. c = Class.new {
  1076. def f(x) x * 2 end
  1077. }
  1078. c2 = Class.new {
  1079. def call(x) x + 1 end
  1080. }
  1081. f = c.new.method(:f)
  1082. g = c2.new
  1083. assert_equal(6, (f << g).call(2))
  1084. assert_equal(5, (f >> g).call(2))
  1085. end
  1086. def test_compose_with_noncallable
  1087. c = Class.new {
  1088. def f(x) x * 2 end
  1089. }
  1090. f = c.new.method(:f)
  1091. assert_raise(TypeError) {
  1092. f << 5
  1093. }
  1094. assert_raise(TypeError) {
  1095. f >> 5
  1096. }
  1097. end
  1098. def test_umethod_bind_call
  1099. foo = Base.instance_method(:foo)
  1100. assert_equal(:base, foo.bind_call(Base.new))
  1101. assert_equal(:base, foo.bind_call(Derived.new))
  1102. plus = Integer.instance_method(:+)
  1103. assert_equal(3, plus.bind_call(1, 2))
  1104. end
  1105. def test_method_list
  1106. # chkbuild lists all methods.
  1107. # The following code emulate this listing.
  1108. # use_symbol = Object.instance_methods[0].is_a?(Symbol)
  1109. nummodule = nummethod = 0
  1110. mods = []
  1111. ObjectSpace.each_object(Module) {|m| mods << m if m.name }
  1112. mods = mods.sort_by {|m| m.name }
  1113. mods.each {|mod|
  1114. nummodule += 1
  1115. mc = mod.kind_of?(Class) ? "class" : "module"
  1116. puts_line = "#{mc} #{mod.name} #{(mod.ancestors - [mod]).inspect}"
  1117. puts_line = puts_line # prevent unused var warning
  1118. mod.singleton_methods(false).sort.each {|methname|
  1119. nummethod += 1
  1120. meth = mod.method(methname)
  1121. line = "#{mod.name}.#{methname} #{meth.arity}"
  1122. line << " not-implemented" if !mod.respond_to?(methname)
  1123. # puts line
  1124. }
  1125. ms = mod.instance_methods(false)
  1126. if true or use_symbol
  1127. ms << :initialize if mod.private_instance_methods(false).include? :initialize
  1128. else
  1129. ms << "initialize" if mod.private_instance_methods(false).include? "initialize"
  1130. end
  1131. ms.sort.each {|methname|
  1132. nummethod += 1
  1133. meth = mod.instance_method(methname)
  1134. line = "#{mod.name}\##{methname} #{meth.arity}"
  1135. line << " not-implemented" if /\(not-implemented\)/ =~ meth.inspect
  1136. # puts line
  1137. }
  1138. }
  1139. # puts "#{nummodule} modules, #{nummethod} methods"
  1140. assert_operator nummodule, :>, 0
  1141. assert_operator nummethod, :>, 0
  1142. end
  1143. end