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

/test/ruby/test_proc.rb

http://github.com/ruby/ruby
Ruby | 1617 lines | 1405 code | 207 blank | 5 comment | 11 complexity | 4ceb8f7736343fbc859274214e7c704e MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause, AGPL-3.0

Large files files are truncated, but you can click here to view the full file

  1. # frozen_string_literal: false
  2. require 'test/unit'
  3. class TestProc < Test::Unit::TestCase
  4. def setup
  5. @verbose = $VERBOSE
  6. $VERBOSE = nil
  7. end
  8. def teardown
  9. $VERBOSE = @verbose
  10. end
  11. def test_proc
  12. p1 = proc{|i| i}
  13. assert_equal(2, p1.call(2))
  14. assert_equal(3, p1.call(3))
  15. p1 = proc{|i| i*2}
  16. assert_equal(4, p1.call(2))
  17. assert_equal(6, p1.call(3))
  18. p2 = nil
  19. x=0
  20. proc{
  21. iii=5 # nested local variable
  22. p1 = proc{|i|
  23. iii = i
  24. }
  25. p2 = proc {
  26. x = iii # nested variables shared by procs
  27. }
  28. # scope of nested variables
  29. assert(defined?(iii))
  30. }.call
  31. assert(!defined?(iii)) # out of scope
  32. loop{iii=iii=5; assert(eval("defined? iii")); break}
  33. loop {
  34. iii=iii = 10
  35. def self.dyna_var_check
  36. loop {
  37. assert(!defined?(iii))
  38. break
  39. }
  40. end
  41. dyna_var_check
  42. break
  43. }
  44. p1.call(5)
  45. p2.call
  46. assert_equal(5, x)
  47. end
  48. def assert_arity(n)
  49. meta = class << self; self; end
  50. b = assert_warn(/Capturing the given block using Proc\.new is deprecated/) do
  51. Proc.new
  52. end
  53. meta.class_eval {
  54. remove_method(:foo_arity) if method_defined?(:foo_arity)
  55. define_method(:foo_arity, b)
  56. }
  57. assert_equal(n, method(:foo_arity).arity)
  58. end
  59. def test_arity
  60. assert_equal(0, proc{}.arity)
  61. assert_equal(0, proc{||}.arity)
  62. assert_equal(1, proc{|x|}.arity)
  63. assert_equal(0, proc{|x=1|}.arity)
  64. assert_equal(2, proc{|x, y|}.arity)
  65. assert_equal(1, proc{|x=0, y|}.arity)
  66. assert_equal(0, proc{|x=0, y=0|}.arity)
  67. assert_equal(1, proc{|x, y=0|}.arity)
  68. assert_equal(-2, proc{|x, *y|}.arity)
  69. assert_equal(-1, proc{|x=0, *y|}.arity)
  70. assert_equal(-1, proc{|*x|}.arity)
  71. assert_equal(-1, proc{|*|}.arity)
  72. assert_equal(-3, proc{|x, *y, z|}.arity)
  73. assert_equal(-2, proc{|x=0, *y, z|}.arity)
  74. assert_equal(2, proc{|(x, y), z|[x,y]}.arity)
  75. assert_equal(1, proc{|(x, y), z=0|[x,y]}.arity)
  76. assert_equal(-4, proc{|x, *y, z, a|}.arity)
  77. assert_equal(0, proc{|**|}.arity)
  78. assert_equal(0, proc{|**o|}.arity)
  79. assert_equal(1, proc{|x, **o|}.arity)
  80. assert_equal(0, proc{|x=0, **o|}.arity)
  81. assert_equal(1, proc{|x, y=0, **o|}.arity)
  82. assert_equal(2, proc{|x, y=0, z, **o|}.arity)
  83. assert_equal(-3, proc{|x, y=0, *z, w, **o|}.arity)
  84. assert_equal(2, proc{|x, y=0, z, a:1|}.arity)
  85. assert_equal(3, proc{|x, y=0, z, a:|}.arity)
  86. assert_equal(-4, proc{|x, y, *rest, a:, b:, c:|}.arity)
  87. assert_equal(3, proc{|x, y=0, z, a:, **o|}.arity)
  88. assert_equal(0, lambda{}.arity)
  89. assert_equal(0, lambda{||}.arity)
  90. assert_equal(1, lambda{|x|}.arity)
  91. assert_equal(-1, lambda{|x=1|}.arity) # different from proc
  92. assert_equal(2, lambda{|x, y|}.arity)
  93. assert_equal(-2, lambda{|x=0, y|}.arity) # different from proc
  94. assert_equal(-1, lambda{|x=0, y=0|}.arity) # different from proc
  95. assert_equal(-2, lambda{|x, y=0|}.arity) # different from proc
  96. assert_equal(-2, lambda{|x, *y|}.arity)
  97. assert_equal(-1, lambda{|x=0, *y|}.arity)
  98. assert_equal(-1, lambda{|*x|}.arity)
  99. assert_equal(-1, lambda{|*|}.arity)
  100. assert_equal(-3, lambda{|x, *y, z|}.arity)
  101. assert_equal(-2, lambda{|x=0, *y, z|}.arity)
  102. assert_equal(2, lambda{|(x, y), z|[x,y]}.arity)
  103. assert_equal(-2, lambda{|(x, y), z=0|[x,y]}.arity)
  104. assert_equal(-4, lambda{|x, *y, z, a|}.arity)
  105. assert_equal(-1, lambda{|**|}.arity)
  106. assert_equal(-1, lambda{|**o|}.arity)
  107. assert_equal(-2, lambda{|x, **o|}.arity)
  108. assert_equal(-1, lambda{|x=0, **o|}.arity)
  109. assert_equal(-2, lambda{|x, y=0, **o|}.arity)
  110. assert_equal(-3, lambda{|x, y=0, z, **o|}.arity)
  111. assert_equal(-3, lambda{|x, y=0, *z, w, **o|}.arity)
  112. assert_arity(0) {}
  113. assert_arity(0) {||}
  114. assert_arity(1) {|x|}
  115. assert_arity(2) {|x, y|}
  116. assert_arity(-2) {|x, *y|}
  117. assert_arity(-3) {|x, *y, z|}
  118. assert_arity(-1) {|*x|}
  119. assert_arity(-1) {|*|}
  120. assert_arity(-1) {|**o|}
  121. assert_arity(-1) {|**|}
  122. assert_arity(-2) {|x, *y, **|}
  123. assert_arity(-3) {|x, *y, z, **|}
  124. end
  125. def m(x)
  126. lambda { x }
  127. end
  128. def test_eq
  129. a = m(1)
  130. b = m(2)
  131. assert_not_equal(a, b, "[ruby-dev:22592]")
  132. assert_not_equal(a.call, b.call, "[ruby-dev:22592]")
  133. assert_not_equal(proc {||}, proc {|x,y|}, "[ruby-dev:22599]")
  134. a = lambda {|x| lambda {} }.call(1)
  135. b = lambda {}
  136. assert_not_equal(a, b, "[ruby-dev:22601]")
  137. end
  138. def test_block_par
  139. assert_equal(10, Proc.new{|&b| b.call(10)}.call {|x| x})
  140. assert_equal(12, Proc.new{|a,&b| b.call(a)}.call(12) {|x| x})
  141. end
  142. def m2
  143. "OK"
  144. end
  145. def block
  146. method(:m2).to_proc
  147. end
  148. def m1(var)
  149. var
  150. end
  151. def m_block_given?
  152. m1(block_given?)
  153. end
  154. # [yarv-dev:777] block made by Method#to_proc
  155. def test_method_to_proc
  156. b = block()
  157. assert_equal "OK", b.call
  158. b = b.binding
  159. assert_instance_of(Binding, b, '[ruby-core:25589]')
  160. bug10432 = '[ruby-core:65919] [Bug #10432]'
  161. assert_same(self, b.receiver, bug10432)
  162. assert_not_send [b, :local_variable_defined?, :value]
  163. assert_raise(NameError) {
  164. b.local_variable_get(:value)
  165. }
  166. assert_equal 42, b.local_variable_set(:value, 42)
  167. assert_send [b, :local_variable_defined?, :value]
  168. assert_equal 42, b.local_variable_get(:value)
  169. end
  170. def test_block_given_method
  171. m = method(:m_block_given?)
  172. assert(!m.call, "without block")
  173. assert(m.call {}, "with block")
  174. assert(!m.call, "without block second")
  175. end
  176. def test_block_given_method_to_proc
  177. bug8341 = '[Bug #8341]'
  178. m = method(:m_block_given?).to_proc
  179. assert(!m.call, "#{bug8341} without block")
  180. assert(m.call {}, "#{bug8341} with block")
  181. assert(!m.call, "#{bug8341} without block second")
  182. end
  183. def test_block_persist_between_calls
  184. bug8341 = '[Bug #8341]'
  185. o = Object.new
  186. def o.m1(top=true)
  187. if top
  188. [block_given?, @m.call(false)]
  189. else
  190. block_given?
  191. end
  192. end
  193. m = o.method(:m1).to_proc
  194. o.instance_variable_set(:@m, m)
  195. assert_equal([true, false], m.call {}, "#{bug8341} nested with block")
  196. assert_equal([false, false], m.call, "#{bug8341} nested without block")
  197. end
  198. def test_curry_proc
  199. b = proc {|x, y, z| (x||0) + (y||0) + (z||0) }
  200. assert_equal(6, b.curry[1][2][3])
  201. assert_equal(6, b.curry[1, 2][3, 4])
  202. assert_equal(6, b.curry(5)[1][2][3][4][5])
  203. assert_equal(6, b.curry(5)[1, 2][3, 4][5])
  204. assert_equal(1, b.curry(1)[1])
  205. end
  206. def test_curry_proc_splat
  207. b = proc {|x, y, z, *w| (x||0) + (y||0) + (z||0) + w.inject(0, &:+) }
  208. assert_equal(6, b.curry[1][2][3])
  209. assert_equal(10, b.curry[1, 2][3, 4])
  210. assert_equal(15, b.curry(5)[1][2][3][4][5])
  211. assert_equal(15, b.curry(5)[1, 2][3, 4][5])
  212. assert_equal(1, b.curry(1)[1])
  213. end
  214. def test_curry_lambda
  215. b = lambda {|x, y, z| (x||0) + (y||0) + (z||0) }
  216. assert_equal(6, b.curry[1][2][3])
  217. assert_raise(ArgumentError) { b.curry[1, 2][3, 4] }
  218. assert_raise(ArgumentError) { b.curry(5) }
  219. assert_raise(ArgumentError) { b.curry(1) }
  220. end
  221. def test_curry_lambda_splat
  222. b = lambda {|x, y, z, *w| (x||0) + (y||0) + (z||0) + w.inject(0, &:+) }
  223. assert_equal(6, b.curry[1][2][3])
  224. assert_equal(10, b.curry[1, 2][3, 4])
  225. assert_equal(15, b.curry(5)[1][2][3][4][5])
  226. assert_equal(15, b.curry(5)[1, 2][3, 4][5])
  227. assert_raise(ArgumentError) { b.curry(1) }
  228. end
  229. def test_curry_no_arguments
  230. b = proc { :foo }
  231. assert_equal(:foo, b.curry[])
  232. end
  233. def test_curry_given_blocks
  234. b = lambda {|x, y, &blk| blk.call(x + y) }.curry
  235. b = b.call(2) { raise }
  236. b = b.call(3) {|x| x + 4 }
  237. assert_equal(9, b)
  238. end
  239. def test_lambda?
  240. l = proc {}
  241. assert_equal(false, l.lambda?)
  242. assert_equal(false, l.curry.lambda?, '[ruby-core:24127]')
  243. assert_equal(false, proc(&l).lambda?)
  244. assert_equal(false, lambda(&l).lambda?)
  245. assert_equal(false, Proc.new(&l).lambda?)
  246. l = lambda {}
  247. assert_equal(true, l.lambda?)
  248. assert_equal(true, l.curry.lambda?, '[ruby-core:24127]')
  249. assert_equal(true, proc(&l).lambda?)
  250. assert_equal(true, lambda(&l).lambda?)
  251. assert_equal(true, Proc.new(&l).lambda?)
  252. end
  253. def test_curry_ski_fib
  254. s = proc {|f, g, x| f[x][g[x]] }.curry
  255. k = proc {|x, y| x }.curry
  256. i = proc {|x| x }.curry
  257. fib = []
  258. inc = proc {|x| fib[-1] += 1; x }.curry
  259. ret = proc {|x| throw :end if fib.size > 10; fib << 0; x }.curry
  260. catch(:end) do
  261. s[
  262. s[s[i][i]][k[i]]
  263. ][
  264. k[inc]
  265. ][
  266. s[
  267. s[
  268. k[s]
  269. ][
  270. s[k[s[k[s]]]
  271. ][
  272. s[s[k[s]][s[k[s[k[ret]]]][s[k[s[i]]][k]]]][k]]
  273. ]
  274. ][
  275. k[s[k[s]][k]]
  276. ]
  277. ]
  278. end
  279. assert_equal(fib, [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89])
  280. end
  281. def test_curry_passed_block
  282. a = lambda {|x, y, &b| b }
  283. b = a.curry[1]
  284. assert_not_nil(b.call(2){}, '[ruby-core:15551]: passed block to curried block')
  285. end
  286. def test_curry_instance_exec
  287. a = lambda { |x, y| [x + y, self] }
  288. b = a.curry.call(1)
  289. result = instance_exec 2, &b
  290. assert_equal(3, result[0])
  291. assert_equal(self, result[1])
  292. end
  293. def test_curry_optional_params
  294. obj = Object.new
  295. def obj.foo(a, b=42); end
  296. assert_raise(ArgumentError) { obj.method(:foo).to_proc.curry(3) }
  297. assert_raise(ArgumentError) { ->(a, b=42){}.curry(3) }
  298. end
  299. def test_dup_clone
  300. b = proc {|x| x + "bar" }
  301. class << b; attr_accessor :foo; end
  302. bd = b.dup
  303. assert_equal("foobar", bd.call("foo"))
  304. assert_raise(NoMethodError) { bd.foo = :foo }
  305. assert_raise(NoMethodError) { bd.foo }
  306. bc = b.clone
  307. assert_equal("foobar", bc.call("foo"))
  308. bc.foo = :foo
  309. assert_equal(:foo, bc.foo)
  310. end
  311. def test_binding
  312. b = proc {|x, y, z| proc {}.binding }.call(1, 2, 3)
  313. class << b; attr_accessor :foo; end
  314. bd = b.dup
  315. assert_equal([1, 2, 3], bd.eval("[x, y, z]"))
  316. assert_raise(NoMethodError) { bd.foo = :foo }
  317. assert_raise(NoMethodError) { bd.foo }
  318. bc = b.clone
  319. assert_equal([1, 2, 3], bc.eval("[x, y, z]"))
  320. bc.foo = :foo
  321. assert_equal(:foo, bc.foo)
  322. b = nil
  323. 1.times { x, y, z = 1, 2, 3; [x,y,z]; b = binding }
  324. assert_equal([1, 2, 3], b.eval("[x, y, z]"))
  325. end
  326. def test_binding_source_location
  327. b, expected_location = binding, [__FILE__, __LINE__]
  328. assert_equal(expected_location, b.source_location)
  329. file, lineno = method(:source_location_test).to_proc.binding.source_location
  330. assert_match(/^#{ Regexp.quote(__FILE__) }$/, file)
  331. assert_equal(@@line_of_source_location_test, lineno, 'Bug #2427')
  332. end
  333. def test_proc_lambda
  334. assert_raise(ArgumentError) { proc }
  335. assert_raise(ArgumentError) { lambda }
  336. o = Object.new
  337. def o.foo
  338. b = nil
  339. 1.times { b = lambda }
  340. b
  341. end
  342. assert_raise(ArgumentError) {o.foo { :foo }.call}
  343. def o.foo(&b)
  344. b = nil
  345. 1.times { b = lambda }
  346. b
  347. end
  348. assert_raise(ArgumentError) {o.foo { :foo }.call}
  349. end
  350. def test_arity2
  351. assert_equal(0, method(:proc).to_proc.arity)
  352. assert_equal(-1, proc {}.curry.arity)
  353. c = Class.new
  354. c.class_eval { attr_accessor :foo }
  355. assert_equal(1, c.new.method(:foo=).to_proc.arity)
  356. end
  357. def test_proc_location
  358. t = Thread.new { sleep }
  359. assert_raise(ThreadError) { t.instance_eval { initialize { } } }
  360. t.kill
  361. t.join
  362. end
  363. def test_to_proc
  364. b = proc { :foo }
  365. assert_equal(:foo, b.to_proc.call)
  366. end
  367. def test_localjump_error
  368. o = o = Object.new
  369. def foo; yield; end
  370. exc = foo rescue $!
  371. assert_nil(exc.exit_value)
  372. assert_equal(:noreason, exc.reason)
  373. end
  374. def test_curry_binding
  375. assert_raise(ArgumentError) { proc {}.curry.binding }
  376. end
  377. def test_proc_args_plain
  378. pr = proc {|a,b,c,d,e|
  379. [a,b,c,d,e]
  380. }
  381. assert_equal [nil,nil,nil,nil,nil], pr.call()
  382. assert_equal [1,nil,nil,nil,nil], pr.call(1)
  383. assert_equal [1,2,nil,nil,nil], pr.call(1,2)
  384. assert_equal [1,2,3,nil,nil], pr.call(1,2,3)
  385. assert_equal [1,2,3,4,nil], pr.call(1,2,3,4)
  386. assert_equal [1,2,3,4,5], pr.call(1,2,3,4,5)
  387. assert_equal [1,2,3,4,5], pr.call(1,2,3,4,5,6)
  388. assert_equal [nil,nil,nil,nil,nil], pr.call([])
  389. assert_equal [1,nil,nil,nil,nil], pr.call([1])
  390. assert_equal [1,2,nil,nil,nil], pr.call([1,2])
  391. assert_equal [1,2,3,nil,nil], pr.call([1,2,3])
  392. assert_equal [1,2,3,4,nil], pr.call([1,2,3,4])
  393. assert_equal [1,2,3,4,5], pr.call([1,2,3,4,5])
  394. assert_equal [1,2,3,4,5], pr.call([1,2,3,4,5,6])
  395. r = proc{|a| a}.call([1,2,3])
  396. assert_equal [1,2,3], r
  397. r = proc{|a,| a}.call([1,2,3])
  398. assert_equal 1, r
  399. r = proc{|a,| a}.call([])
  400. assert_equal nil, r
  401. end
  402. def test_proc_args_rest
  403. pr = proc {|a,b,c,*d|
  404. [a,b,c,d]
  405. }
  406. assert_equal [nil,nil,nil,[]], pr.call()
  407. assert_equal [1,nil,nil,[]], pr.call(1)
  408. assert_equal [1,2,nil,[]], pr.call(1,2)
  409. assert_equal [1,2,3,[]], pr.call(1,2,3)
  410. assert_equal [1,2,3,[4]], pr.call(1,2,3,4)
  411. assert_equal [1,2,3,[4,5]], pr.call(1,2,3,4,5)
  412. assert_equal [1,2,3,[4,5,6]], pr.call(1,2,3,4,5,6)
  413. assert_equal [nil,nil,nil,[]], pr.call([])
  414. assert_equal [1,nil,nil,[]], pr.call([1])
  415. assert_equal [1,2,nil,[]], pr.call([1,2])
  416. assert_equal [1,2,3,[]], pr.call([1,2,3])
  417. assert_equal [1,2,3,[4]], pr.call([1,2,3,4])
  418. assert_equal [1,2,3,[4,5]], pr.call([1,2,3,4,5])
  419. assert_equal [1,2,3,[4,5,6]], pr.call([1,2,3,4,5,6])
  420. r = proc{|*a| a}.call([1,2,3])
  421. assert_equal [[1,2,3]], r
  422. end
  423. def test_proc_args_pos_rest_post
  424. pr = proc {|a,b,*c,d,e|
  425. [a,b,c,d,e]
  426. }
  427. assert_equal [nil, nil, [], nil, nil], pr.call()
  428. assert_equal [1, nil, [], nil, nil], pr.call(1)
  429. assert_equal [1, 2, [], nil, nil], pr.call(1,2)
  430. assert_equal [1, 2, [], 3, nil], pr.call(1,2,3)
  431. assert_equal [1, 2, [], 3, 4], pr.call(1,2,3,4)
  432. assert_equal [1, 2, [3], 4, 5], pr.call(1,2,3,4,5)
  433. assert_equal [1, 2, [3, 4], 5, 6], pr.call(1,2,3,4,5,6)
  434. assert_equal [1, 2, [3, 4, 5], 6,7], pr.call(1,2,3,4,5,6,7)
  435. assert_equal [nil, nil, [], nil, nil], pr.call([])
  436. assert_equal [1, nil, [], nil, nil], pr.call([1])
  437. assert_equal [1, 2, [], nil, nil], pr.call([1,2])
  438. assert_equal [1, 2, [], 3, nil], pr.call([1,2,3])
  439. assert_equal [1, 2, [], 3, 4], pr.call([1,2,3,4])
  440. assert_equal [1, 2, [3], 4, 5], pr.call([1,2,3,4,5])
  441. assert_equal [1, 2, [3, 4], 5, 6], pr.call([1,2,3,4,5,6])
  442. assert_equal [1, 2, [3, 4, 5], 6,7], pr.call([1,2,3,4,5,6,7])
  443. end
  444. def test_proc_args_rest_post
  445. pr = proc {|*a,b,c|
  446. [a,b,c]
  447. }
  448. assert_equal [[], nil, nil], pr.call()
  449. assert_equal [[], 1, nil], pr.call(1)
  450. assert_equal [[], 1, 2], pr.call(1,2)
  451. assert_equal [[1], 2, 3], pr.call(1,2,3)
  452. assert_equal [[1, 2], 3, 4], pr.call(1,2,3,4)
  453. assert_equal [[1, 2, 3], 4, 5], pr.call(1,2,3,4,5)
  454. assert_equal [[1, 2, 3, 4], 5, 6], pr.call(1,2,3,4,5,6)
  455. assert_equal [[1, 2, 3, 4, 5], 6,7], pr.call(1,2,3,4,5,6,7)
  456. assert_equal [[], nil, nil], pr.call([])
  457. assert_equal [[], 1, nil], pr.call([1])
  458. assert_equal [[], 1, 2], pr.call([1,2])
  459. assert_equal [[1], 2, 3], pr.call([1,2,3])
  460. assert_equal [[1, 2], 3, 4], pr.call([1,2,3,4])
  461. assert_equal [[1, 2, 3], 4, 5], pr.call([1,2,3,4,5])
  462. assert_equal [[1, 2, 3, 4], 5, 6], pr.call([1,2,3,4,5,6])
  463. assert_equal [[1, 2, 3, 4, 5], 6,7], pr.call([1,2,3,4,5,6,7])
  464. end
  465. def test_proc_args_pos_opt
  466. pr = proc {|a,b,c=:c|
  467. [a,b,c]
  468. }
  469. assert_equal [nil, nil, :c], pr.call()
  470. assert_equal [1, nil, :c], pr.call(1)
  471. assert_equal [1, 2, :c], pr.call(1,2)
  472. assert_equal [1, 2, 3], pr.call(1,2,3)
  473. assert_equal [1, 2, 3], pr.call(1,2,3,4)
  474. assert_equal [1, 2, 3], pr.call(1,2,3,4,5)
  475. assert_equal [1, 2, 3], pr.call(1,2,3,4,5,6)
  476. assert_equal [nil, nil, :c], pr.call([])
  477. assert_equal [1, nil, :c], pr.call([1])
  478. assert_equal [1, 2, :c], pr.call([1,2])
  479. assert_equal [1, 2, 3], pr.call([1,2,3])
  480. assert_equal [1, 2, 3], pr.call([1,2,3,4])
  481. assert_equal [1, 2, 3], pr.call([1,2,3,4,5])
  482. assert_equal [1, 2, 3], pr.call([1,2,3,4,5,6])
  483. end
  484. def test_proc_args_opt
  485. pr = proc {|a=:a,b=:b,c=:c|
  486. [a,b,c]
  487. }
  488. assert_equal [:a, :b, :c], pr.call()
  489. assert_equal [1, :b, :c], pr.call(1)
  490. assert_equal [1, 2, :c], pr.call(1,2)
  491. assert_equal [1, 2, 3], pr.call(1,2,3)
  492. assert_equal [1, 2, 3], pr.call(1,2,3,4)
  493. assert_equal [1, 2, 3], pr.call(1,2,3,4,5)
  494. assert_equal [1, 2, 3], pr.call(1,2,3,4,5,6)
  495. assert_equal [:a, :b, :c], pr.call([])
  496. assert_equal [1, :b, :c], pr.call([1])
  497. assert_equal [1, 2, :c], pr.call([1,2])
  498. assert_equal [1, 2, 3], pr.call([1,2,3])
  499. assert_equal [1, 2, 3], pr.call([1,2,3,4])
  500. assert_equal [1, 2, 3], pr.call([1,2,3,4,5])
  501. assert_equal [1, 2, 3], pr.call([1,2,3,4,5,6])
  502. end
  503. def test_proc_args_opt_single
  504. bug7621 = '[ruby-dev:46801]'
  505. pr = proc {|a=:a|
  506. a
  507. }
  508. assert_equal :a, pr.call()
  509. assert_equal 1, pr.call(1)
  510. assert_equal 1, pr.call(1,2)
  511. assert_equal [], pr.call([]), bug7621
  512. assert_equal [1], pr.call([1]), bug7621
  513. assert_equal [1, 2], pr.call([1,2]), bug7621
  514. assert_equal [1, 2, 3], pr.call([1,2,3]), bug7621
  515. assert_equal [1, 2, 3, 4], pr.call([1,2,3,4]), bug7621
  516. end
  517. def test_proc_args_pos_opt_post
  518. pr = proc {|a,b,c=:c,d,e|
  519. [a,b,c,d,e]
  520. }
  521. assert_equal [nil, nil, :c, nil, nil], pr.call()
  522. assert_equal [1, nil, :c, nil, nil], pr.call(1)
  523. assert_equal [1, 2, :c, nil, nil], pr.call(1,2)
  524. assert_equal [1, 2, :c, 3, nil], pr.call(1,2,3)
  525. assert_equal [1, 2, :c, 3, 4], pr.call(1,2,3,4)
  526. assert_equal [1, 2, 3, 4, 5], pr.call(1,2,3,4,5)
  527. assert_equal [1, 2, 3, 4, 5], pr.call(1,2,3,4,5,6)
  528. assert_equal [nil, nil, :c, nil, nil], pr.call([])
  529. assert_equal [1, nil, :c, nil, nil], pr.call([1])
  530. assert_equal [1, 2, :c, nil, nil], pr.call([1,2])
  531. assert_equal [1, 2, :c, 3, nil], pr.call([1,2,3])
  532. assert_equal [1, 2, :c, 3, 4], pr.call([1,2,3,4])
  533. assert_equal [1, 2, 3, 4, 5], pr.call([1,2,3,4,5])
  534. assert_equal [1, 2, 3, 4, 5], pr.call([1,2,3,4,5,6])
  535. end
  536. def test_proc_args_opt_post
  537. pr = proc {|a=:a,b=:b,c=:c,d,e|
  538. [a,b,c,d,e]
  539. }
  540. assert_equal [:a, :b, :c, nil, nil], pr.call()
  541. assert_equal [:a, :b, :c, 1, nil], pr.call(1)
  542. assert_equal [:a, :b, :c, 1, 2], pr.call(1,2)
  543. assert_equal [1, :b, :c, 2, 3], pr.call(1,2,3)
  544. assert_equal [1, 2, :c, 3, 4], pr.call(1,2,3,4)
  545. assert_equal [1, 2, 3, 4, 5], pr.call(1,2,3,4,5)
  546. assert_equal [1, 2, 3, 4, 5], pr.call(1,2,3,4,5,6)
  547. assert_equal [:a, :b, :c, nil, nil], pr.call([])
  548. assert_equal [:a, :b, :c, 1, nil], pr.call([1])
  549. assert_equal [:a, :b, :c, 1, 2], pr.call([1,2])
  550. assert_equal [1, :b, :c, 2, 3], pr.call([1,2,3])
  551. assert_equal [1, 2, :c, 3, 4], pr.call([1,2,3,4])
  552. assert_equal [1, 2, 3, 4, 5], pr.call([1,2,3,4,5])
  553. assert_equal [1, 2, 3, 4, 5], pr.call([1,2,3,4,5,6])
  554. end
  555. def test_proc_args_pos_opt_rest
  556. pr = proc {|a,b,c=:c,*d|
  557. [a,b,c,d]
  558. }
  559. assert_equal [nil, nil, :c, []], pr.call()
  560. assert_equal [1, nil, :c, []], pr.call(1)
  561. assert_equal [1, 2, :c, []], pr.call(1,2)
  562. assert_equal [1, 2, 3, []], pr.call(1,2,3)
  563. assert_equal [1, 2, 3, [4]], pr.call(1,2,3,4)
  564. assert_equal [1, 2, 3, [4, 5]], pr.call(1,2,3,4,5)
  565. assert_equal [nil, nil, :c, []], pr.call([])
  566. assert_equal [1, nil, :c, []], pr.call([1])
  567. assert_equal [1, 2, :c, []], pr.call([1,2])
  568. assert_equal [1, 2, 3, []], pr.call([1,2,3])
  569. assert_equal [1, 2, 3, [4]], pr.call([1,2,3,4])
  570. assert_equal [1, 2, 3, [4, 5]], pr.call([1,2,3,4,5])
  571. end
  572. def test_proc_args_opt_rest
  573. pr = proc {|a=:a,b=:b,c=:c,*d|
  574. [a,b,c,d]
  575. }
  576. assert_equal [:a, :b, :c, []], pr.call()
  577. assert_equal [1, :b, :c, []], pr.call(1)
  578. assert_equal [1, 2, :c, []], pr.call(1,2)
  579. assert_equal [1, 2, 3, []], pr.call(1,2,3)
  580. assert_equal [1, 2, 3, [4]], pr.call(1,2,3,4)
  581. assert_equal [1, 2, 3, [4, 5]], pr.call(1,2,3,4,5)
  582. assert_equal [:a, :b, :c, []], pr.call([])
  583. assert_equal [1, :b, :c, []], pr.call([1])
  584. assert_equal [1, 2, :c, []], pr.call([1,2])
  585. assert_equal [1, 2, 3, []], pr.call([1,2,3])
  586. assert_equal [1, 2, 3, [4]], pr.call([1,2,3,4])
  587. assert_equal [1, 2, 3, [4, 5]], pr.call([1,2,3,4,5])
  588. end
  589. def test_proc_args_pos_opt_rest_post
  590. pr = proc {|a,b,c=:c,*d,e|
  591. [a,b,c,d,e]
  592. }
  593. assert_equal [nil, nil, :c, [], nil], pr.call()
  594. assert_equal [1, nil, :c, [], nil], pr.call(1)
  595. assert_equal [1, 2, :c, [], nil], pr.call(1,2)
  596. assert_equal [1, 2, :c, [], 3], pr.call(1,2,3)
  597. assert_equal [1, 2, 3, [], 4], pr.call(1,2,3,4)
  598. assert_equal [1, 2, 3, [4], 5], pr.call(1,2,3,4,5)
  599. assert_equal [1, 2, 3, [4,5], 6], pr.call(1,2,3,4,5,6)
  600. assert_equal [nil, nil, :c, [], nil], pr.call([])
  601. assert_equal [1, nil, :c, [], nil], pr.call([1])
  602. assert_equal [1, 2, :c, [], nil], pr.call([1,2])
  603. assert_equal [1, 2, :c, [], 3], pr.call([1,2,3])
  604. assert_equal [1, 2, 3, [], 4], pr.call([1,2,3,4])
  605. assert_equal [1, 2, 3, [4], 5], pr.call([1,2,3,4,5])
  606. assert_equal [1, 2, 3, [4,5], 6], pr.call([1,2,3,4,5,6])
  607. end
  608. def test_proc_args_opt_rest_post
  609. pr = proc {|a=:a,b=:b,c=:c,*d,e|
  610. [a,b,c,d,e]
  611. }
  612. assert_equal [:a, :b, :c, [], nil], pr.call()
  613. assert_equal [:a, :b, :c, [], 1], pr.call(1)
  614. assert_equal [1, :b, :c, [], 2], pr.call(1,2)
  615. assert_equal [1, 2, :c, [], 3], pr.call(1,2,3)
  616. assert_equal [1, 2, 3, [], 4], pr.call(1,2,3,4)
  617. assert_equal [1, 2, 3, [4], 5], pr.call(1,2,3,4,5)
  618. assert_equal [1, 2, 3, [4,5], 6], pr.call(1,2,3,4,5,6)
  619. assert_equal [:a, :b, :c, [], nil], pr.call([])
  620. assert_equal [:a, :b, :c, [], 1], pr.call([1])
  621. assert_equal [1, :b, :c, [], 2], pr.call([1,2])
  622. assert_equal [1, 2, :c, [], 3], pr.call([1,2,3])
  623. assert_equal [1, 2, 3, [], 4], pr.call([1,2,3,4])
  624. assert_equal [1, 2, 3, [4], 5], pr.call([1,2,3,4,5])
  625. assert_equal [1, 2, 3, [4,5], 6], pr.call([1,2,3,4,5,6])
  626. end
  627. def test_proc_args_pos_block
  628. pr = proc {|a,b,&c|
  629. [a, b, c.class, c&&c.call(:x)]
  630. }
  631. assert_equal [nil, nil, NilClass, nil], pr.call()
  632. assert_equal [1, nil, NilClass, nil], pr.call(1)
  633. assert_equal [1, 2, NilClass, nil], pr.call(1,2)
  634. assert_equal [1, 2, NilClass, nil], pr.call(1,2,3)
  635. assert_equal [1, 2, NilClass, nil], pr.call(1,2,3,4)
  636. assert_equal [nil, nil, NilClass, nil], pr.call([])
  637. assert_equal [1, nil, NilClass, nil], pr.call([1])
  638. assert_equal [1, 2, NilClass, nil], pr.call([1,2])
  639. assert_equal [1, 2, NilClass, nil], pr.call([1,2,3])
  640. assert_equal [1, 2, NilClass, nil], pr.call([1,2,3,4])
  641. assert_equal [nil, nil, Proc, :proc], (pr.call(){ :proc })
  642. assert_equal [1, nil, Proc, :proc], (pr.call(1){ :proc })
  643. assert_equal [1, 2, Proc, :proc], (pr.call(1, 2){ :proc })
  644. assert_equal [1, 2, Proc, :proc], (pr.call(1, 2, 3){ :proc })
  645. assert_equal [1, 2, Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
  646. assert_equal [nil, nil, Proc, :x], (pr.call(){|x| x})
  647. assert_equal [1, nil, Proc, :x], (pr.call(1){|x| x})
  648. assert_equal [1, 2, Proc, :x], (pr.call(1, 2){|x| x})
  649. assert_equal [1, 2, Proc, :x], (pr.call(1, 2, 3){|x| x})
  650. assert_equal [1, 2, Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
  651. end
  652. def test_proc_args_pos_rest_block
  653. pr = proc {|a,b,*c,&d|
  654. [a, b, c, d.class, d&&d.call(:x)]
  655. }
  656. assert_equal [nil, nil, [], NilClass, nil], pr.call()
  657. assert_equal [1, nil, [], NilClass, nil], pr.call(1)
  658. assert_equal [1, 2, [], NilClass, nil], pr.call(1,2)
  659. assert_equal [1, 2, [3], NilClass, nil], pr.call(1,2,3)
  660. assert_equal [1, 2, [3,4], NilClass, nil], pr.call(1,2,3,4)
  661. assert_equal [nil, nil, [], Proc, :proc], (pr.call(){ :proc })
  662. assert_equal [1, nil, [], Proc, :proc], (pr.call(1){ :proc })
  663. assert_equal [1, 2, [], Proc, :proc], (pr.call(1, 2){ :proc })
  664. assert_equal [1, 2, [3], Proc, :proc], (pr.call(1, 2, 3){ :proc })
  665. assert_equal [1, 2, [3,4], Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
  666. assert_equal [nil, nil, [], Proc, :x], (pr.call(){|x| x})
  667. assert_equal [1, nil, [], Proc, :x], (pr.call(1){|x| x})
  668. assert_equal [1, 2, [], Proc, :x], (pr.call(1, 2){|x| x})
  669. assert_equal [1, 2, [3], Proc, :x], (pr.call(1, 2, 3){|x| x})
  670. assert_equal [1, 2, [3,4], Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
  671. end
  672. def test_proc_args_rest_block
  673. pr = proc {|*c,&d|
  674. [c, d.class, d&&d.call(:x)]
  675. }
  676. assert_equal [[], NilClass, nil], pr.call()
  677. assert_equal [[1], NilClass, nil], pr.call(1)
  678. assert_equal [[1, 2], NilClass, nil], pr.call(1,2)
  679. assert_equal [[], Proc, :proc], (pr.call(){ :proc })
  680. assert_equal [[1], Proc, :proc], (pr.call(1){ :proc })
  681. assert_equal [[1, 2], Proc, :proc], (pr.call(1, 2){ :proc })
  682. assert_equal [[], Proc, :x], (pr.call(){|x| x})
  683. assert_equal [[1], Proc, :x], (pr.call(1){|x| x})
  684. assert_equal [[1, 2], Proc, :x], (pr.call(1, 2){|x| x})
  685. end
  686. def test_proc_args_only_rest
  687. pr = proc {|*c| c }
  688. assert_equal [], pr.call()
  689. assert_equal [1], pr.call(1)
  690. assert_equal [[1]], pr.call([1])
  691. assert_equal [1, 2], pr.call(1,2)
  692. assert_equal [[1, 2]], pr.call([1,2])
  693. end
  694. def test_proc_args_rest_kw
  695. pr = proc {|*c, a: 1| [c, a] }
  696. assert_equal [[], 1], pr.call()
  697. assert_equal [[1], 1], pr.call(1)
  698. assert_equal [[[1]], 1], pr.call([1])
  699. assert_equal [[1, 2], 1], pr.call(1,2)
  700. assert_equal [[[1, 2]], 1], pr.call([1,2])
  701. end
  702. def test_proc_args_rest_kwsplat
  703. pr = proc {|*c, **kw| [c, kw] }
  704. assert_equal [[], {}], pr.call()
  705. assert_equal [[1], {}], pr.call(1)
  706. assert_equal [[[1]], {}], pr.call([1])
  707. assert_equal [[1, 2], {}], pr.call(1,2)
  708. assert_equal [[[1, 2]], {}], pr.call([1,2])
  709. end
  710. def test_proc_args_pos_rest_post_block
  711. pr = proc {|a,b,*c,d,e,&f|
  712. [a, b, c, d, e, f.class, f&&f.call(:x)]
  713. }
  714. assert_equal [nil, nil, [], nil, nil, NilClass, nil], pr.call()
  715. assert_equal [1, nil, [], nil, nil, NilClass, nil], pr.call(1)
  716. assert_equal [1, 2, [], nil, nil, NilClass, nil], pr.call(1,2)
  717. assert_equal [1, 2, [], 3, nil, NilClass, nil], pr.call(1,2,3)
  718. assert_equal [1, 2, [], 3, 4, NilClass, nil], pr.call(1,2,3,4)
  719. assert_equal [1, 2, [3], 4, 5, NilClass, nil], pr.call(1,2,3,4,5)
  720. assert_equal [1, 2, [3,4], 5, 6, NilClass, nil], pr.call(1,2,3,4,5,6)
  721. assert_equal [nil, nil, [], nil, nil, Proc, :proc], (pr.call(){ :proc })
  722. assert_equal [1, nil, [], nil, nil, Proc, :proc], (pr.call(1){ :proc })
  723. assert_equal [1, 2, [], nil, nil, Proc, :proc], (pr.call(1, 2){ :proc })
  724. assert_equal [1, 2, [], 3, nil, Proc, :proc], (pr.call(1, 2, 3){ :proc })
  725. assert_equal [1, 2, [], 3, 4, Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
  726. assert_equal [1, 2, [3], 4, 5, Proc, :proc], (pr.call(1, 2, 3, 4, 5){ :proc })
  727. assert_equal [1, 2, [3,4], 5, 6, Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6){ :proc })
  728. assert_equal [nil, nil, [], nil, nil, Proc, :x], (pr.call(){|x| x})
  729. assert_equal [1, nil, [], nil, nil, Proc, :x], (pr.call(1){|x| x})
  730. assert_equal [1, 2, [], nil, nil, Proc, :x], (pr.call(1, 2){|x| x})
  731. assert_equal [1, 2, [], 3, nil, Proc, :x], (pr.call(1, 2, 3){|x| x})
  732. assert_equal [1, 2, [], 3, 4, Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
  733. assert_equal [1, 2, [3], 4, 5, Proc, :x], (pr.call(1, 2, 3, 4, 5){|x| x})
  734. assert_equal [1, 2, [3,4], 5, 6, Proc, :x], (pr.call(1, 2, 3, 4, 5, 6){|x| x})
  735. end
  736. def test_proc_args_rest_post_block
  737. pr = proc {|*c,d,e,&f|
  738. [c, d, e, f.class, f&&f.call(:x)]
  739. }
  740. assert_equal [[], nil, nil, NilClass, nil], pr.call()
  741. assert_equal [[], 1, nil, NilClass, nil], pr.call(1)
  742. assert_equal [[], 1, 2, NilClass, nil], pr.call(1,2)
  743. assert_equal [[1], 2, 3, NilClass, nil], pr.call(1,2,3)
  744. assert_equal [[1, 2], 3, 4, NilClass, nil], pr.call(1,2,3,4)
  745. assert_equal [[], nil, nil, Proc, :proc], (pr.call(){ :proc })
  746. assert_equal [[], 1, nil, Proc, :proc], (pr.call(1){ :proc })
  747. assert_equal [[], 1, 2, Proc, :proc], (pr.call(1, 2){ :proc })
  748. assert_equal [[1], 2, 3, Proc, :proc], (pr.call(1, 2, 3){ :proc })
  749. assert_equal [[1, 2], 3, 4, Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
  750. assert_equal [[], nil, nil, Proc, :x], (pr.call(){|x| x})
  751. assert_equal [[], 1, nil, Proc, :x], (pr.call(1){|x| x})
  752. assert_equal [[], 1, 2, Proc, :x], (pr.call(1, 2){|x| x})
  753. assert_equal [[1], 2, 3, Proc, :x], (pr.call(1, 2, 3){|x| x})
  754. assert_equal [[1, 2], 3, 4, Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
  755. end
  756. def test_proc_args_pos_opt_block
  757. pr = proc {|a,b,c=:c,d=:d,&e|
  758. [a, b, c, d, e.class, e&&e.call(:x)]
  759. }
  760. assert_equal [nil, nil, :c, :d, NilClass, nil], pr.call()
  761. assert_equal [1, nil, :c, :d, NilClass, nil], pr.call(1)
  762. assert_equal [1, 2, :c, :d, NilClass, nil], pr.call(1,2)
  763. assert_equal [1, 2, 3, :d, NilClass, nil], pr.call(1,2,3)
  764. assert_equal [1, 2, 3, 4, NilClass, nil], pr.call(1,2,3,4)
  765. assert_equal [1, 2, 3, 4, NilClass, nil], pr.call(1,2,3,4,5)
  766. assert_equal [nil, nil, :c, :d, Proc, :proc], (pr.call(){ :proc })
  767. assert_equal [1, nil, :c, :d, Proc, :proc], (pr.call(1){ :proc })
  768. assert_equal [1, 2, :c, :d, Proc, :proc], (pr.call(1, 2){ :proc })
  769. assert_equal [1, 2, 3, :d, Proc, :proc], (pr.call(1, 2, 3){ :proc })
  770. assert_equal [1, 2, 3, 4, Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
  771. assert_equal [1, 2, 3, 4, Proc, :proc], (pr.call(1, 2, 3, 4, 5){ :proc })
  772. assert_equal [nil, nil, :c, :d, Proc, :x], (pr.call(){|x| x})
  773. assert_equal [1, nil, :c, :d, Proc, :x], (pr.call(1){|x| x})
  774. assert_equal [1, 2, :c, :d, Proc, :x], (pr.call(1, 2){|x| x})
  775. assert_equal [1, 2, 3, :d, Proc, :x], (pr.call(1, 2, 3){|x| x})
  776. assert_equal [1, 2, 3, 4, Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
  777. assert_equal [1, 2, 3, 4, Proc, :x], (pr.call(1, 2, 3, 4, 5){|x| x})
  778. end
  779. def test_proc_args_opt_block
  780. pr = proc {|a=:a,b=:b,c=:c,d=:d,&e|
  781. [a, b, c, d, e.class, e&&e.call(:x)]
  782. }
  783. assert_equal [:a, :b, :c, :d, NilClass, nil], pr.call()
  784. assert_equal [1, :b, :c, :d, NilClass, nil], pr.call(1)
  785. assert_equal [1, 2, :c, :d, NilClass, nil], pr.call(1,2)
  786. assert_equal [1, 2, 3, :d, NilClass, nil], pr.call(1,2,3)
  787. assert_equal [1, 2, 3, 4, NilClass, nil], pr.call(1,2,3,4)
  788. assert_equal [1, 2, 3, 4, NilClass, nil], pr.call(1,2,3,4,5)
  789. assert_equal [:a, :b, :c, :d, Proc, :proc], (pr.call(){ :proc })
  790. assert_equal [1, :b, :c, :d, Proc, :proc], (pr.call(1){ :proc })
  791. assert_equal [1, 2, :c, :d, Proc, :proc], (pr.call(1, 2){ :proc })
  792. assert_equal [1, 2, 3, :d, Proc, :proc], (pr.call(1, 2, 3){ :proc })
  793. assert_equal [1, 2, 3, 4, Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
  794. assert_equal [1, 2, 3, 4, Proc, :proc], (pr.call(1, 2, 3, 4, 5){ :proc })
  795. assert_equal [:a, :b, :c, :d, Proc, :x], (pr.call(){|x| x})
  796. assert_equal [1, :b, :c, :d, Proc, :x], (pr.call(1){|x| x})
  797. assert_equal [1, 2, :c, :d, Proc, :x], (pr.call(1, 2){|x| x})
  798. assert_equal [1, 2, 3, :d, Proc, :x], (pr.call(1, 2, 3){|x| x})
  799. assert_equal [1, 2, 3, 4, Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
  800. assert_equal [1, 2, 3, 4, Proc, :x], (pr.call(1, 2, 3, 4, 5){|x| x})
  801. end
  802. def test_proc_args_pos_opt_post_block
  803. pr = proc {|a,b,c=:c,d=:d,e,f,&g|
  804. [a, b, c, d, e, f, g.class, g&&g.call(:x)]
  805. }
  806. assert_equal [nil, nil, :c, :d, nil, nil, NilClass, nil], pr.call()
  807. assert_equal [1, nil, :c, :d, nil, nil, NilClass, nil], pr.call(1)
  808. assert_equal [1, 2, :c, :d, nil, nil, NilClass, nil], pr.call(1,2)
  809. assert_equal [1, 2, :c, :d, 3, nil, NilClass, nil], pr.call(1,2,3)
  810. assert_equal [1, 2, :c, :d, 3, 4, NilClass, nil], pr.call(1,2,3,4)
  811. assert_equal [1, 2, 3, :d, 4, 5, NilClass, nil], pr.call(1,2,3,4,5)
  812. assert_equal [1, 2, 3, 4, 5, 6, NilClass, nil], pr.call(1,2,3,4,5,6)
  813. assert_equal [1, 2, 3, 4, 5, 6, NilClass, nil], pr.call(1,2,3,4,5,6,7)
  814. assert_equal [nil, nil, :c, :d, nil, nil, Proc, :proc], (pr.call(){ :proc })
  815. assert_equal [1, nil, :c, :d, nil, nil, Proc, :proc], (pr.call(1){ :proc })
  816. assert_equal [1, 2, :c, :d, nil, nil, Proc, :proc], (pr.call(1, 2){ :proc })
  817. assert_equal [1, 2, :c, :d, 3, nil, Proc, :proc], (pr.call(1, 2, 3){ :proc })
  818. assert_equal [1, 2, :c, :d, 3, 4, Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
  819. assert_equal [1, 2, 3, :d, 4, 5, Proc, :proc], (pr.call(1, 2, 3, 4, 5){ :proc })
  820. assert_equal [1, 2, 3, 4, 5, 6, Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6){ :proc })
  821. assert_equal [1, 2, 3, 4, 5, 6, Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6, 7){ :proc })
  822. assert_equal [nil, nil, :c, :d, nil, nil, Proc, :x], (pr.call(){|x| x})
  823. assert_equal [1, nil, :c, :d, nil, nil, Proc, :x], (pr.call(1){|x| x})
  824. assert_equal [1, 2, :c, :d, nil, nil, Proc, :x], (pr.call(1, 2){|x| x})
  825. assert_equal [1, 2, :c, :d, 3, nil, Proc, :x], (pr.call(1, 2, 3){|x| x})
  826. assert_equal [1, 2, :c, :d, 3, 4, Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
  827. assert_equal [1, 2, 3, :d, 4, 5, Proc, :x], (pr.call(1, 2, 3, 4, 5){|x| x})
  828. assert_equal [1, 2, 3, 4, 5, 6, Proc, :x], (pr.call(1, 2, 3, 4, 5, 6){|x| x})
  829. assert_equal [1, 2, 3, 4, 5, 6, Proc, :x], (pr.call(1, 2, 3, 4, 5, 6, 7){|x| x})
  830. end
  831. def test_proc_args_opt_post_block
  832. pr = proc {|a=:a,b=:b,c=:c,d=:d,e,f,&g|
  833. [a, b, c, d, e, f, g.class, g&&g.call(:x)]
  834. }
  835. assert_equal [:a, :b, :c, :d, nil, nil, NilClass, nil], pr.call()
  836. assert_equal [:a, :b, :c, :d, 1, nil, NilClass, nil], pr.call(1)
  837. assert_equal [:a, :b, :c, :d, 1, 2, NilClass, nil], pr.call(1,2)
  838. assert_equal [1, :b, :c, :d, 2, 3, NilClass, nil], pr.call(1,2,3)
  839. assert_equal [1, 2, :c, :d, 3, 4, NilClass, nil], pr.call(1,2,3,4)
  840. assert_equal [1, 2, 3, :d, 4, 5, NilClass, nil], pr.call(1,2,3,4,5)
  841. assert_equal [1, 2, 3, 4, 5, 6, NilClass, nil], pr.call(1,2,3,4,5,6)
  842. assert_equal [1, 2, 3, 4, 5, 6, NilClass, nil], pr.call(1,2,3,4,5,6,7)
  843. assert_equal [:a, :b, :c, :d, nil, nil, Proc, :proc], (pr.call(){ :proc })
  844. assert_equal [:a, :b, :c, :d, 1, nil, Proc, :proc], (pr.call(1){ :proc })
  845. assert_equal [:a, :b, :c, :d, 1, 2, Proc, :proc], (pr.call(1, 2){ :proc })
  846. assert_equal [1, :b, :c, :d, 2, 3, Proc, :proc], (pr.call(1, 2, 3){ :proc })
  847. assert_equal [1, 2, :c, :d, 3, 4, Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
  848. assert_equal [1, 2, 3, :d, 4, 5, Proc, :proc], (pr.call(1, 2, 3, 4, 5){ :proc })
  849. assert_equal [1, 2, 3, 4, 5, 6, Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6){ :proc })
  850. assert_equal [1, 2, 3, 4, 5, 6, Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6, 7){ :proc })
  851. assert_equal [:a, :b, :c, :d, nil, nil, Proc, :x], (pr.call(){|x| x})
  852. assert_equal [:a, :b, :c, :d, 1, nil, Proc, :x], (pr.call(1){|x| x})
  853. assert_equal [:a, :b, :c, :d, 1, 2, Proc, :x], (pr.call(1, 2){|x| x})
  854. assert_equal [1, :b, :c, :d, 2, 3, Proc, :x], (pr.call(1, 2, 3){|x| x})
  855. assert_equal [1, 2, :c, :d, 3, 4, Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
  856. assert_equal [1, 2, 3, :d, 4, 5, Proc, :x], (pr.call(1, 2, 3, 4, 5){|x| x})
  857. assert_equal [1, 2, 3, 4, 5, 6, Proc, :x], (pr.call(1, 2, 3, 4, 5, 6){|x| x})
  858. assert_equal [1, 2, 3, 4, 5, 6, Proc, :x], (pr.call(1, 2, 3, 4, 5, 6, 7){|x| x})
  859. end
  860. def test_proc_args_pos_opt_rest_block
  861. pr = proc {|a,b,c=:c,d=:d,*e,&f|
  862. [a, b, c, d, e, f.class, f&&f.call(:x)]
  863. }
  864. assert_equal [nil, nil, :c, :d, [], NilClass, nil], pr.call()
  865. assert_equal [1, nil, :c, :d, [], NilClass, nil], pr.call(1)
  866. assert_equal [1, 2, :c, :d, [], NilClass, nil], pr.call(1,2)
  867. assert_equal [1, 2, 3, :d, [], NilClass, nil], pr.call(1,2,3)
  868. assert_equal [1, 2, 3, 4, [], NilClass, nil], pr.call(1,2,3,4)
  869. assert_equal [1, 2, 3, 4, [5], NilClass, nil], pr.call(1,2,3,4,5)
  870. assert_equal [1, 2, 3, 4, [5,6], NilClass, nil], pr.call(1,2,3,4,5,6)
  871. assert_equal [nil, nil, :c, :d, [], Proc, :proc], (pr.call(){ :proc })
  872. assert_equal [1, nil, :c, :d, [], Proc, :proc], (pr.call(1){ :proc })
  873. assert_equal [1, 2, :c, :d, [], Proc, :proc], (pr.call(1, 2){ :proc })
  874. assert_equal [1, 2, 3, :d, [], Proc, :proc], (pr.call(1, 2, 3){ :proc })
  875. assert_equal [1, 2, 3, 4, [], Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
  876. assert_equal [1, 2, 3, 4, [5], Proc, :proc], (pr.call(1, 2, 3, 4, 5){ :proc })
  877. assert_equal [1, 2, 3, 4, [5,6], Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6){ :proc })
  878. assert_equal [nil, nil, :c, :d, [], Proc, :x], (pr.call(){|x| x})
  879. assert_equal [1, nil, :c, :d, [], Proc, :x], (pr.call(1){|x| x})
  880. assert_equal [1, 2, :c, :d, [], Proc, :x], (pr.call(1, 2){|x| x})
  881. assert_equal [1, 2, 3, :d, [], Proc, :x], (pr.call(1, 2, 3){|x| x})
  882. assert_equal [1, 2, 3, 4, [], Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
  883. assert_equal [1, 2, 3, 4, [5], Proc, :x], (pr.call(1, 2, 3, 4, 5){|x| x})
  884. assert_equal [1, 2, 3, 4, [5,6], Proc, :x], (pr.call(1, 2, 3, 4, 5, 6){|x| x})
  885. end
  886. def test_proc_args_opt_rest_block
  887. pr = proc {|a=:a,b=:b,c=:c,d=:d,*e,&f|
  888. [a, b, c, d, e, f.class, f&&f.call(:x)]
  889. }
  890. assert_equal [:a, :b, :c, :d, [], NilClass, nil], pr.call()
  891. assert_equal [1, :b, :c, :d, [], NilClass, nil], pr.call(1)
  892. assert_equal [1, 2, :c, :d, [], NilClass, nil], pr.call(1,2)
  893. assert_equal [1, 2, 3, :d, [], NilClass, nil], pr.call(1,2,3)
  894. assert_equal [1, 2, 3, 4, [], NilClass, nil], pr.call(1,2,3,4)
  895. assert_equal [1, 2, 3, 4, [5], NilClass, nil], pr.call(1,2,3,4,5)
  896. assert_equal [1, 2, 3, 4, [5,6], NilClass, nil], pr.call(1,2,3,4,5,6)
  897. assert_equal [:a, :b, :c, :d, [], Proc, :proc], (pr.call(){ :proc })
  898. assert_equal [1, :b, :c, :d, [], Proc, :proc], (pr.call(1){ :proc })
  899. assert_equal [1, 2, :c, :d, [], Proc, :proc], (pr.call(1, 2){ :proc })
  900. assert_equal [1, 2, 3, :d, [], Proc, :proc], (pr.call(1, 2, 3){ :proc })
  901. assert_equal [1, 2, 3, 4, [], Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
  902. assert_equal [1, 2, 3, 4, [5], Proc, :proc], (pr.call(1, 2, 3, 4, 5){ :proc })
  903. assert_equal [1, 2, 3, 4, [5,6], Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6){ :proc })
  904. assert_equal [:a, :b, :c, :d, [], Proc, :x], (pr.call(){|x| x})
  905. assert_equal [1, :b, :c, :d, [], Proc, :x], (pr.call(1){|x| x})
  906. assert_equal [1, 2, :c, :d, [], Proc, :x], (pr.call(1, 2){|x| x})
  907. assert_equal [1, 2, 3, :d, [], Proc, :x], (pr.call(1, 2, 3){|x| x})
  908. assert_equal [1, 2, 3, 4, [], Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
  909. assert_equal [1, 2, 3, 4, [5], Proc, :x], (pr.call(1, 2, 3, 4, 5){|x| x})
  910. assert_equal [1, 2, 3, 4, [5,6], Proc, :x], (pr.call(1, 2, 3, 4, 5, 6){|x| x})
  911. end
  912. def test_proc_args_pos_opt_rest_post_block
  913. pr = proc {|a,b,c=:c,d=:d,*e,f,g,&h|
  914. [a, b, c, d, e, f, g, h.class, h&&h.call(:x)]
  915. }
  916. assert_equal [nil, nil, :c, :d, [], nil, nil, NilClass, nil], pr.call()
  917. assert_equal [1, nil, :c, :d, [], nil, nil, NilClass, nil], pr.call(1)
  918. assert_equal [1, 2, :c, :d, [], nil, nil, NilClass, nil], pr.call(1,2)
  919. assert_equal [1, 2, :c, :d, [], 3, nil, NilClass, nil], pr.call(1,2,3)
  920. assert_equal [1, 2, :c, :d, [], 3, 4, NilClass, nil], pr.call(1,2,3,4)
  921. assert_equal [1, 2, 3, :d, [], 4, 5, NilClass, nil], pr.call(1,2,3,4,5)
  922. assert_equal [1, 2, 3, 4, [], 5, 6, NilClass, nil], pr.call(1,2,3,4,5,6)
  923. assert_equal [1, 2, 3, 4, [5], 6, 7, NilClass, nil], pr.call(1,2,3,4,5,6,7)
  924. assert_equal [1, 2, 3, 4, [5,6], 7, 8, NilClass, nil], pr.call(1,2,3,4,5,6,7,8)
  925. assert_equal [nil, nil, :c, :d, [], nil, nil, Proc, :proc], (pr.call(){ :proc })
  926. assert_equal [1, nil, :c, :d, [], nil, nil, Proc, :proc], (pr.call(1){ :proc })
  927. assert_equal [1, 2, :c, :d, [], nil, nil, Proc, :proc], (pr.call(1, 2){ :proc })
  928. assert_equal [1, 2, :c, :d, [], 3, nil, Proc, :proc], (pr.call(1, 2, 3){ :proc })
  929. assert_equal [1, 2, :c, :d, [], 3, 4, Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
  930. assert_equal [1, 2, 3, :d, [], 4, 5, Proc, :proc], (pr.call(1, 2, 3, 4, 5){ :proc })
  931. assert_equal [1, 2, 3, 4, [], 5, 6, Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6){ :proc })
  932. assert_equal [1, 2, 3, 4, [5], 6, 7, Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6, 7){ :proc })
  933. assert_equal [1, 2, 3, 4, [5,6], 7, 8, Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6, 7, 8){ :proc })
  934. assert_equal [nil, nil, :c, :d, [], nil, nil, Proc, :x], (pr.call(){|x| x})
  935. assert_equal [1, nil, :c, :d, [], nil, nil, Proc, :x], (pr.call(1){|x| x})
  936. assert_equal [1, 2, :c, :d, [], nil, nil, Proc, :x], (pr.call(1, 2){|x| x})
  937. assert_equal [1, 2, :c, :d, [], 3, nil, Proc, :x], (pr.call(1, 2, 3){|x| x})
  938. assert_equal [1, 2, :c, :d, [], 3, 4, Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
  939. assert_equal [1, 2, 3, :d, [], 4, 5, Proc, :x], (pr.call(1, 2, 3, 4, 5){|x| x})
  940. assert_equal [1, 2, 3, 4, [], 5, 6, Proc, :x], (pr.call(1, 2, 3, 4, 5, 6){|x| x})
  941. assert_equal [1, 2, 3, 4, [5], 6, 7, Proc, :x], (pr.call(1, 2, 3, 4, 5, 6, 7){|x| x})
  942. assert_equal [1, 2, 3, 4, [5,6], 7, 8, Proc, :x], (pr.call(1, 2, 3, 4, 5, 6, 7, 8){|x| x})
  943. end
  944. def test_proc_args_opt_rest_post_block
  945. pr = proc {|a=:a,b=:b,c=:c,d=:d,*e,f,g,&h|
  946. [a, b, c, d, e, f, g, h.class, h&&h.call(:x)]
  947. }
  948. assert_equal [:a, :b, :c, :d, [], nil, nil, NilClass, nil], pr.call()
  949. assert_equal [:a, :b, :c, :d, [], 1, nil, NilClass, nil], pr.call(1)
  950. assert_equal [:a, :b, :c, :d, [], 1, 2, NilClass, nil], pr.call(1,2)
  951. assert_equal [1, :b, :c, :d, [], 2, 3, NilClass, nil], pr.call(1,2,3)
  952. assert_equal [1, 2, :c, :d, [], 3, 4, NilClass, nil], pr.call(1,2,3,4)
  953. assert_equal [1, 2, 3, :d, [], 4, 5, NilClass, nil], pr.call(1,2,3,4,5)
  954. assert_equal [1, 2, 3, 4, [], 5, 6, NilClass, nil], pr.call(1,2,3,4,5,6)
  955. assert_equal [1, 2, 3, 4, [5], 6, 7, NilClass, nil], pr.call(1,2,3,4,5,6,7)
  956. assert_equal [1, 2, 3, 4, [5,6], 7, 8, NilClass, nil], pr.call(1,2,3,4,5,6,7,8)
  957. assert_equal [:a, :b, :c, :d, [], nil, nil, Proc, :proc], (pr.call(){ :proc })
  958. assert_equal [:a, :b, :c, :d, [], 1, nil, Proc, :proc], (pr.call(1){ :proc })
  959. assert_equal [:a, :b, :c, :d, [], 1, 2, Proc, :proc], (pr.call(1, 2){ :proc })
  960. assert_equal [1, :b, :c, :d, [], 2, 3, Proc, :proc], (pr.call(1, 2, 3){ :proc })
  961. assert_equal [1, 2, :c, :d, [], 3, 4, Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
  962. assert_equal [1, 2, 3, :d, [], 4, 5, Proc, :proc], (pr.call(1, 2, 3, 4, 5){ :proc })
  963. assert_equal [1, 2, 3, 4, [], 5, 6, Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6){ :proc })
  964. assert_equal [1, 2, 3, 4, [5], 6, 7, Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6, 7){ :proc })
  965. assert_equal [1, 2, 3, 4, [5,6], 7, 8, Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6, 7, 8){ :proc })
  966. assert_equal [:a, :b, :c, :d, [], nil, nil, Proc, :x], (pr.call(){|x| x})
  967. assert_equal [:a, :b, :c, :d, [], 1, nil, Proc, :x], (pr.call(1){|x| x})
  968. assert_equal [:a, :b, :c, :d, [], 1, 2, Proc, :x], (pr.call(1, 2){|x| x})
  969. assert_equal [1, :b, :c, :d, [], 2, 3, Proc, :x], (pr.call(1, 2, 3){|x| x})
  970. assert_equal [1, 2, :c, :d, [], 3, 4, Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
  971. assert_equal [1, 2, 3, :d, [], 4, 5, Proc, :x], (pr.call(1, 2, 3, 4, 5){|x| x})
  972. assert_equal [1, 2, 3, 4, [], 5, 6, Proc, :x], (pr.call(1, 2, 3, 4, 5, 6){|x| x})
  973. assert_equal [1, 2, 3, 4, [5], 6, 7, Proc, :x], (pr.call(1, 2, 3, 4, 5, 6, 7){|x| x})
  974. assert_equal [1, 2, 3, 4, [5,6], 7, 8, Proc, :x], (pr.call(1, 2, 3, 4, 5, 6, 7, 8){|x| x})
  975. end
  976. def test_proc_args_pos_unleashed
  977. r = proc {|a,b=1,*c,d,e|
  978. [a,b,c,d,e]
  979. }.call(1,2,3,4,5)
  980. assert_equal([1,2,[3],4,5], r, "[ruby-core:19485]")
  981. end
  982. def test_proc_autosplat
  983. def self.a(arg, kw)
  984. yield arg
  985. yield arg, **kw
  986. yield arg, kw
  987. end
  988. arr = []
  989. a([1,2,3], {}) do |arg1, arg2=0|
  990. arr << [arg1, arg2]
  991. end
  992. assert_equal([[1, 2], [[1, 2, 3], 0], [[1, 2, 3], {}]], arr)
  993. arr = []
  994. a([1,2,3], a: 1) do |arg1, arg2=0|
  995. arr << [arg1, arg2]
  996. end
  997. assert_equal([[1, 2], [[1, 2, 3], {a: 1}], [[1, 2, 3], {a: 1}]], arr)
  998. end
  999. def test_proc_single_arg_with_keywords_accepted_and_yielded
  1000. def self.a
  1001. yield [], **{a: 1}
  1002. end
  1003. res = a do |arg, **opts|
  1004. [arg, opts]
  1005. end
  1006. assert_equal([[], {a: 1}], res)
  1007. end
  1008. def test_parameters
  1009. assert_equal([], proc {}.parameters)
  1010. assert_equal([], proc {||}.parameters)
  1011. assert_equal([[:opt, :a]], proc {|a|}.parameters)
  1012. assert_equal([[:opt, :a], [:opt, :b]], proc {|a, b|}.parameters)
  1013. assert_equal([[:opt, :a], [:block, :b]], proc {|a=:a, &b|}.parameters)
  1014. assert_equal([[:opt, :a], [:opt, :b]], proc {|a, b=:b|}.parameters)
  1015. assert_equal([[:rest, :a]], proc {|*a|}.parameters)
  1016. assert_equal([[:opt, :a], [:rest, :b], [:block, :c]], proc {|a, *b, &c|}.parameters)
  1017. assert_equal([[:opt, :a], [:rest, :b], [:opt, :c]], proc {|a, *b, c|}.parameters)
  1018. assert_equal([[:opt, :a], [:rest, :b], [:opt, :c], [:block, :d]], proc {|a, *b, c, &d|}.parameters)
  1019. assert_equal([[:opt, :a], [:opt, :b], [:rest, :c], [:opt, :d], [:block, :e]], proc {|a, b=:b, *c, d, &e|}.parameters)
  1020. assert_equal([[:opt, nil], [:block, :b]], proc {|(a), &b|a}.parameters)
  1021. 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)
  1022. assert_equal([[:req]], method(:putc).parameters)
  1023. assert_equal([[:rest]], method(:p).parameters)
  1024. pr = eval("proc{|"+"(_),"*30+"|}")
  1025. assert_empty(pr.parameters.map{|_,n|n}.compact)
  1026. end
  1027. def pm0() end
  1028. def pm1(a) end
  1029. def pm2(a, b) end
  1030. def pmo1(a = :a, &b) end
  1031. def pmo2(a, b = :b) end
  1032. def pmo3(*a) end
  1033. def pmo4(a, *b, &c) end
  1034. def pmo5(a, *b, c) end
  1035. def pmo6(a, *b, c, &d) end
  1036. def pmo7(a, b = :b, *c, d, &e) end
  1037. def pma1((a), &b) a; end
  1038. def pmk1(**) end
  1039. def pmk2(**o) nil && o end
  1040. def pmk3(a, **o) nil && o end
  1041. def pmk4(a = nil, **o) nil && o end
  1042. def pmk5(a, b = nil, **o) nil && o end
  1043. def pmk6(a, b = nil, c, **o) nil && o end
  1044. def pmk7(a, b = nil, *c, d, **o) nil && o end
  1045. def test_bound_parameters
  1046. assert_equal([], method(:pm0).to_proc.parameters)
  1047. assert_equal([[:req, :a]], method(:pm1).to_proc.parameters)
  1048. assert_equal([[:req, :a], [:req, :b]], method(:pm2).to_proc.parameters)
  1049. assert_equal([[:opt, :a], [:block, :b]], method(:pmo1).to_proc.parameters)
  1050. assert_equal([[:req, :a], [:opt, :b]], method(:pmo2).to_proc.parameters)
  1051. assert_equal([[:rest, :a]], method(:pmo3).to_proc.parameters)
  1052. assert_equal([[:req, :a], [:rest, :b], [:block, :c]], method(:pmo4).to_proc.parameters)
  1053. assert_equal([[:req, :a], [:rest, :b], [:req, :c]], method(:pmo5).to_proc.parameters)
  1054. assert_equal([[:req, :a], [:rest, :b], [:req, :c], [:block, :d]], method(:pmo6).to_proc.parameters)
  1055. assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:block, :e]], method(:pmo7).to_proc.parameters)
  1056. assert_equal([[:req], [:block, :b]], method(:pma1).to_proc.parameters)
  1057. assert_equal([[:keyrest]], method(:pmk1).to_proc.parameters)
  1058. assert_equal([[:keyrest, :o]], method(:pmk2).to_proc.parameters)
  1059. assert_equal([[:req, :a], [:keyrest, :o]], method(:pmk3).to_proc.parameters)
  1060. assert_equal([[:opt, :a], [:keyrest, :o]], method(:pmk4).to_proc.parameters)
  1061. assert_equal([[:req, :a], [:opt, :b], [:keyrest, :o]], method(:pmk5).to_proc.parameters)
  1062. assert_equal([[:req, :a], [:opt, :b], [:req, :c], [:keyrest, :o]], method(:pmk6).to_proc.parameters)
  1063. assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:keyrest, :o]], method(:pmk7).to_proc.parameters)
  1064. assert_equal([], "".method(:empty?).to_proc.parameters)
  1065. assert_equal([[:rest]], "".method(:gsub).to_proc.parameters)
  1066. assert_equal([[:rest]], proc {}.curry.parameters)
  1067. end
  1068. def test_to_s
  1069. assert_match(/^#<Proc:0x\h+ #{ Regexp.quote(__FILE__) }:\d+>$/, proc {}.to_s)
  1070. assert_match(/^#<Proc:0x\h+ #{ Regexp.quote(__FILE__) }:\d+ \(lambda\)>$/, lambda {}.to_s)
  1071. assert_match(/^#<Proc:0x\h+ \(lambda\)>$/, method(:p).to_proc.to_s)
  1072. name = "Proc\u{1f37b}"
  1073. assert_include(EnvUtil.labeled_class(name, Proc).new {}.to_s, name)
  1074. end
  1075. @@line_of_source_location_test = __LINE__ + 1
  1076. def source_location_test a=1,
  1077. b=2
  1078. end
  1079. def test_source_location
  1080. file, lineno = method(:source_location_test).source_location
  1081. assert_match(/^#{ Regexp.quote(__FILE__) }$/, file)
  1082. assert_equal(@@line_of_source_location_test, lineno, 'Bug #2427')
  1083. end
  1084. @@line_of_attr_reader_source_location_test = __LINE__ + 3
  1085. @@line_of_attr_writer_source_location_test = __LINE__ + 3
  1086. @@line_of_attr_accessor_source_location_test = __LINE__ + 3
  1087. attr_reader :attr_reader_source_location_test
  1088. attr_writer :attr_writer_source_location_test
  1089. attr_accessor :attr_accessor_source_location_test
  1090. def test_attr_source_location
  1091. file, lineno = method(:attr_reader_source_location_test).source_location
  1092. assert_match(/^#{ Regexp.quote(__FILE__) }$/, file)
  1093. assert_equal(@@line_of_attr_reader_source_location_test, lineno)
  1094. file, lineno = method(:attr_writer_source_location_test=).source_location
  1095. assert_match(/^#{ Regexp.quote(__FILE__) }$/, file)
  1096. assert_equal(@@line_of_attr_writer_source_location_test, lineno)
  1097. file, lineno = method(:attr_accessor_source_location_test).source_location
  1098. assert_match(/^#{ Regexp.quote(__FILE__) }$/, file)
  1099. assert_equal(@@line_of_attr_accessor_source_location_test, lineno)
  1100. file, lineno = method(:attr_accessor_source_location_test=).source_location
  1101. assert_match(/^#{ Regexp.quote(__FILE__) }$/, file)
  1102. assert_equal(@@line_of_attr_accessor_source_location_test, lineno)
  1103. end
  1104. def block_source_location_test(*args, &block)
  1105. block.source_location
  1106. end
  1107. def test_block_source_location
  1108. exp_lineno = __LINE__ + 3
  1109. file, line

Large files files are truncated, but you can click here to view the full file