PageRenderTime 50ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/test/test_methods.rb

https://bitbucket.org/nicksieger/jruby
Ruby | 495 lines | 420 code | 64 blank | 11 comment | 0 complexity | f386845a50ac906eb3dadb2789f02fc3 MD5 | raw file
Possible License(s): GPL-3.0, JSON
  1. require 'test/unit'
  2. class TestMethods < Test::Unit::TestCase
  3. class A
  4. undef_method :id
  5. (class<<self;self;end).send(:undef_method,:id)
  6. end
  7. Adup = A.dup
  8. def test_undef_id
  9. assert_raise(NoMethodError) { A.id }
  10. assert_raise(NoMethodError) { A.new.id }
  11. assert_raise(NoMethodError) { Adup.id }
  12. assert_raise(NoMethodError) { Adup.new.id }
  13. end
  14. class Foo
  15. private
  16. def foo; end
  17. end
  18. def test_foo
  19. assert_raise(NoMethodError) {Foo.class_eval "new.foo"}
  20. begin
  21. Foo.class_eval "new.foo"
  22. rescue NoMethodError
  23. $!.to_s =~ /private/
  24. end
  25. end
  26. # JRUBY-2277
  27. def test_alias_method_calls_correct_method_added_with_sym
  28. $methods_added = []
  29. $singleton_methods_added = []
  30. c = Class.new do
  31. class << self
  32. def singleton_method_added(x) # will also add its own def!
  33. $singleton_methods_added << x
  34. end
  35. def method_added(x)
  36. $methods_added << x
  37. end
  38. def another_singleton
  39. end
  40. alias_method :yet_another_singleton, :another_singleton
  41. end
  42. def foo
  43. end
  44. def bar
  45. end
  46. alias_method :baz, :bar
  47. end
  48. expected_methods = [:foo, :bar, :baz]
  49. expected_singletons = [:singleton_method_added, :method_added, :another_singleton, :yet_another_singleton]
  50. assert_equal(expected_methods, $methods_added)
  51. assert_equal(expected_singletons, $singleton_methods_added)
  52. # test coercion of alias names to symbols
  53. name = Object.new
  54. def name.to_str
  55. "boo"
  56. end
  57. assert_nothing_raised { c.send("alias_method", name, "foo") }
  58. assert_equal(:boo, $methods_added.last)
  59. end
  60. end
  61. class TestMethodObjects < Test::Unit::TestCase
  62. # all testing return values are in the format
  63. # [receiver, origin, method_name]
  64. # origin = Class/Module's name (as Symbol) for instance methods,
  65. # Object for singleton methods
  66. class C
  67. def foo; [self, :C, :foo]; end
  68. def bar; [self, :C, :bar]; end
  69. # for simplicity on singleton representations,
  70. # let's assure #inspect = #to_s
  71. alias inspect to_s
  72. end
  73. class D < C
  74. def bar; [self, :D, :bar]; end
  75. def xyz; [self, :D, :xyz]; end
  76. end
  77. class E < D
  78. def qux; [self, :E, :qux]; end
  79. end
  80. class F < C
  81. def foo; [self, :F, :foo]; end
  82. end
  83. def test_method_call_equivalence
  84. c1 = C.new
  85. c2 = C.new
  86. c3 = C.new
  87. def c3.bar; [self, self, :bar]; end
  88. def c3.cor; [self, self, :cor]; end
  89. d1 = D.new
  90. d2 = D.new
  91. def d2.bar; [self, self, :bar]; end
  92. e1 = E.new
  93. e2 = E.new
  94. def e2.xyz; [self, self, :xyz]; end
  95. [c1, c2, c3].each do |c|
  96. assert_equal(c.foo, c.method(:foo).call)
  97. assert_equal(c.bar, c.method(:bar).call)
  98. end
  99. assert_equal(c3.cor, c3.method(:cor).call)
  100. [d1, d2].each do |d|
  101. assert_equal(d.foo, d.method(:foo).call)
  102. assert_equal(d.bar, d.method(:bar).call)
  103. assert_equal(d.xyz, d.method(:xyz).call)
  104. end
  105. [e1, e2].each do |e|
  106. assert_equal(e.foo, e.method(:foo).call)
  107. assert_equal(e.bar, e.method(:bar).call)
  108. assert_equal(e.xyz, e.method(:xyz).call)
  109. assert_equal(e.qux, e.method(:qux).call)
  110. end
  111. end
  112. def test_method_equivalence
  113. c1 = C.new
  114. c2 = C.new
  115. d1 = D.new
  116. e1 = E.new
  117. c1_foo1 = c1.method(:foo)
  118. c1_foo2 = c1.method(:foo)
  119. assert_equal(c1_foo1, c1_foo2)
  120. assert_equal(C.instance_method(:foo).bind(d1), d1.method(:foo))
  121. assert_equal(C.instance_method(:foo).bind(e1), e1.method(:foo))
  122. assert_equal(D.instance_method(:foo).bind(e1), e1.method(:foo))
  123. assert_equal(D.instance_method(:bar).bind(e1), e1.method(:bar))
  124. assert_not_equal(c1_foo1, c2.method(:foo))
  125. end
  126. def test_direct_method_to_s
  127. c1 = C.new
  128. c2 = C.new
  129. d1 = D.new
  130. assert_equal("#<Method: #{C}#foo>", c1.method(:foo).to_s)
  131. assert_equal("#<Method: #{C}#bar>", c1.method(:bar).to_s)
  132. assert_equal("#<Method: #{D}#bar>", d1.method(:bar).to_s)
  133. assert_equal("#<Method: #{D}#xyz>", d1.method(:xyz).to_s)
  134. # non-singleton methods of singleton-ized methods should still
  135. # be treated as direct methods
  136. def c2.foo; [self, self, :foo]; end
  137. assert_equal("#<Method: #{c2}.foo>", c2.method(:foo).to_s)
  138. assert_equal("#<Method: #{C}#bar>", c2.method(:bar).to_s)
  139. end
  140. def test_indirect_method_to_s
  141. d = D.new
  142. e = E.new
  143. assert_equal("#<Method: #{D}(#{C})#foo>", d.method(:foo).to_s)
  144. assert_equal("#<Method: #{E}(#{C})#foo>", e.method(:foo).to_s)
  145. assert_equal("#<Method: #{E}(#{D})#bar>", e.method(:bar).to_s)
  146. end
  147. def test_method_rebind
  148. c1 = C.new
  149. c2 = C.new
  150. c3 = C.new
  151. def c3.bar; [self, self, :bar]; end
  152. d1 = D.new
  153. c1_foo = c1.method(:foo)
  154. c2_foo = c2.method(:foo)
  155. c3_bar = c3.method(:bar)
  156. d1_foo = d1.method(:foo)
  157. d1_bar = d1.method(:bar)
  158. assert_equal(c1_foo, c1_foo.unbind.bind(c1))
  159. assert_equal(c2_foo, c1_foo.unbind.bind(c2))
  160. assert_equal(c1_foo.unbind, c2_foo.unbind.bind(c2).unbind)
  161. assert_equal(d1_foo, c1_foo.unbind.bind(d1))
  162. assert_equal(c2_foo, c1_foo.unbind.bind(c2))
  163. assert_equal(c2.foo, c1_foo.unbind.bind(c2).call)
  164. assert_raise(TypeError) { c3_bar.unbind.bind(c1) }
  165. assert_raise(TypeError) { d1_bar.unbind.bind(c1) }
  166. end
  167. def test_method_redefinition
  168. f = F.new
  169. f_bar1 = f.method(:bar)
  170. F.class_eval do
  171. def bar; [self, :F, :bar]; end
  172. end
  173. f_bar2 = f.method(:bar)
  174. assert_not_equal(f_bar1, f_bar2)
  175. assert_equal([f, :C, :bar], f_bar1.call)
  176. assert_equal([f, :F, :bar], f_bar2.call)
  177. assert_equal(f_bar1, C.instance_method(:bar).bind(f))
  178. end
  179. def test_unbound_method_equivalence
  180. c1 = C.new
  181. c2 = C.new
  182. def c2.bar; [self, self, :bar]; end
  183. d1 = D.new
  184. e1 = E.new
  185. e2 = E.new
  186. def e2.foo; [self, self, :foo]; end
  187. unbind = lambda { |o, m| o.method(m).unbind }
  188. c1_foo = unbind[c1, :foo]
  189. c1_foo2 = unbind[c1, :foo]
  190. e1_foo = unbind[e1, :foo]
  191. assert_equal(c1_foo, c1_foo2)
  192. assert_equal(c1_foo, unbind[c2, :foo])
  193. assert_equal(unbind[e1, :bar], unbind[e2, :bar])
  194. assert_equal(unbind[e1, :xyz], unbind[e2, :xyz])
  195. assert_equal(unbind[e1, :qux], unbind[e2, :qux])
  196. assert_not_equal(unbind[c1, :bar], unbind[c2, :bar])
  197. assert_not_equal(c1_foo, unbind[d1, :foo])
  198. assert_not_equal(e1_foo, c1_foo)
  199. assert_not_equal(e1_foo, unbind[d1, :foo])
  200. assert_not_equal(e1_foo, unbind[e2, :foo])
  201. assert_not_equal(c1_foo, unbind[e2, :foo])
  202. c__foo = C.instance_method(:foo)
  203. c__bar = C.instance_method(:bar)
  204. d__foo = D.instance_method(:foo)
  205. e__foo = E.instance_method(:foo)
  206. e__xyz = E.instance_method(:xyz)
  207. assert_not_equal(c__foo, d__foo)
  208. assert_not_equal(c__foo, e__foo)
  209. assert_equal(c1_foo, c__foo)
  210. assert_equal(e1_foo, e__foo)
  211. assert_not_equal(unbind[e2, :foo], e__foo)
  212. end
  213. def test_unbound_method_to_s
  214. c1 = C.new
  215. c2 = C.new
  216. d1 = D.new
  217. unbind = lambda { |o, m| o.method(m).unbind }
  218. c1_foo_u = unbind[c1, :foo]
  219. c2_foo_u = unbind[c2, :foo]
  220. d1_foo_u = unbind[d1, :foo]
  221. assert_equal(c1_foo_u.to_s, c2_foo_u.to_s)
  222. assert_equal("#<UnboundMethod: #{C}#foo>", c1_foo_u.to_s)
  223. assert_equal("#<UnboundMethod: #{D}(#{C})#foo>", d1_foo_u.to_s)
  224. e1 = E.new
  225. sing_e1 =
  226. class << e1
  227. def xyz; [self, self, :xyz]; end
  228. self
  229. end
  230. e1_foo_u = e1.method(:foo).unbind
  231. e1_bar_u = e1.method(:bar).unbind
  232. e1_xyz_u = e1.method(:xyz).unbind
  233. assert_equal("#<UnboundMethod: #{E}(#{C})#foo>", e1_foo_u.to_s)
  234. assert_equal("#<UnboundMethod: #{E}(#{D})#bar>", e1_bar_u.to_s)
  235. assert_equal("#<UnboundMethod: #{sing_e1}#xyz>", e1_xyz_u.to_s)
  236. end
  237. end
  238. class TestCaching < Test::Unit::TestCase
  239. module Foo
  240. def the_method
  241. $THE_METHOD = 'Foo'
  242. end
  243. end
  244. def setup
  245. $a = Class.new do
  246. def the_method
  247. $THE_METHOD = 'A'
  248. end
  249. end.new
  250. end
  251. def test_extend
  252. 40.times do
  253. $a.the_method
  254. assert_equal "A", $THE_METHOD
  255. end
  256. $a.extend Foo
  257. 40.times do
  258. $a.the_method
  259. assert_equal "Foo", $THE_METHOD
  260. end
  261. end
  262. def test_alias
  263. 40.times do
  264. $a.the_method
  265. assert_equal "A", $THE_METHOD
  266. end
  267. $a.class.class_eval do
  268. def the_bar_method
  269. $THE_METHOD = "Bar"
  270. end
  271. alias_method :the_method, :the_bar_method
  272. end
  273. $a.the_method
  274. assert_equal "Bar", $THE_METHOD
  275. end
  276. def test_direct
  277. a = Class.new do
  278. def foo ; false ; end
  279. end
  280. obj = a.new
  281. assert !obj.foo
  282. a.class_eval do
  283. def foo ; true ; end
  284. end
  285. assert obj.foo, "redefined method used"
  286. assert_raise(NoMethodError) { obj.bar }
  287. a.class_eval do
  288. def bar ; true ; end
  289. end
  290. assert obj.bar, "newly defined method used"
  291. end
  292. def test_parent
  293. a = Class.new do
  294. def foo ; false ; end
  295. end
  296. b = Class.new(a)
  297. obj = b.new
  298. assert !obj.foo
  299. a.class_eval do
  300. def foo ; true ; end
  301. end
  302. assert obj.foo, "redefined method used"
  303. assert_raise(NoMethodError) { obj.bar }
  304. a.class_eval do
  305. def bar ; true ; end
  306. end
  307. assert obj.bar, "newly defined method used"
  308. end
  309. def test_parent_shadowed
  310. a = Class.new do
  311. def foo ; :a ; end
  312. end
  313. b = Class.new(a) do
  314. def foo ; :b ; end
  315. end
  316. obj = b.new
  317. assert_equal :b, obj.foo
  318. a.class_eval do
  319. def foo ; false ; end
  320. end
  321. assert_equal :b, obj.foo, "shadowed method not used"
  322. end
  323. def test_intermediate_ancestor
  324. a = Class.new do
  325. def foo ; :a ; end
  326. end
  327. b = Class.new(a)
  328. c = Class.new(b)
  329. obj = c.new
  330. assert_equal :a, obj.foo
  331. b.class_eval do
  332. def foo ; :b ; end
  333. end
  334. assert_equal :b, obj.foo, "new method used"
  335. b.class_eval do
  336. def foo ; :b2 ; end
  337. end
  338. assert_equal :b2, obj.foo, "redefined method used"
  339. assert_raise(NoMethodError) { obj.bar }
  340. b.class_eval do
  341. def bar ; true ; end
  342. end
  343. assert obj.bar, "newly defined method used"
  344. end
  345. def test_intermediate_module
  346. a = Class.new do
  347. def foo ; :a ; end
  348. end
  349. m = Module.new do
  350. def foo ; :m ; end
  351. end
  352. b = Class.new(a)
  353. c = Class.new(b)
  354. obj = c.new
  355. assert_equal :a, obj.foo
  356. b.class_eval do
  357. include m
  358. end
  359. assert_equal :m, obj.foo, "method from included module used"
  360. m.module_eval do
  361. def foo ; :m2 ; end
  362. end
  363. assert_equal :m2, obj.foo, "redefined method used"
  364. assert_raise(NoMethodError) { obj.bar }
  365. m.module_eval do
  366. def bar ; true ; end
  367. end
  368. assert obj.bar, "newly defined method used"
  369. end
  370. def test_class_singleton_intermediate
  371. a = Class.new
  372. def a.foo ; :a ; end
  373. b = Class.new(a)
  374. c = Class.new(b)
  375. assert_equal :a, c.foo
  376. def b.foo ; :b ; end
  377. assert_equal :b, c.foo, "new shadowing method used"
  378. def b.foo ; :b2 ; end
  379. assert_equal :b2, c.foo, "redefined method used"
  380. assert_raise(NoMethodError) { c.bar }
  381. def b.bar ; true ; end
  382. assert c.bar, "newly defined method used"
  383. end
  384. def test_class_singleton_intermediate_extension
  385. a = Class.new
  386. def a.foo ; :a ; end
  387. b = Class.new(a)
  388. c = Class.new(b)
  389. m = Module.new do
  390. def foo ; :m ; end
  391. end
  392. assert_equal :a, c.foo
  393. b.extend m
  394. assert_equal :m, c.foo, "method from extended module used"
  395. m.module_eval do
  396. def foo ; :m2 ; end
  397. end
  398. assert_equal :m2, c.foo, "redefined method used"
  399. assert_raise(NoMethodError) { c.bar }
  400. m.module_eval do
  401. def bar ; true ; end
  402. end
  403. assert c.bar, "newly defined method used"
  404. end
  405. # JRUBY-2646
  406. def test_methods_with_various_arity_and_blocks
  407. a = Class.new do
  408. def m()
  409. yield
  410. end
  411. def m1(a)
  412. yield
  413. end
  414. def m2(a,b)
  415. yield
  416. end
  417. def m3(a,b,c)
  418. yield
  419. end
  420. def m4(a,b,c,d)
  421. yield
  422. end
  423. end
  424. obj = a.new
  425. assert_equal(5, obj.m { 5 })
  426. assert_equal(5, obj.m1(1) { 5 })
  427. assert_equal(5, obj.m2(1,2) { 5 })
  428. assert_equal(5, obj.m3(1,2,3) { 5 })
  429. assert_equal(5, obj.m4(1,2,3,4) { 5 })
  430. end
  431. end