PageRenderTime 53ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

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

https://gitlab.com/essere.lab.public/qualitas.class-corpus
Ruby | 821 lines | 707 code | 112 blank | 2 comment | 4 complexity | d3145739eac8566fb5721c1a01e97f66 MD5 | raw file
  1. require 'test/unit'
  2. class TestProc < Test::Unit::TestCase
  3. def setup
  4. @verbose = $VERBOSE
  5. $VERBOSE = nil
  6. end
  7. def teardown
  8. $VERBOSE = @verbose
  9. end
  10. def test_proc
  11. p1 = proc{|i| i}
  12. assert_equal(2, p1.call(2))
  13. assert_equal(3, p1.call(3))
  14. p1 = proc{|i| i*2}
  15. assert_equal(4, p1.call(2))
  16. assert_equal(6, p1.call(3))
  17. p2 = nil
  18. x=0
  19. proc{
  20. iii=5 # nested local variable
  21. p1 = proc{|i|
  22. iii = i
  23. }
  24. p2 = proc {
  25. x = iii # nested variables shared by procs
  26. }
  27. # scope of nested variables
  28. assert(defined?(iii))
  29. }.call
  30. assert(!defined?(iii)) # out of scope
  31. loop{iii=5; assert(eval("defined? iii")); break}
  32. loop {
  33. iii = 10
  34. def self.dyna_var_check
  35. loop {
  36. assert(!defined?(iii))
  37. break
  38. }
  39. end
  40. dyna_var_check
  41. break
  42. }
  43. p1.call(5)
  44. p2.call
  45. assert_equal(5, x)
  46. end
  47. def assert_arity(n)
  48. meta = class << self; self; end
  49. meta.class_eval {define_method(:foo, Proc.new)}
  50. assert_equal(n, method(:foo).arity)
  51. end
  52. def test_arity
  53. assert_equal(0, proc{}.arity)
  54. assert_equal(0, proc{||}.arity)
  55. assert_equal(1, proc{|x|}.arity)
  56. assert_equal(2, proc{|x, y|}.arity)
  57. assert_equal(-2, proc{|x, *y|}.arity)
  58. assert_equal(-1, proc{|*x|}.arity)
  59. assert_equal(-1, proc{|*|}.arity)
  60. assert_equal(-3, proc{|x, *y, z|}.arity)
  61. assert_equal(-4, proc{|x, *y, z, a|}.arity)
  62. assert_arity(0) {}
  63. assert_arity(0) {||}
  64. assert_arity(1) {|x|}
  65. assert_arity(2) {|x, y|}
  66. assert_arity(-2) {|x, *y|}
  67. assert_arity(-3) {|x, *y, z|}
  68. assert_arity(-1) {|*x|}
  69. assert_arity(-1) {|*|}
  70. end
  71. def m(x)
  72. lambda { x }
  73. end
  74. def test_eq
  75. a = m(1)
  76. b = m(2)
  77. assert_not_equal(a, b, "[ruby-dev:22592]")
  78. assert_not_equal(a.call, b.call, "[ruby-dev:22592]")
  79. assert_not_equal(proc {||}, proc {|x,y|}, "[ruby-dev:22599]")
  80. a = lambda {|x| lambda {} }.call(1)
  81. b = lambda {}
  82. assert_not_equal(a, b, "[ruby-dev:22601]")
  83. end
  84. def test_block_par
  85. assert_equal(10, Proc.new{|&b| b.call(10)}.call {|x| x})
  86. assert_equal(12, Proc.new{|a,&b| b.call(a)}.call(12) {|x| x})
  87. end
  88. def test_safe
  89. safe = $SAFE
  90. c = Class.new
  91. x = c.new
  92. p = proc {
  93. $SAFE += 1
  94. proc {$SAFE}
  95. }.call
  96. assert_equal(safe, $SAFE)
  97. assert_equal(safe + 1, p.call)
  98. assert_equal(safe, $SAFE)
  99. c.class_eval {define_method(:safe, p)}
  100. assert_equal(safe, x.safe)
  101. assert_equal(safe, x.method(:safe).call)
  102. assert_equal(safe, x.method(:safe).to_proc.call)
  103. p = proc {$SAFE += 1}
  104. assert_equal(safe + 1, p.call)
  105. assert_equal(safe, $SAFE)
  106. c.class_eval {define_method(:inc, p)}
  107. assert_equal(safe + 1, proc {x.inc; $SAFE}.call)
  108. assert_equal(safe, $SAFE)
  109. assert_equal(safe + 1, proc {x.method(:inc).call; $SAFE}.call)
  110. assert_equal(safe, $SAFE)
  111. assert_equal(safe + 1, proc {x.method(:inc).to_proc.call; $SAFE}.call)
  112. assert_equal(safe, $SAFE)
  113. end
  114. def m2
  115. "OK"
  116. end
  117. def block
  118. method(:m2).to_proc
  119. end
  120. # [yarv-dev:777] block made by Method#to_proc
  121. def test_method_to_proc
  122. b = block()
  123. assert_equal "OK", b.call
  124. assert_instance_of(Binding, b.binding, '[ruby-core:25589]')
  125. end
  126. def test_curry
  127. b = proc {|x, y, z| (x||0) + (y||0) + (z||0) }
  128. assert_equal(6, b.curry[1][2][3])
  129. assert_equal(6, b.curry[1, 2][3, 4])
  130. assert_equal(6, b.curry(5)[1][2][3][4][5])
  131. assert_equal(6, b.curry(5)[1, 2][3, 4][5])
  132. assert_equal(1, b.curry(1)[1])
  133. b = proc {|x, y, z, *w| (x||0) + (y||0) + (z||0) + w.inject(0, &:+) }
  134. assert_equal(6, b.curry[1][2][3])
  135. assert_equal(10, b.curry[1, 2][3, 4])
  136. assert_equal(15, b.curry(5)[1][2][3][4][5])
  137. assert_equal(15, b.curry(5)[1, 2][3, 4][5])
  138. assert_equal(1, b.curry(1)[1])
  139. b = lambda {|x, y, z| (x||0) + (y||0) + (z||0) }
  140. assert_equal(6, b.curry[1][2][3])
  141. assert_raise(ArgumentError) { b.curry[1, 2][3, 4] }
  142. assert_raise(ArgumentError) { b.curry(5) }
  143. assert_raise(ArgumentError) { b.curry(1) }
  144. b = lambda {|x, y, z, *w| (x||0) + (y||0) + (z||0) + w.inject(0, &:+) }
  145. assert_equal(6, b.curry[1][2][3])
  146. assert_equal(10, b.curry[1, 2][3, 4])
  147. assert_equal(15, b.curry(5)[1][2][3][4][5])
  148. assert_equal(15, b.curry(5)[1, 2][3, 4][5])
  149. assert_raise(ArgumentError) { b.curry(1) }
  150. b = proc { :foo }
  151. assert_equal(:foo, b.curry[])
  152. b = lambda {|x, y, &blk| blk.call(x + y) }.curry
  153. b = b.call(2) { raise }
  154. b = b.call(3) {|x| x + 4 }
  155. assert_equal(9, b)
  156. l = proc {}
  157. assert_equal(false, l.lambda?)
  158. assert_equal(false, l.curry.lambda?, '[ruby-core:24127]')
  159. l = lambda {}
  160. assert_equal(true, l.lambda?)
  161. assert_equal(true, l.curry.lambda?, '[ruby-core:24127]')
  162. end
  163. def test_curry_ski_fib
  164. s = proc {|f, g, x| f[x][g[x]] }.curry
  165. k = proc {|x, y| x }.curry
  166. i = proc {|x| x }.curry
  167. fib = []
  168. inc = proc {|x| fib[-1] += 1; x }.curry
  169. ret = proc {|x| throw :end if fib.size > 10; fib << 0; x }.curry
  170. catch(:end) do
  171. s[
  172. s[s[i][i]][k[i]]
  173. ][
  174. k[inc]
  175. ][
  176. s[
  177. s[
  178. k[s]
  179. ][
  180. s[k[s[k[s]]]
  181. ][
  182. s[s[k[s]][s[k[s[k[ret]]]][s[k[s[i]]][k]]]][k]]
  183. ]
  184. ][
  185. k[s[k[s]][k]]
  186. ]
  187. ]
  188. end
  189. assert_equal(fib, [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89])
  190. end
  191. def test_curry_from_knownbug
  192. a = lambda {|x, y, &b| b }
  193. b = a.curry[1]
  194. assert_equal(:ok,
  195. if b.call(2){} == nil
  196. :ng
  197. else
  198. :ok
  199. end, 'moved from btest/knownbug, [ruby-core:15551]')
  200. end
  201. def test_dup_clone
  202. b = proc {|x| x + "bar" }
  203. class << b; attr_accessor :foo; end
  204. bd = b.dup
  205. assert_equal("foobar", bd.call("foo"))
  206. assert_raise(NoMethodError) { bd.foo = :foo }
  207. assert_raise(NoMethodError) { bd.foo }
  208. bc = b.clone
  209. assert_equal("foobar", bc.call("foo"))
  210. bc.foo = :foo
  211. assert_equal(:foo, bc.foo)
  212. end
  213. def test_binding
  214. b = proc {|x, y, z| proc {}.binding }.call(1, 2, 3)
  215. class << b; attr_accessor :foo; end
  216. bd = b.dup
  217. assert_equal([1, 2, 3], bd.eval("[x, y, z]"))
  218. assert_raise(NoMethodError) { bd.foo = :foo }
  219. assert_raise(NoMethodError) { bd.foo }
  220. bc = b.clone
  221. assert_equal([1, 2, 3], bc.eval("[x, y, z]"))
  222. bc.foo = :foo
  223. assert_equal(:foo, bc.foo)
  224. b = nil
  225. 1.times { x, y, z = 1, 2, 3; b = binding }
  226. assert_equal([1, 2, 3], b.eval("[x, y, z]"))
  227. end
  228. def test_proc_lambda
  229. assert_raise(ArgumentError) { proc }
  230. assert_raise(ArgumentError) { lambda }
  231. o = Object.new
  232. def o.foo
  233. b = nil
  234. 1.times { b = lambda }
  235. b
  236. end
  237. assert_equal(:foo, o.foo { :foo }.call)
  238. def o.foo(&b)
  239. b = nil
  240. 1.times { b = lambda }
  241. b
  242. end
  243. assert_equal(:foo, o.foo { :foo }.call)
  244. end
  245. def test_arity2
  246. assert_equal(0, method(:proc).to_proc.arity)
  247. assert_equal(-1, proc {}.curry.arity)
  248. c = Class.new
  249. c.class_eval { attr_accessor :foo }
  250. assert_equal(1, c.new.method(:foo=).to_proc.arity)
  251. end
  252. def test_proc_location
  253. t = Thread.new { sleep }
  254. assert_raise(ThreadError) { t.instance_eval { initialize { } } }
  255. t.kill
  256. end
  257. def test_eq2
  258. b1 = proc { }
  259. b2 = b1.dup
  260. assert(b1 == b2)
  261. end
  262. def test_to_proc
  263. b = proc { :foo }
  264. assert_equal(:foo, b.to_proc.call)
  265. end
  266. def test_localjump_error
  267. o = Object.new
  268. def foo; yield; end
  269. exc = foo rescue $!
  270. assert_nil(exc.exit_value)
  271. assert_equal(:noreason, exc.reason)
  272. end
  273. def test_binding2
  274. assert_raise(ArgumentError) { proc {}.curry.binding }
  275. end
  276. def test_proc_args_plain
  277. pr = proc {|a,b,c,d,e|
  278. [a,b,c,d,e]
  279. }
  280. assert_equal [nil,nil,nil,nil,nil], pr.call()
  281. assert_equal [1,nil,nil,nil,nil], pr.call(1)
  282. assert_equal [1,2,nil,nil,nil], pr.call(1,2)
  283. assert_equal [1,2,3,nil,nil], pr.call(1,2,3)
  284. assert_equal [1,2,3,4,nil], pr.call(1,2,3,4)
  285. assert_equal [1,2,3,4,5], pr.call(1,2,3,4,5)
  286. assert_equal [1,2,3,4,5], pr.call(1,2,3,4,5,6)
  287. assert_equal [nil,nil,nil,nil,nil], pr.call([])
  288. assert_equal [1,nil,nil,nil,nil], pr.call([1])
  289. assert_equal [1,2,nil,nil,nil], pr.call([1,2])
  290. assert_equal [1,2,3,nil,nil], pr.call([1,2,3])
  291. assert_equal [1,2,3,4,nil], pr.call([1,2,3,4])
  292. assert_equal [1,2,3,4,5], pr.call([1,2,3,4,5])
  293. assert_equal [1,2,3,4,5], pr.call([1,2,3,4,5,6])
  294. r = proc{|a| a}.call([1,2,3])
  295. assert_equal [1,2,3], r
  296. r = proc{|a,| a}.call([1,2,3])
  297. assert_equal 1, r
  298. r = proc{|a,| a}.call([])
  299. assert_equal nil, r
  300. end
  301. def test_proc_args_rest
  302. pr = proc {|a,b,c,*d|
  303. [a,b,c,d]
  304. }
  305. assert_equal [nil,nil,nil,[]], pr.call()
  306. assert_equal [1,nil,nil,[]], pr.call(1)
  307. assert_equal [1,2,nil,[]], pr.call(1,2)
  308. assert_equal [1,2,3,[]], pr.call(1,2,3)
  309. assert_equal [1,2,3,[4]], pr.call(1,2,3,4)
  310. assert_equal [1,2,3,[4,5]], pr.call(1,2,3,4,5)
  311. assert_equal [1,2,3,[4,5,6]], pr.call(1,2,3,4,5,6)
  312. assert_equal [nil,nil,nil,[]], pr.call([])
  313. assert_equal [1,nil,nil,[]], pr.call([1])
  314. assert_equal [1,2,nil,[]], pr.call([1,2])
  315. assert_equal [1,2,3,[]], pr.call([1,2,3])
  316. assert_equal [1,2,3,[4]], pr.call([1,2,3,4])
  317. assert_equal [1,2,3,[4,5]], pr.call([1,2,3,4,5])
  318. assert_equal [1,2,3,[4,5,6]], pr.call([1,2,3,4,5,6])
  319. r = proc{|*a| a}.call([1,2,3])
  320. assert_equal [[1,2,3]], r
  321. end
  322. def test_proc_args_rest_and_post
  323. pr = proc {|a,b,*c,d,e|
  324. [a,b,c,d,e]
  325. }
  326. assert_equal [nil, nil, [], nil, nil], pr.call()
  327. assert_equal [1, nil, [], nil, nil], pr.call(1)
  328. assert_equal [1, 2, [], nil, nil], pr.call(1,2)
  329. assert_equal [1, 2, [], 3, nil], pr.call(1,2,3)
  330. assert_equal [1, 2, [], 3, 4], pr.call(1,2,3,4)
  331. assert_equal [1, 2, [3], 4, 5], pr.call(1,2,3,4,5)
  332. assert_equal [1, 2, [3, 4], 5, 6], pr.call(1,2,3,4,5,6)
  333. assert_equal [1, 2, [3, 4, 5], 6,7], pr.call(1,2,3,4,5,6,7)
  334. assert_equal [nil, nil, [], nil, nil], pr.call([])
  335. assert_equal [1, nil, [], nil, nil], pr.call([1])
  336. assert_equal [1, 2, [], nil, nil], pr.call([1,2])
  337. assert_equal [1, 2, [], 3, nil], pr.call([1,2,3])
  338. assert_equal [1, 2, [], 3, 4], pr.call([1,2,3,4])
  339. assert_equal [1, 2, [3], 4, 5], pr.call([1,2,3,4,5])
  340. assert_equal [1, 2, [3, 4], 5, 6], pr.call([1,2,3,4,5,6])
  341. assert_equal [1, 2, [3, 4, 5], 6,7], pr.call([1,2,3,4,5,6,7])
  342. end
  343. def test_proc_args_opt
  344. pr = proc {|a,b,c=:c|
  345. [a,b,c]
  346. }
  347. assert_equal [nil, nil, :c], pr.call()
  348. assert_equal [1, nil, :c], pr.call(1)
  349. assert_equal [1, 2, :c], pr.call(1,2)
  350. assert_equal [1, 2, 3], pr.call(1,2,3)
  351. assert_equal [1, 2, 3], pr.call(1,2,3,4)
  352. assert_equal [1, 2, 3], pr.call(1,2,3,4,5)
  353. assert_equal [1, 2, 3], pr.call(1,2,3,4,5,6)
  354. assert_equal [nil, nil, :c], pr.call([])
  355. assert_equal [1, nil, :c], pr.call([1])
  356. assert_equal [1, 2, :c], pr.call([1,2])
  357. assert_equal [1, 2, 3], pr.call([1,2,3])
  358. assert_equal [1, 2, 3], pr.call([1,2,3,4])
  359. assert_equal [1, 2, 3], pr.call([1,2,3,4,5])
  360. assert_equal [1, 2, 3], pr.call([1,2,3,4,5,6])
  361. end
  362. def test_proc_args_opt_and_post
  363. pr = proc {|a,b,c=:c,d,e|
  364. [a,b,c,d,e]
  365. }
  366. assert_equal [nil, nil, :c, nil, nil], pr.call()
  367. assert_equal [1, nil, :c, nil, nil], pr.call(1)
  368. assert_equal [1, 2, :c, nil, nil], pr.call(1,2)
  369. assert_equal [1, 2, :c, 3, nil], pr.call(1,2,3)
  370. assert_equal [1, 2, :c, 3, 4], pr.call(1,2,3,4)
  371. assert_equal [1, 2, 3, 4, 5], pr.call(1,2,3,4,5)
  372. assert_equal [1, 2, 3, 4, 5], pr.call(1,2,3,4,5,6)
  373. assert_equal [nil, nil, :c, nil, nil], pr.call([])
  374. assert_equal [1, nil, :c, nil, nil], pr.call([1])
  375. assert_equal [1, 2, :c, nil, nil], pr.call([1,2])
  376. assert_equal [1, 2, :c, 3, nil], pr.call([1,2,3])
  377. assert_equal [1, 2, :c, 3, 4], pr.call([1,2,3,4])
  378. assert_equal [1, 2, 3, 4, 5], pr.call([1,2,3,4,5])
  379. assert_equal [1, 2, 3, 4, 5], pr.call([1,2,3,4,5,6])
  380. end
  381. def test_proc_args_opt_and_rest
  382. pr = proc {|a,b,c=:c,*d|
  383. [a,b,c,d]
  384. }
  385. assert_equal [nil, nil, :c, []], pr.call()
  386. assert_equal [1, nil, :c, []], pr.call(1)
  387. assert_equal [1, 2, :c, []], pr.call(1,2)
  388. assert_equal [1, 2, 3, []], pr.call(1,2,3)
  389. assert_equal [1, 2, 3, [4]], pr.call(1,2,3,4)
  390. assert_equal [1, 2, 3, [4, 5]], pr.call(1,2,3,4,5)
  391. assert_equal [nil, nil, :c, []], pr.call([])
  392. assert_equal [1, nil, :c, []], pr.call([1])
  393. assert_equal [1, 2, :c, []], pr.call([1,2])
  394. assert_equal [1, 2, 3, []], pr.call([1,2,3])
  395. assert_equal [1, 2, 3, [4]], pr.call([1,2,3,4])
  396. assert_equal [1, 2, 3, [4, 5]], pr.call([1,2,3,4,5])
  397. end
  398. def test_proc_args_opt_and_rest_and_post
  399. pr = proc {|a,b,c=:c,*d,e|
  400. [a,b,c,d,e]
  401. }
  402. assert_equal [nil, nil, :c, [], nil], pr.call()
  403. assert_equal [1, nil, :c, [], nil], pr.call(1)
  404. assert_equal [1, 2, :c, [], nil], pr.call(1,2)
  405. assert_equal [1, 2, :c, [], 3], pr.call(1,2,3)
  406. assert_equal [1, 2, 3, [], 4], pr.call(1,2,3,4)
  407. assert_equal [1, 2, 3, [4], 5], pr.call(1,2,3,4,5)
  408. assert_equal [1, 2, 3, [4,5], 6], pr.call(1,2,3,4,5,6)
  409. assert_equal [nil, nil, :c, [], nil], pr.call([])
  410. assert_equal [1, nil, :c, [], nil], pr.call([1])
  411. assert_equal [1, 2, :c, [], nil], pr.call([1,2])
  412. assert_equal [1, 2, :c, [], 3], pr.call([1,2,3])
  413. assert_equal [1, 2, 3, [], 4], pr.call([1,2,3,4])
  414. assert_equal [1, 2, 3, [4], 5], pr.call([1,2,3,4,5])
  415. assert_equal [1, 2, 3, [4,5], 6], pr.call([1,2,3,4,5,6])
  416. end
  417. def test_proc_args_block
  418. pr = proc {|a,b,&c|
  419. [a, b, c.class, c&&c.call(:x)]
  420. }
  421. assert_equal [nil, nil, NilClass, nil], pr.call()
  422. assert_equal [1, nil, NilClass, nil], pr.call(1)
  423. assert_equal [1, 2, NilClass, nil], pr.call(1,2)
  424. assert_equal [1, 2, NilClass, nil], pr.call(1,2,3)
  425. assert_equal [1, 2, NilClass, nil], pr.call(1,2,3,4)
  426. assert_equal [nil, nil, Proc, :proc], (pr.call(){ :proc })
  427. assert_equal [1, nil, Proc, :proc], (pr.call(1){ :proc })
  428. assert_equal [1, 2, Proc, :proc], (pr.call(1, 2){ :proc })
  429. assert_equal [1, 2, Proc, :proc], (pr.call(1, 2, 3){ :proc })
  430. assert_equal [1, 2, Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
  431. assert_equal [nil, nil, Proc, :x], (pr.call(){|x| x})
  432. assert_equal [1, nil, Proc, :x], (pr.call(1){|x| x})
  433. assert_equal [1, 2, Proc, :x], (pr.call(1, 2){|x| x})
  434. assert_equal [1, 2, Proc, :x], (pr.call(1, 2, 3){|x| x})
  435. assert_equal [1, 2, Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
  436. end
  437. def test_proc_args_rest_and_block
  438. pr = proc {|a,b,*c,&d|
  439. [a, b, c, d.class, d&&d.call(:x)]
  440. }
  441. assert_equal [nil, nil, [], NilClass, nil], pr.call()
  442. assert_equal [1, nil, [], NilClass, nil], pr.call(1)
  443. assert_equal [1, 2, [], NilClass, nil], pr.call(1,2)
  444. assert_equal [1, 2, [3], NilClass, nil], pr.call(1,2,3)
  445. assert_equal [1, 2, [3,4], NilClass, nil], pr.call(1,2,3,4)
  446. assert_equal [nil, nil, [], Proc, :proc], (pr.call(){ :proc })
  447. assert_equal [1, nil, [], Proc, :proc], (pr.call(1){ :proc })
  448. assert_equal [1, 2, [], Proc, :proc], (pr.call(1, 2){ :proc })
  449. assert_equal [1, 2, [3], Proc, :proc], (pr.call(1, 2, 3){ :proc })
  450. assert_equal [1, 2, [3,4], Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
  451. assert_equal [nil, nil, [], Proc, :x], (pr.call(){|x| x})
  452. assert_equal [1, nil, [], Proc, :x], (pr.call(1){|x| x})
  453. assert_equal [1, 2, [], Proc, :x], (pr.call(1, 2){|x| x})
  454. assert_equal [1, 2, [3], Proc, :x], (pr.call(1, 2, 3){|x| x})
  455. assert_equal [1, 2, [3,4], Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
  456. end
  457. def test_proc_args_rest_and_post_and_block
  458. pr = proc {|a,b,*c,d,e,&f|
  459. [a, b, c, d, e, f.class, f&&f.call(:x)]
  460. }
  461. assert_equal [nil, nil, [], nil, nil, NilClass, nil], pr.call()
  462. assert_equal [1, nil, [], nil, nil, NilClass, nil], pr.call(1)
  463. assert_equal [1, 2, [], nil, nil, NilClass, nil], pr.call(1,2)
  464. assert_equal [1, 2, [], 3, nil, NilClass, nil], pr.call(1,2,3)
  465. assert_equal [1, 2, [], 3, 4, NilClass, nil], pr.call(1,2,3,4)
  466. assert_equal [1, 2, [3], 4, 5, NilClass, nil], pr.call(1,2,3,4,5)
  467. assert_equal [1, 2, [3,4], 5, 6, NilClass, nil], pr.call(1,2,3,4,5,6)
  468. assert_equal [nil, nil, [], nil, nil, Proc, :proc], (pr.call(){ :proc })
  469. assert_equal [1, nil, [], nil, nil, Proc, :proc], (pr.call(1){ :proc })
  470. assert_equal [1, 2, [], nil, nil, Proc, :proc], (pr.call(1, 2){ :proc })
  471. assert_equal [1, 2, [], 3, nil, Proc, :proc], (pr.call(1, 2, 3){ :proc })
  472. assert_equal [1, 2, [], 3, 4, Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
  473. assert_equal [1, 2, [3], 4, 5, Proc, :proc], (pr.call(1, 2, 3, 4, 5){ :proc })
  474. assert_equal [1, 2, [3,4], 5, 6, Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6){ :proc })
  475. assert_equal [nil, nil, [], nil, nil, Proc, :x], (pr.call(){|x| x})
  476. assert_equal [1, nil, [], nil, nil, Proc, :x], (pr.call(1){|x| x})
  477. assert_equal [1, 2, [], nil, nil, Proc, :x], (pr.call(1, 2){|x| x})
  478. assert_equal [1, 2, [], 3, nil, Proc, :x], (pr.call(1, 2, 3){|x| x})
  479. assert_equal [1, 2, [], 3, 4, Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
  480. assert_equal [1, 2, [3], 4, 5, Proc, :x], (pr.call(1, 2, 3, 4, 5){|x| x})
  481. assert_equal [1, 2, [3,4], 5, 6, Proc, :x], (pr.call(1, 2, 3, 4, 5, 6){|x| x})
  482. end
  483. def test_proc_args_opt_and_block
  484. pr = proc {|a,b,c=:c,d=:d,&e|
  485. [a, b, c, d, e.class, e&&e.call(:x)]
  486. }
  487. assert_equal [nil, nil, :c, :d, NilClass, nil], pr.call()
  488. assert_equal [1, nil, :c, :d, NilClass, nil], pr.call(1)
  489. assert_equal [1, 2, :c, :d, NilClass, nil], pr.call(1,2)
  490. assert_equal [1, 2, 3, :d, NilClass, nil], pr.call(1,2,3)
  491. assert_equal [1, 2, 3, 4, NilClass, nil], pr.call(1,2,3,4)
  492. assert_equal [1, 2, 3, 4, NilClass, nil], pr.call(1,2,3,4,5)
  493. assert_equal [nil, nil, :c, :d, Proc, :proc], (pr.call(){ :proc })
  494. assert_equal [1, nil, :c, :d, Proc, :proc], (pr.call(1){ :proc })
  495. assert_equal [1, 2, :c, :d, Proc, :proc], (pr.call(1, 2){ :proc })
  496. assert_equal [1, 2, 3, :d, Proc, :proc], (pr.call(1, 2, 3){ :proc })
  497. assert_equal [1, 2, 3, 4, Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
  498. assert_equal [1, 2, 3, 4, Proc, :proc], (pr.call(1, 2, 3, 4, 5){ :proc })
  499. assert_equal [nil, nil, :c, :d, Proc, :x], (pr.call(){|x| x})
  500. assert_equal [1, nil, :c, :d, Proc, :x], (pr.call(1){|x| x})
  501. assert_equal [1, 2, :c, :d, Proc, :x], (pr.call(1, 2){|x| x})
  502. assert_equal [1, 2, 3, :d, Proc, :x], (pr.call(1, 2, 3){|x| x})
  503. assert_equal [1, 2, 3, 4, Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
  504. assert_equal [1, 2, 3, 4, Proc, :x], (pr.call(1, 2, 3, 4, 5){|x| x})
  505. end
  506. def test_proc_args_opt_and_post_and_block
  507. pr = proc {|a,b,c=:c,d=:d,e,f,&g|
  508. [a, b, c, d, e, f, g.class, g&&g.call(:x)]
  509. }
  510. assert_equal [nil, nil, :c, :d, nil, nil, NilClass, nil], pr.call()
  511. assert_equal [1, nil, :c, :d, nil, nil, NilClass, nil], pr.call(1)
  512. assert_equal [1, 2, :c, :d, nil, nil, NilClass, nil], pr.call(1,2)
  513. assert_equal [1, 2, :c, :d, 3, nil, NilClass, nil], pr.call(1,2,3)
  514. assert_equal [1, 2, :c, :d, 3, 4, NilClass, nil], pr.call(1,2,3,4)
  515. assert_equal [1, 2, 3, :d, 4, 5, NilClass, nil], pr.call(1,2,3,4,5)
  516. assert_equal [1, 2, 3, 4, 5, 6, NilClass, nil], pr.call(1,2,3,4,5,6)
  517. assert_equal [1, 2, 3, 4, 5, 6, NilClass, nil], pr.call(1,2,3,4,5,6,7)
  518. assert_equal [nil, nil, :c, :d, nil, nil, Proc, :proc], (pr.call(){ :proc })
  519. assert_equal [1, nil, :c, :d, nil, nil, Proc, :proc], (pr.call(1){ :proc })
  520. assert_equal [1, 2, :c, :d, nil, nil, Proc, :proc], (pr.call(1, 2){ :proc })
  521. assert_equal [1, 2, :c, :d, 3, nil, Proc, :proc], (pr.call(1, 2, 3){ :proc })
  522. assert_equal [1, 2, :c, :d, 3, 4, Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
  523. assert_equal [1, 2, 3, :d, 4, 5, Proc, :proc], (pr.call(1, 2, 3, 4, 5){ :proc })
  524. assert_equal [1, 2, 3, 4, 5, 6, Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6){ :proc })
  525. assert_equal [1, 2, 3, 4, 5, 6, Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6, 7){ :proc })
  526. assert_equal [nil, nil, :c, :d, nil, nil, Proc, :x], (pr.call(){|x| x})
  527. assert_equal [1, nil, :c, :d, nil, nil, Proc, :x], (pr.call(1){|x| x})
  528. assert_equal [1, 2, :c, :d, nil, nil, Proc, :x], (pr.call(1, 2){|x| x})
  529. assert_equal [1, 2, :c, :d, 3, nil, Proc, :x], (pr.call(1, 2, 3){|x| x})
  530. assert_equal [1, 2, :c, :d, 3, 4, Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
  531. assert_equal [1, 2, 3, :d, 4, 5, Proc, :x], (pr.call(1, 2, 3, 4, 5){|x| x})
  532. assert_equal [1, 2, 3, 4, 5, 6, Proc, :x], (pr.call(1, 2, 3, 4, 5, 6){|x| x})
  533. assert_equal [1, 2, 3, 4, 5, 6, Proc, :x], (pr.call(1, 2, 3, 4, 5, 6, 7){|x| x})
  534. end
  535. def test_proc_args_opt_and_block2
  536. pr = proc {|a,b,c=:c,d=:d,*e,&f|
  537. [a, b, c, d, e, f.class, f&&f.call(:x)]
  538. }
  539. assert_equal [nil, nil, :c, :d, [], NilClass, nil], pr.call()
  540. assert_equal [1, nil, :c, :d, [], NilClass, nil], pr.call(1)
  541. assert_equal [1, 2, :c, :d, [], NilClass, nil], pr.call(1,2)
  542. assert_equal [1, 2, 3, :d, [], NilClass, nil], pr.call(1,2,3)
  543. assert_equal [1, 2, 3, 4, [], NilClass, nil], pr.call(1,2,3,4)
  544. assert_equal [1, 2, 3, 4, [5], NilClass, nil], pr.call(1,2,3,4,5)
  545. assert_equal [1, 2, 3, 4, [5,6], NilClass, nil], pr.call(1,2,3,4,5,6)
  546. assert_equal [nil, nil, :c, :d, [], Proc, :proc], (pr.call(){ :proc })
  547. assert_equal [1, nil, :c, :d, [], Proc, :proc], (pr.call(1){ :proc })
  548. assert_equal [1, 2, :c, :d, [], Proc, :proc], (pr.call(1, 2){ :proc })
  549. assert_equal [1, 2, 3, :d, [], Proc, :proc], (pr.call(1, 2, 3){ :proc })
  550. assert_equal [1, 2, 3, 4, [], Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
  551. assert_equal [1, 2, 3, 4, [5], Proc, :proc], (pr.call(1, 2, 3, 4, 5){ :proc })
  552. assert_equal [1, 2, 3, 4, [5,6], Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6){ :proc })
  553. assert_equal [nil, nil, :c, :d, [], Proc, :x], (pr.call(){|x| x})
  554. assert_equal [1, nil, :c, :d, [], Proc, :x], (pr.call(1){|x| x})
  555. assert_equal [1, 2, :c, :d, [], Proc, :x], (pr.call(1, 2){|x| x})
  556. assert_equal [1, 2, 3, :d, [], Proc, :x], (pr.call(1, 2, 3){|x| x})
  557. assert_equal [1, 2, 3, 4, [], Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
  558. assert_equal [1, 2, 3, 4, [5], Proc, :x], (pr.call(1, 2, 3, 4, 5){|x| x})
  559. assert_equal [1, 2, 3, 4, [5,6], Proc, :x], (pr.call(1, 2, 3, 4, 5, 6){|x| x})
  560. end
  561. def test_proc_args_opt_and_rest_and_post_and_block
  562. pr = proc {|a,b,c=:c,d=:d,*e,f,g,&h|
  563. [a, b, c, d, e, f, g, h.class, h&&h.call(:x)]
  564. }
  565. assert_equal [nil, nil, :c, :d, [], nil, nil, NilClass, nil], pr.call()
  566. assert_equal [1, nil, :c, :d, [], nil, nil, NilClass, nil], pr.call(1)
  567. assert_equal [1, 2, :c, :d, [], nil, nil, NilClass, nil], pr.call(1,2)
  568. assert_equal [1, 2, :c, :d, [], 3, nil, NilClass, nil], pr.call(1,2,3)
  569. assert_equal [1, 2, :c, :d, [], 3, 4, NilClass, nil], pr.call(1,2,3,4)
  570. assert_equal [1, 2, 3, :d, [], 4, 5, NilClass, nil], pr.call(1,2,3,4,5)
  571. assert_equal [1, 2, 3, 4, [], 5, 6, NilClass, nil], pr.call(1,2,3,4,5,6)
  572. assert_equal [1, 2, 3, 4, [5], 6, 7, NilClass, nil], pr.call(1,2,3,4,5,6,7)
  573. assert_equal [1, 2, 3, 4, [5,6], 7, 8, NilClass, nil], pr.call(1,2,3,4,5,6,7,8)
  574. assert_equal [nil, nil, :c, :d, [], nil, nil, Proc, :proc], (pr.call(){ :proc })
  575. assert_equal [1, nil, :c, :d, [], nil, nil, Proc, :proc], (pr.call(1){ :proc })
  576. assert_equal [1, 2, :c, :d, [], nil, nil, Proc, :proc], (pr.call(1, 2){ :proc })
  577. assert_equal [1, 2, :c, :d, [], 3, nil, Proc, :proc], (pr.call(1, 2, 3){ :proc })
  578. assert_equal [1, 2, :c, :d, [], 3, 4, Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
  579. assert_equal [1, 2, 3, :d, [], 4, 5, Proc, :proc], (pr.call(1, 2, 3, 4, 5){ :proc })
  580. assert_equal [1, 2, 3, 4, [], 5, 6, Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6){ :proc })
  581. assert_equal [1, 2, 3, 4, [5], 6, 7, Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6, 7){ :proc })
  582. assert_equal [1, 2, 3, 4, [5,6], 7, 8, Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6, 7, 8){ :proc })
  583. assert_equal [nil, nil, :c, :d, [], nil, nil, Proc, :x], (pr.call(){|x| x})
  584. assert_equal [1, nil, :c, :d, [], nil, nil, Proc, :x], (pr.call(1){|x| x})
  585. assert_equal [1, 2, :c, :d, [], nil, nil, Proc, :x], (pr.call(1, 2){|x| x})
  586. assert_equal [1, 2, :c, :d, [], 3, nil, Proc, :x], (pr.call(1, 2, 3){|x| x})
  587. assert_equal [1, 2, :c, :d, [], 3, 4, Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
  588. assert_equal [1, 2, 3, :d, [], 4, 5, Proc, :x], (pr.call(1, 2, 3, 4, 5){|x| x})
  589. assert_equal [1, 2, 3, 4, [], 5, 6, Proc, :x], (pr.call(1, 2, 3, 4, 5, 6){|x| x})
  590. assert_equal [1, 2, 3, 4, [5], 6, 7, Proc, :x], (pr.call(1, 2, 3, 4, 5, 6, 7){|x| x})
  591. assert_equal [1, 2, 3, 4, [5,6], 7, 8, Proc, :x], (pr.call(1, 2, 3, 4, 5, 6, 7, 8){|x| x})
  592. end
  593. def test_proc_args_unleashed
  594. r = proc {|a,b=1,*c,d,e|
  595. [a,b,c,d,e]
  596. }.call(1,2,3,4,5)
  597. assert_equal([1,2,[3],4,5], r, "[ruby-core:19485]")
  598. end
  599. def test_parameters
  600. assert_equal([], proc {}.parameters)
  601. assert_equal([], proc {||}.parameters)
  602. assert_equal([[:opt, :a]], proc {|a|}.parameters)
  603. assert_equal([[:opt, :a], [:opt, :b]], proc {|a, b|}.parameters)
  604. assert_equal([[:opt, :a], [:block, :b]], proc {|a=:a, &b|}.parameters)
  605. assert_equal([[:opt, :a], [:opt, :b]], proc {|a, b=:b|}.parameters)
  606. assert_equal([[:rest, :a]], proc {|*a|}.parameters)
  607. assert_equal([[:opt, :a], [:rest, :b], [:block, :c]], proc {|a, *b, &c|}.parameters)
  608. assert_equal([[:opt, :a], [:rest, :b], [:opt, :c]], proc {|a, *b, c|}.parameters)
  609. assert_equal([[:opt, :a], [:rest, :b], [:opt, :c], [:block, :d]], proc {|a, *b, c, &d|}.parameters)
  610. assert_equal([[:opt, :a], [:opt, :b], [:rest, :c], [:opt, :d], [:block, :e]], proc {|a, b=:b, *c, d, &e|}.parameters)
  611. assert_equal([[:opt, nil], [:block, :b]], proc {|(a), &b|}.parameters)
  612. assert_equal([[:opt, :a], [:opt, :b], [:opt, :c], [:opt, :d], [:rest, :e], [:opt, :f], [:opt, :g], [:block, :h]], proc {|a,b,c=:c,d=:d,*e,f,g,&h|}.parameters)
  613. assert_equal([[:req]], method(:putc).parameters)
  614. assert_equal([[:rest]], method(:p).parameters)
  615. end
  616. def pm0() end
  617. def pm1(a) end
  618. def pm2(a, b) end
  619. def pmo1(a = :a, &b) end
  620. def pmo2(a, b = :b) end
  621. def pmo3(*a) end
  622. def pmo4(a, *b, &c) end
  623. def pmo5(a, *b, c) end
  624. def pmo6(a, *b, c, &d) end
  625. def pmo7(a, b = :b, *c, d, &e) end
  626. def pma1((a), &b) end
  627. def test_bound_parameters
  628. assert_equal([], method(:pm0).to_proc.parameters)
  629. assert_equal([[:req, :a]], method(:pm1).to_proc.parameters)
  630. assert_equal([[:req, :a], [:req, :b]], method(:pm2).to_proc.parameters)
  631. assert_equal([[:opt, :a], [:block, :b]], method(:pmo1).to_proc.parameters)
  632. assert_equal([[:req, :a], [:opt, :b]], method(:pmo2).to_proc.parameters)
  633. assert_equal([[:rest, :a]], method(:pmo3).to_proc.parameters)
  634. assert_equal([[:req, :a], [:rest, :b], [:block, :c]], method(:pmo4).to_proc.parameters)
  635. assert_equal([[:req, :a], [:rest, :b], [:req, :c]], method(:pmo5).to_proc.parameters)
  636. assert_equal([[:req, :a], [:rest, :b], [:req, :c], [:block, :d]], method(:pmo6).to_proc.parameters)
  637. assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:block, :e]], method(:pmo7).to_proc.parameters)
  638. assert_equal([[:req], [:block, :b]], method(:pma1).to_proc.parameters)
  639. assert_equal([], "".method(:upcase).to_proc.parameters)
  640. assert_equal([[:rest]], "".method(:gsub).to_proc.parameters)
  641. assert_equal([[:rest]], proc {}.curry.parameters)
  642. end
  643. def test_to_s
  644. assert_match(/^#<Proc:0x\h+@#{ Regexp.quote(__FILE__) }:\d+>$/, proc {}.to_s)
  645. assert_match(/^#<Proc:0x\h+@#{ Regexp.quote(__FILE__) }:\d+ \(lambda\)>$/, lambda {}.to_s)
  646. assert_match(/^#<Proc:0x\h+ \(lambda\)>$/, method(:p).to_proc.to_s)
  647. x = proc {}
  648. x.taint
  649. assert(x.to_s.tainted?)
  650. end
  651. @@line_of_source_location_test = __LINE__ + 1
  652. def source_location_test a=1,
  653. b=2
  654. end
  655. def test_source_location
  656. file, lineno = method(:source_location_test).source_location
  657. assert_match(/^#{ Regexp.quote(__FILE__) }$/, file)
  658. assert_equal(@@line_of_source_location_test, lineno, 'Bug #2427')
  659. end
  660. @@line_of_attr_reader_source_location_test = __LINE__ + 3
  661. @@line_of_attr_writer_source_location_test = __LINE__ + 3
  662. @@line_of_attr_accessor_source_location_test = __LINE__ + 3
  663. attr_reader :attr_reader_source_location_test
  664. attr_writer :attr_writer_source_location_test
  665. attr_accessor :attr_accessor_source_location_test
  666. def test_attr_source_location
  667. file, lineno = method(:attr_reader_source_location_test).source_location
  668. assert_match(/^#{ Regexp.quote(__FILE__) }$/, file)
  669. assert_equal(@@line_of_attr_reader_source_location_test, lineno)
  670. file, lineno = method(:attr_writer_source_location_test=).source_location
  671. assert_match(/^#{ Regexp.quote(__FILE__) }$/, file)
  672. assert_equal(@@line_of_attr_writer_source_location_test, lineno)
  673. file, lineno = method(:attr_accessor_source_location_test).source_location
  674. assert_match(/^#{ Regexp.quote(__FILE__) }$/, file)
  675. assert_equal(@@line_of_attr_accessor_source_location_test, lineno)
  676. file, lineno = method(:attr_accessor_source_location_test=).source_location
  677. assert_match(/^#{ Regexp.quote(__FILE__) }$/, file)
  678. assert_equal(@@line_of_attr_accessor_source_location_test, lineno)
  679. end
  680. def test_splat_without_respond_to
  681. def (obj = Object.new).respond_to?(m,*); false end
  682. [obj].each do |a, b|
  683. assert_equal([obj, nil], [a, b], '[ruby-core:24139]')
  684. end
  685. end
  686. def test_curry_with_trace
  687. bug3751 = '[ruby-core:31871]'
  688. set_trace_func(proc {})
  689. test_curry
  690. ensure
  691. set_trace_func(nil)
  692. end
  693. def test_block_propagation
  694. bug3792 = '[ruby-core:32075]'
  695. c = Class.new do
  696. def foo
  697. yield
  698. end
  699. end
  700. o = c.new
  701. f = :foo.to_proc
  702. assert_nothing_raised(LocalJumpError, bug3792) {
  703. assert_equal('bar', f.(o) {'bar'}, bug3792)
  704. }
  705. assert_nothing_raised(LocalJumpError, bug3792) {
  706. assert_equal('zot', o.method(:foo).to_proc.() {'zot'}, bug3792)
  707. }
  708. end
  709. end