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

/test/ruby/test_assignment.rb

http://github.com/ruby/ruby
Ruby | 788 lines | 696 code | 90 blank | 2 comment | 42 complexity | 58fd6276ee32ecc957e037478b144735 MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause, AGPL-3.0
  1. # frozen_string_literal: false
  2. require 'test/unit'
  3. class TestAssignment < Test::Unit::TestCase
  4. def test_assign
  5. a=[]; a[0] ||= "bar";
  6. assert_equal("bar", a[0])
  7. h={}; h["foo"] ||= "bar";
  8. assert_equal("bar", h["foo"])
  9. aa = 5
  10. aa ||= 25
  11. assert_equal(5, aa)
  12. bb ||= 25
  13. assert_equal(25, bb)
  14. cc &&=33
  15. assert_nil(cc)
  16. cc = 5
  17. cc &&=44
  18. assert_equal(44, cc)
  19. end
  20. def test_assign_simple
  21. a = nil; assert_nil(a)
  22. a = 1; assert_equal(1, a)
  23. a = []; assert_equal([], a)
  24. a = [1]; assert_equal([1], a)
  25. a = [nil]; assert_equal([nil], a)
  26. a = [[]]; assert_equal([[]], a)
  27. a = [1,2]; assert_equal([1,2], a)
  28. a = [*[]]; assert_equal([], a)
  29. a = [*[1]]; assert_equal([1], a)
  30. a = [*[1,2]]; assert_equal([1,2], a)
  31. end
  32. def test_assign_splat
  33. a = *[]; assert_equal([], a)
  34. a = *[1]; assert_equal([1], a)
  35. a = *[nil]; assert_equal([nil], a)
  36. a = *[[]]; assert_equal([[]], a)
  37. a = *[1,2]; assert_equal([1,2], a)
  38. a = *[*[]]; assert_equal([], a)
  39. a = *[*[1]]; assert_equal([1], a)
  40. a = *[*[1,2]]; assert_equal([1,2], a)
  41. end
  42. def test_assign_ary
  43. *a = nil; assert_equal([nil], a)
  44. *a = 1; assert_equal([1], a)
  45. *a = []; assert_equal([], a)
  46. *a = [1]; assert_equal([1], a)
  47. *a = [nil]; assert_equal([nil], a)
  48. *a = [[]]; assert_equal([[]], a)
  49. *a = [1,2]; assert_equal([1,2], a)
  50. *a = [*[]]; assert_equal([], a)
  51. *a = [*[1]]; assert_equal([1], a)
  52. *a = [*[1,2]]; assert_equal([1,2], a)
  53. end
  54. def test_assign_ary_splat
  55. *a = *[]; assert_equal([], a)
  56. *a = *[1]; assert_equal([1], a)
  57. *a = *[nil]; assert_equal([nil], a)
  58. *a = *[[]]; assert_equal([[]], a)
  59. *a = *[1,2]; assert_equal([1,2], a)
  60. *a = *[*[]]; assert_equal([], a)
  61. *a = *[*[1]]; assert_equal([1], a)
  62. *a = *[*[1,2]]; assert_equal([1,2], a)
  63. end
  64. def test_massign_simple
  65. a,b,*c = nil; assert_equal([nil,nil,[]], [a,b,c])
  66. a,b,*c = 1; assert_equal([1,nil,[]], [a,b,c])
  67. a,b,*c = []; assert_equal([nil,nil,[]], [a,b,c])
  68. a,b,*c = [1]; assert_equal([1,nil,[]], [a,b,c])
  69. a,b,*c = [nil]; assert_equal([nil,nil,[]], [a,b,c])
  70. a,b,*c = [[]]; assert_equal([[],nil,[]], [a,b,c])
  71. a,b,*c = [1,2]; assert_equal([1,2,[]], [a,b,c])
  72. a,b,*c = [*[]]; assert_equal([nil,nil,[]], [a,b,c])
  73. a,b,*c = [*[1]]; assert_equal([1,nil,[]], [a,b,c])
  74. a,b,*c = [*[1,2]]; assert_equal([1,2,[]], [a,b,c])
  75. end
  76. def test_massign_splat
  77. a,b,*c = *[]; assert_equal([nil,nil,[]], [a,b,c])
  78. a,b,*c = *[1]; assert_equal([1,nil,[]], [a,b,c])
  79. a,b,*c = *[nil]; assert_equal([nil,nil,[]], [a,b,c])
  80. a,b,*c = *[[]]; assert_equal([[],nil,[]], [a,b,c])
  81. a,b,*c = *[1,2]; assert_equal([1,2,[]], [a,b,c])
  82. a,b,*c = *[*[]]; assert_equal([nil,nil,[]], [a,b,c])
  83. a,b,*c = *[*[1]]; assert_equal([1,nil,[]], [a,b,c])
  84. a,b,*c = *[*[1,2]]; assert_equal([1,2,[]], [a,b,c])
  85. end
  86. def test_assign_rescue
  87. a = raise rescue 2; assert_equal(2, a)
  88. a, b = raise rescue [3,4]; assert_equal([3, 4], [a, b])
  89. end
  90. def test_assign_abbreviated
  91. bug2050 = '[ruby-core:25629]'
  92. a = Hash.new {[]}
  93. b = [1, 2]
  94. assert_equal([1, 2, 3], a[:x] += [*b, 3], bug2050)
  95. assert_equal([1, 2, 3], a[:x], bug2050)
  96. assert_equal([1, 2, 3, [1, 2, 3]], a[:x] <<= [*b, 3], bug2050)
  97. assert_equal([1, 2, 3, [1, 2, 3]], a[:x], bug2050)
  98. end
  99. def test_assign_private_self
  100. bug11096 = '[ruby-core:68984] [Bug #11096]'
  101. o = Object.new
  102. class << o
  103. private
  104. def foo; 42; end
  105. def [](i); 42; end
  106. def foo=(a); 42; end
  107. def []=(i, a); 42; end
  108. end
  109. assert_raise(NoMethodError, bug11096) {
  110. o.instance_eval {o.foo = 1}
  111. }
  112. assert_nothing_raised(NoMethodError, bug11096) {
  113. assert_equal(1, o.instance_eval {self.foo = 1})
  114. }
  115. assert_raise(NoMethodError, bug11096) {
  116. o.instance_eval {o[0] = 1}
  117. }
  118. assert_nothing_raised(NoMethodError, bug11096) {
  119. assert_equal(1, o.instance_eval {self[0] = 1})
  120. }
  121. assert_nothing_raised(NoMethodError, bug11096) {
  122. o.instance_eval {self.foo += 1}
  123. }
  124. assert_nothing_raised(NoMethodError, bug11096) {
  125. o.instance_eval {self.foo &&= 1}
  126. }
  127. assert_nothing_raised(NoMethodError, bug11096) {
  128. o.instance_eval {self[0] += 1}
  129. }
  130. assert_nothing_raised(NoMethodError, bug11096) {
  131. o.instance_eval {self[0] &&= 1}
  132. }
  133. end
  134. def test_yield
  135. def f; yield(nil); end; f {|a| assert_nil(a)}; undef f
  136. def f; yield(1); end; f {|a| assert_equal(1, a)}; undef f
  137. def f; yield([]); end; f {|a| assert_equal([], a)}; undef f
  138. def f; yield([1]); end; f {|a| assert_equal([1], a)}; undef f
  139. def f; yield([nil]); end; f {|a| assert_equal([nil], a)}; undef f
  140. def f; yield([[]]); end; f {|a| assert_equal([[]], a)}; undef f
  141. def f; yield([*[]]); end; f {|a| assert_equal([], a)}; undef f
  142. def f; yield([*[1]]); end; f {|a| assert_equal([1], a)}; undef f
  143. def f; yield([*[1,2]]); end; f {|a| assert_equal([1,2], a)}; undef f
  144. def f; yield(*[1]); end; f {|a| assert_equal(1, a)}; undef f
  145. def f; yield(*[nil]); end; f {|a| assert_equal(nil, a)}; undef f
  146. def f; yield(*[[]]); end; f {|a| assert_equal([], a)}; undef f
  147. def f; yield(*[*[1]]); end; f {|a| assert_equal(1, a)}; undef f
  148. def f; yield; end; f {|*a| assert_equal([], a)}; undef f
  149. def f; yield(nil); end; f {|*a| assert_equal([nil], a)}; undef f
  150. def f; yield(1); end; f {|*a| assert_equal([1], a)}; undef f
  151. def f; yield([]); end; f {|*a| assert_equal([[]], a)}; undef f
  152. def f; yield([1]); end; f {|*a| assert_equal([[1]], a)}; undef f
  153. def f; yield([nil]); end; f {|*a| assert_equal([[nil]], a)}; undef f
  154. def f; yield([[]]); end; f {|*a| assert_equal([[[]]], a)}; undef f
  155. def f; yield([1,2]); end; f {|*a| assert_equal([[1,2]], a)}; undef f
  156. def f; yield([*[]]); end; f {|*a| assert_equal([[]], a)}; undef f
  157. def f; yield([*[1]]); end; f {|*a| assert_equal([[1]], a)}; undef f
  158. def f; yield([*[1,2]]); end; f {|*a| assert_equal([[1,2]], a)}; undef f
  159. def f; yield(*[]); end; f {|*a| assert_equal([], a)}; undef f
  160. def f; yield(*[1]); end; f {|*a| assert_equal([1], a)}; undef f
  161. def f; yield(*[nil]); end; f {|*a| assert_equal([nil], a)}; undef f
  162. def f; yield(*[[]]); end; f {|*a| assert_equal([[]], a)}; undef f
  163. def f; yield(*[*[]]); end; f {|*a| assert_equal([], a)}; undef f
  164. def f; yield(*[*[1]]); end; f {|*a| assert_equal([1], a)}; undef f
  165. def f; yield(*[*[1,2]]); end; f {|*a| assert_equal([1,2], a)}; undef f
  166. def f; yield; end; f {|a,b,*c| assert_equal([nil,nil,[]], [a,b,c])}; undef f
  167. def f; yield(nil); end; f {|a,b,*c| assert_equal([nil,nil,[]], [a,b,c])}; undef f
  168. def f; yield(1); end; f {|a,b,*c| assert_equal([1,nil,[]], [a,b,c])}; undef f
  169. def f; yield([]); end; f {|a,b,*c| assert_equal([nil,nil,[]], [a,b,c])}; undef f
  170. def f; yield([1]); end; f {|a,b,*c| assert_equal([1,nil,[]], [a,b,c])}; undef f
  171. def f; yield([nil]); end; f {|a,b,*c| assert_equal([nil,nil,[]], [a,b,c])}; undef f
  172. def f; yield([[]]); end; f {|a,b,*c| assert_equal([[],nil,[]], [a,b,c])}; undef f
  173. def f; yield([*[]]); end; f {|a,b,*c| assert_equal([nil,nil,[]], [a,b,c])}; undef f
  174. def f; yield([*[1]]); end; f {|a,b,*c| assert_equal([1,nil,[]], [a,b,c])}; undef f
  175. def f; yield([*[1,2]]); end; f {|a,b,*c| assert_equal([1,2,[]], [a,b,c])}; undef f
  176. def f; yield(*[]); end; f {|a,b,*c| assert_equal([nil,nil,[]], [a,b,c])}; undef f
  177. def f; yield(*[1]); end; f {|a,b,*c| assert_equal([1,nil,[]], [a,b,c])}; undef f
  178. def f; yield(*[nil]); end; f {|a,b,*c| assert_equal([nil,nil,[]], [a,b,c])}; undef f
  179. def f; yield(*[[]]); end; f {|a,b,*c| assert_equal([nil,nil,[]], [a,b,c])}; undef f
  180. def f; yield(*[*[]]); end; f {|a,b,*c| assert_equal([nil,nil,[]], [a,b,c])}; undef f
  181. def f; yield(*[*[1]]); end; f {|a,b,*c| assert_equal([1,nil,[]], [a,b,c])}; undef f
  182. def f; yield(*[*[1,2]]); end; f {|a,b,*c| assert_equal([1,2,[]], [a,b,c])}; undef f
  183. end
  184. def test_return
  185. def r; return; end; a = r(); assert_nil(a); undef r
  186. def r; return nil; end; a = r(); assert_nil(a); undef r
  187. def r; return 1; end; a = r(); assert_equal(1, a); undef r
  188. def r; return []; end; a = r(); assert_equal([], a); undef r
  189. def r; return [1]; end; a = r(); assert_equal([1], a); undef r
  190. def r; return [nil]; end; a = r(); assert_equal([nil], a); undef r
  191. def r; return [[]]; end; a = r(); assert_equal([[]], a); undef r
  192. def r; return [*[]]; end; a = r(); assert_equal([], a); undef r
  193. def r; return [*[1]]; end; a = r(); assert_equal([1], a); undef r
  194. def r; return [*[1,2]]; end; a = r(); assert_equal([1,2], a); undef r
  195. def r; return *[]; end; a = r(); assert_equal([], a); undef r
  196. def r; return *[1]; end; a = r(); assert_equal([1], a); undef r
  197. def r; return *[nil]; end; a = r(); assert_equal([nil], a); undef r
  198. def r; return *[[]]; end; a = r(); assert_equal([[]], a); undef r
  199. def r; return *[*[]]; end; a = r(); assert_equal([], a); undef r
  200. def r; return *[*[1]]; end; a = r(); assert_equal([1], a); undef r
  201. def r; return *[*[1,2]]; end; a = r(); assert_equal([1,2], a); undef r
  202. def r; return *[[]]; end; a = *r(); assert_equal([[]], a); undef r
  203. def r; return *[*[1,2]]; end; a = *r(); assert_equal([1,2], a); undef r
  204. def r; return; end; *a = r(); assert_equal([nil], a); undef r
  205. def r; return nil; end; *a = r(); assert_equal([nil], a); undef r
  206. def r; return 1; end; *a = r(); assert_equal([1], a); undef r
  207. def r; return []; end; *a = r(); assert_equal([], a); undef r
  208. def r; return [1]; end; *a = r(); assert_equal([1], a); undef r
  209. def r; return [nil]; end; *a = r(); assert_equal([nil], a); undef r
  210. def r; return [[]]; end; *a = r(); assert_equal([[]], a); undef r
  211. def r; return [1,2]; end; *a = r(); assert_equal([1,2], a); undef r
  212. def r; return [*[]]; end; *a = r(); assert_equal([], a); undef r
  213. def r; return [*[1]]; end; *a = r(); assert_equal([1], a); undef r
  214. def r; return [*[1,2]]; end; *a = r(); assert_equal([1,2], a); undef r
  215. def r; return *[]; end; *a = r(); assert_equal([], a); undef r
  216. def r; return *[1]; end; *a = r(); assert_equal([1], a); undef r
  217. def r; return *[nil]; end; *a = r(); assert_equal([nil], a); undef r
  218. def r; return *[[]]; end; *a = r(); assert_equal([[]], a); undef r
  219. def r; return *[1,2]; end; *a = r(); assert_equal([1,2], a); undef r
  220. def r; return *[*[]]; end; *a = r(); assert_equal([], a); undef r
  221. def r; return *[*[1]]; end; *a = r(); assert_equal([1], a); undef r
  222. def r; return *[*[1,2]]; end; *a = r(); assert_equal([1,2], a); undef r
  223. def r; return *[[]]; end; *a = *r(); assert_equal([[]], a); undef r
  224. def r; return *[1,2]; end; *a = *r(); assert_equal([1,2], a); undef r
  225. def r; return *[*[1,2]]; end; *a = *r(); assert_equal([1,2], a); undef r
  226. def r; return; end; a,b,*c = r(); assert_equal([nil,nil,[]], [a,b,c]); undef r
  227. def r; return nil; end; a,b,*c = r(); assert_equal([nil,nil,[]], [a,b,c]); undef r
  228. def r; return 1; end; a,b,*c = r(); assert_equal([1,nil,[]], [a,b,c]); undef r
  229. def r; return []; end; a,b,*c = r(); assert_equal([nil,nil,[]], [a,b,c]); undef r
  230. def r; return [1]; end; a,b,*c = r(); assert_equal([1,nil,[]], [a,b,c]); undef r
  231. def r; return [nil]; end; a,b,*c = r(); assert_equal([nil,nil,[]], [a,b,c]); undef r
  232. def r; return [[]]; end; a,b,*c = r(); assert_equal([[],nil,[]], [a,b,c]); undef r
  233. def r; return [1,2]; end; a,b,*c = r(); assert_equal([1,2,[]], [a,b,c]); undef r
  234. def r; return [*[]]; end; a,b,*c = r(); assert_equal([nil,nil,[]], [a,b,c]); undef r
  235. def r; return [*[1]]; end; a,b,*c = r(); assert_equal([1,nil,[]], [a,b,c]); undef r
  236. def r; return [*[1,2]]; end; a,b,*c = r(); assert_equal([1,2,[]], [a,b,c]); undef r
  237. def r; return *[]; end; a,b,*c = r(); assert_equal([nil,nil,[]], [a,b,c]); undef r
  238. def r; return *[1]; end; a,b,*c = r(); assert_equal([1,nil,[]], [a,b,c]); undef r
  239. def r; return *[nil]; end; a,b,*c = r(); assert_equal([nil,nil,[]], [a,b,c]); undef r
  240. def r; return *[[]]; end; a,b,*c = r(); assert_equal([[],nil,[]], [a,b,c]); undef r
  241. def r; return *[1,2]; end; a,b,*c = r(); assert_equal([1,2,[]], [a,b,c]); undef r
  242. def r; return *[*[]]; end; a,b,*c = r(); assert_equal([nil,nil,[]], [a,b,c]); undef r
  243. def r; return *[*[1]]; end; a,b,*c = r(); assert_equal([1,nil,[]], [a,b,c]); undef r
  244. def r; return *[*[1,2]]; end; a,b,*c = r(); assert_equal([1,2,[]], [a,b,c]); undef r
  245. def r; return 1, *[]; end; a,b = r(); assert_equal([1,nil], [a,b]); undef r
  246. def r; return 1,2,*[1]; end; a,b = r(); assert_equal([1,2], [a,b]); undef r
  247. def r; return 1,2,3,*[1,2]; end; a,b = r(); assert_equal([1,2], [a,b]); undef r
  248. end
  249. def test_lambda
  250. f = lambda {|r,| assert_equal([], r)}
  251. f.call([], *[])
  252. f = lambda {|r,*l| assert_equal([], r); assert_equal([1], l)}
  253. f.call([], *[1])
  254. f = lambda{|x| x}
  255. assert_equal(42, f.call(42))
  256. assert_equal([42], f.call([42]))
  257. assert_equal([[42]], f.call([[42]]))
  258. assert_equal([42,55], f.call([42,55]))
  259. f = lambda{|x,| x}
  260. assert_equal(42, f.call(42))
  261. assert_equal([42], f.call([42]))
  262. assert_equal([[42]], f.call([[42]]))
  263. assert_equal([42,55], f.call([42,55]))
  264. f = lambda{|*x| x}
  265. assert_equal([42], f.call(42))
  266. assert_equal([[42]], f.call([42]))
  267. assert_equal([[[42]]], f.call([[42]]))
  268. assert_equal([[42,55]], f.call([42,55]))
  269. assert_equal([42,55], f.call(42,55))
  270. end
  271. def test_multi
  272. a,=*[1]
  273. assert_equal(1, a)
  274. a,=*[[1]]
  275. assert_equal([1], a)
  276. a,=*[[[1]]]
  277. assert_equal([[1]], a)
  278. x, (y, z) = 1, 2, 3
  279. assert_equal([1,2,nil], [x,y,z])
  280. x, (y, z) = 1, [2,3]
  281. assert_equal([1,2,3], [x,y,z])
  282. x, (y, z) = 1, [2]
  283. assert_equal([1,2,nil], [x,y,z])
  284. end
  285. def test_break
  286. a = loop do break; end; assert_nil(a)
  287. a = loop do break nil; end; assert_nil(a)
  288. a = loop do break 1; end; assert_equal(1, a)
  289. a = loop do break []; end; assert_equal([], a)
  290. a = loop do break [1]; end; assert_equal([1], a)
  291. a = loop do break [nil]; end; assert_equal([nil], a)
  292. a = loop do break [[]]; end; assert_equal([[]], a)
  293. a = loop do break [*[]]; end; assert_equal([], a)
  294. a = loop do break [*[1]]; end; assert_equal([1], a)
  295. a = loop do break [*[1,2]]; end; assert_equal([1,2], a)
  296. a = loop do break *[]; end; assert_equal([], a)
  297. a = loop do break *[1]; end; assert_equal([1], a)
  298. a = loop do break *[nil]; end; assert_equal([nil], a)
  299. a = loop do break *[[]]; end; assert_equal([[]], a)
  300. a = loop do break *[*[]]; end; assert_equal([], a)
  301. a = loop do break *[*[1]]; end; assert_equal([1], a)
  302. a = loop do break *[*[1,2]]; end; assert_equal([1,2], a)
  303. *a = loop do break; end; assert_equal([nil], a)
  304. *a = loop do break nil; end; assert_equal([nil], a)
  305. *a = loop do break 1; end; assert_equal([1], a)
  306. *a = loop do break []; end; assert_equal([], a)
  307. *a = loop do break [1]; end; assert_equal([1], a)
  308. *a = loop do break [nil]; end; assert_equal([nil], a)
  309. *a = loop do break [[]]; end; assert_equal([[]], a)
  310. *a = loop do break [1,2]; end; assert_equal([1,2], a)
  311. *a = loop do break [*[]]; end; assert_equal([], a)
  312. *a = loop do break [*[1]]; end; assert_equal([1], a)
  313. *a = loop do break [*[1,2]]; end; assert_equal([1,2], a)
  314. *a = loop do break *[]; end; assert_equal([], a)
  315. *a = loop do break *[1]; end; assert_equal([1], a)
  316. *a = loop do break *[nil]; end; assert_equal([nil], a)
  317. *a = loop do break *[[]]; end; assert_equal([[]], a)
  318. *a = loop do break *[1,2]; end; assert_equal([1,2], a)
  319. *a = loop do break *[*[]]; end; assert_equal([], a)
  320. *a = loop do break *[*[1]]; end; assert_equal([1], a)
  321. *a = loop do break *[*[1,2]]; end; assert_equal([1,2], a)
  322. *a = *loop do break *[[]]; end; assert_equal([[]], a)
  323. *a = *loop do break *[1,2]; end; assert_equal([1,2], a)
  324. *a = *loop do break *[*[1,2]]; end; assert_equal([1,2], a)
  325. a,b,*c = loop do break; end; assert_equal([nil,nil,[]], [a,b,c])
  326. a,b,*c = loop do break nil; end; assert_equal([nil,nil,[]], [a,b,c])
  327. a,b,*c = loop do break 1; end; assert_equal([1,nil,[]], [a,b,c])
  328. a,b,*c = loop do break []; end; assert_equal([nil,nil,[]], [a,b,c])
  329. a,b,*c = loop do break [1]; end; assert_equal([1,nil,[]], [a,b,c])
  330. a,b,*c = loop do break [nil]; end; assert_equal([nil,nil,[]], [a,b,c])
  331. a,b,*c = loop do break [[]]; end; assert_equal([[],nil,[]], [a,b,c])
  332. a,b,*c = loop do break [1,2]; end; assert_equal([1,2,[]], [a,b,c])
  333. a,b,*c = loop do break [*[]]; end; assert_equal([nil,nil,[]], [a,b,c])
  334. a,b,*c = loop do break [*[1]]; end; assert_equal([1,nil,[]], [a,b,c])
  335. a,b,*c = loop do break [*[1,2]]; end; assert_equal([1,2,[]], [a,b,c])
  336. a,b,*c = loop do break *[]; end; assert_equal([nil,nil,[]], [a,b,c])
  337. a,b,*c = loop do break *[1]; end; assert_equal([1,nil,[]], [a,b,c])
  338. a,b,*c = loop do break *[nil]; end; assert_equal([nil,nil,[]], [a,b,c])
  339. a,b,*c = loop do break *[[]]; end; assert_equal([[],nil,[]], [a,b,c])
  340. a,b,*c = loop do break *[1,2]; end; assert_equal([1,2,[]], [a,b,c])
  341. a,b,*c = loop do break *[*[]]; end; assert_equal([nil,nil,[]], [a,b,c])
  342. a,b,*c = loop do break *[*[1]]; end; assert_equal([1,nil,[]], [a,b,c])
  343. a,b,*c = loop do break *[*[1,2]]; end; assert_equal([1,2,[]], [a,b,c])
  344. end
  345. def test_next
  346. def r(val); a = yield(); assert_equal(val, a); end
  347. r(nil){next}
  348. r(nil){next nil}
  349. r(1){next 1}
  350. r([]){next []}
  351. r([1]){next [1]}
  352. r([nil]){next [nil]}
  353. r([[]]){next [[]]}
  354. r([]){next [*[]]}
  355. r([1]){next [*[1]]}
  356. r([1,2]){next [*[1,2]]}
  357. r([]){next *[]}
  358. r([1]){next *[1]}
  359. r([nil]){next *[nil]}
  360. r([[]]){next *[[]]}
  361. r([]){next *[*[]]}
  362. r([1]){next *[*[1]]}
  363. r([1,2]){next *[*[1,2]]}
  364. undef r
  365. def r(val); *a = yield(); assert_equal(val, a); end
  366. r([nil]){next}
  367. r([nil]){next nil}
  368. r([1]){next 1}
  369. r([]){next []}
  370. r([1]){next [1]}
  371. r([nil]){next [nil]}
  372. r([[]]){next [[]]}
  373. r([1,2]){next [1,2]}
  374. r([]){next [*[]]}
  375. r([1]){next [*[1]]}
  376. r([1,2]){next [*[1,2]]}
  377. undef r
  378. def r(val); *a = *yield(); assert_equal(val, a); end
  379. r([[]]){next *[[]]}
  380. r([1,2]){next *[1,2]}
  381. r([1,2]){next *[*[1,2]]}
  382. undef r
  383. def r(val); a,b,*c = yield(); assert_equal(val, [a,b,c]); end
  384. r([nil,nil,[]]){next}
  385. r([nil,nil,[]]){next nil}
  386. r([1,nil,[]]){next 1}
  387. r([nil,nil,[]]){next []}
  388. r([1,nil,[]]){next [1]}
  389. r([nil,nil,[]]){next [nil]}
  390. r([[],nil,[]]){next [[]]}
  391. r([1,2,[]]){next [1,2]}
  392. r([nil,nil,[]]){next [*[]]}
  393. r([1,nil,[]]){next [*[1]]}
  394. r([1,2,[]]){next [*[1,2]]}
  395. undef r
  396. def r(val); a,b,*c = *yield(); assert_equal(val, [a,b,c]); end
  397. r([[],nil,[]]){next *[[]]}
  398. r([1,2,[]]){next *[1,2]}
  399. r([1,2,[]]){next *[*[1,2]]}
  400. undef r
  401. end
  402. def test_massign
  403. a = nil
  404. assert(defined?(a))
  405. assert_nil(a)
  406. # multiple assignment
  407. a, b = 1, 2
  408. assert_equal 1, a
  409. assert_equal 2, b
  410. a, b, c = 1, 2, 3
  411. assert_equal 1, a
  412. assert_equal 2, b
  413. assert_equal 3, c
  414. a = 1
  415. b = 2
  416. a, b = b, a
  417. assert_equal 2, a
  418. assert_equal 1, b
  419. a, = 1, 2
  420. assert_equal 1, a
  421. a, = 1, 2, 3
  422. assert_equal 1, a
  423. a, * = 1, 2, 3
  424. assert_equal 1, a
  425. a, *b = 1, 2, 3
  426. assert_equal 1, a
  427. assert_equal [2, 3], b
  428. a, *b, c = 1, 2, 3, 4
  429. assert_equal 1, a
  430. assert_equal [2,3], b
  431. assert_equal 4, c
  432. a = 1, 2
  433. assert_equal [1, 2], a
  434. a = [1, 2], [3, 4]
  435. assert_equal [[1,2], [3,4]], a
  436. a, (b, c), d = 1, [2, 3], 4
  437. assert_equal 1, a
  438. assert_equal 2, b
  439. assert_equal 3, c
  440. assert_equal 4, d
  441. *a = 1, 2, 3
  442. assert_equal([1, 2, 3], a)
  443. *a = 4
  444. assert_equal([4], a)
  445. *a = nil
  446. assert_equal([nil], a)
  447. a, b = 1
  448. assert_equal 1, a
  449. assert_nil b
  450. a, b = [1, 2]
  451. assert_equal 1, a
  452. assert_equal 2, b
  453. end
  454. def test_nested_massign
  455. (a, b), c = [[1, 2], 3]; assert_equal [1,2,3], [a,b,c]
  456. a, (b, c) = [[1, 2], 3]; assert_equal [[1,2], 3, nil], [a,b,c]
  457. a, (b, c) = [1, [2, 3]]; assert_equal [1,2,3], [a,b,c]
  458. (a, b), *c = [[1, 2], 3]; assert_equal [1,2,[3]], [a,b,c]
  459. (a,b),c,(d,e) = [[1,2],3,[4,5]]; assert_equal [1,2,3,4,5],[a,b,c,d,e]
  460. (a,*b),c,(d,e,*) = [[1,2],3,[4,5]]; assert_equal [1,[2],3,4,5],[a,b,c,d,e]
  461. (a,b),c,(d,*e) = [[1,2,3],4,[5,6,7,8]]; assert_equal [1,2,4,5,[6,7,8]],[a,b,c,d,e]
  462. (a,(b1,b2)),c,(d,e) = [[1,2],3,[4,5]]; assert_equal [1,2,nil,3,4,5],[a,b1,b2,c,d,e]
  463. (a,(b1,b2)),c,(d,e) = [[1,[21,22]],3,[4,5]]; assert_equal [1,21,22,3,4,5],[a,b1,b2,c,d,e]
  464. end
  465. class MyObj
  466. def to_ary
  467. [[1,2],[3,4]]
  468. end
  469. end
  470. def test_to_ary_splat
  471. a, b = MyObj.new
  472. assert_equal [[1,2],[3,4]], [a,b]
  473. end
  474. A = 1
  475. B = 2
  476. X, Y = A, B
  477. class Base
  478. A = 3
  479. B = 4
  480. end
  481. def test_const_massign
  482. assert_equal [1,2], [X,Y]
  483. a, b = Base::A, Base::B
  484. assert_equal [3,4], [a,b]
  485. end
  486. def test_massign_in_cond
  487. result = eval("if (a, b = MyObj.new); [a, b]; end", nil, __FILE__, __LINE__)
  488. assert_equal [[1,2],[3,4]], result
  489. end
  490. end
  491. require_relative 'sentence'
  492. class TestAssignmentGen < Test::Unit::TestCase
  493. Syntax = {
  494. :exp => [["0"],
  495. ["nil"],
  496. ["false"],
  497. ["[]"],
  498. ["[",:exps,"]"]],
  499. :exps => [[:exp],
  500. [:exp,",",:exps]],
  501. :arg => [[:exp]],
  502. :mrhs => [[:args,",",:arg],
  503. [:args,",","*",:arg],
  504. ["*",:arg]],
  505. :args => [[:arg],
  506. ["*",:arg],
  507. [:args,",",:arg],
  508. [:args,",","*",:arg]],
  509. :mlhs => [[:mlhs_basic],
  510. ["(",:mlhs_inner,")"]],
  511. :mlhs_inner => [[:mlhs_basic],
  512. ["(",:mlhs_inner,")"]],
  513. :mlhs_basic => [[:mlhs_head],
  514. [:mlhs_head,:mlhs_item],
  515. [:mlhs_head,"*",:mlhs_node],
  516. [:mlhs_head,"*",:mlhs_node,",",:mlhs_post],
  517. [:mlhs_head,"*"],
  518. [:mlhs_head,"*",",", :mlhs_post],
  519. [ "*",:mlhs_node],
  520. [ "*",:mlhs_node,",",:mlhs_post],
  521. [ "*"],
  522. [ "*",",", :mlhs_post]],
  523. :mlhs_head => [[:mlhs_item,","],
  524. [:mlhs_head,:mlhs_item,","]],
  525. :mlhs_post => [[:mlhs_item],
  526. [:mlhs_post,",",:mlhs_item]],
  527. :mlhs_item => [[:mlhs_node],
  528. ["(",:mlhs_inner,")"]],
  529. :mlhs_node => [["var"]],
  530. :xassign => [["var"," = ",:exp],
  531. ["var"," = ",:mrhs],
  532. [:mlhs," = ",:exp],
  533. [:mlhs," = ",:mrhs]],
  534. }
  535. def rename_var(obj)
  536. vars = []
  537. r = obj.subst('var') {
  538. var = "v#{vars.length}"
  539. vars << var
  540. var
  541. }
  542. return r, vars
  543. end
  544. def expand_except_paren(obj)
  545. return obj if obj.respond_to? :to_str
  546. obj.expand {|s|
  547. !(s[0] == '(' && s[-1] == ')') &&
  548. !(s[0] == '[' && s[-1] == ']')
  549. }
  550. end
  551. def extract_single_element(ary)
  552. raise "not a single element array: #{ary.inspect}" if ary.length != 1
  553. ary[0]
  554. end
  555. def emu_assign_ary(lhs, rv, h)
  556. rv = rv.respond_to?(:to_ary) ? rv : [rv]
  557. rv = rv.dup
  558. a = [[]]
  559. lhs.each {|e|
  560. if e == ','
  561. a << []
  562. else
  563. a.last << e
  564. end
  565. }
  566. a.pop if a.last == []
  567. pre = []
  568. star = post = nil
  569. a.each {|e|
  570. if post
  571. post << e
  572. elsif e[0] == '*'
  573. star = e
  574. post = []
  575. else
  576. pre << e
  577. end
  578. }
  579. pre.map! {|e| extract_single_element(e) }
  580. if star
  581. if star == ['*']
  582. star = nil
  583. else
  584. star = extract_single_element(star[1..-1])
  585. end
  586. end
  587. post.map! {|e| extract_single_element(e) } if post
  588. until pre.empty?
  589. emu_assign_single(pre.shift, rv.shift, h)
  590. end
  591. if post
  592. if rv.length < post.length
  593. until post.empty?
  594. emu_assign_single(post.shift, rv.shift, h)
  595. end
  596. else
  597. until post.empty?
  598. emu_assign_single(post.pop, rv.pop, h)
  599. end
  600. end
  601. end
  602. if star
  603. emu_assign_single(star, rv, h)
  604. end
  605. end
  606. def emu_assign_single(lhs, rv, h={})
  607. if lhs.respond_to? :to_str
  608. if /\A[a-z0-9]+\z/ =~ lhs
  609. h[lhs] = rv
  610. else
  611. raise "unexpected lhs string: #{lhs.inspect}"
  612. end
  613. elsif Sentence === lhs
  614. if lhs[0] == '(' && lhs[-1] == ')'
  615. emu_assign_ary(lhs[1...-1], rv, h)
  616. elsif lhs.length == 1 && String === lhs[0] && /\A[a-z0-9]+\z/ =~ lhs[0]
  617. h[lhs[0]] = rv
  618. else
  619. raise "unexpected lhs sentence: #{lhs.inspect}"
  620. end
  621. else
  622. raise "unexpected lhs: #{lhs.inspect}"
  623. end
  624. h
  625. end
  626. def emu_assign(assign)
  627. lhs = expand_except_paren(assign[0])
  628. rhs = expand_except_paren(assign[2])
  629. lopen = Sentence === lhs && lhs[-1] != ')' && lhs.any? {|e| e == '*' || e == ',' }
  630. ropen = Sentence === rhs && rhs[-1] != ']' && rhs.any? {|e| e == '*' || e == ',' }
  631. lhs = Sentence.new(['(']+lhs.to_a+[')']) if lopen
  632. begin
  633. rv = eval((ropen ? ["[",assign[2],"]"] : assign[2]).join(''))
  634. rescue Exception
  635. rv = $!.message
  636. end
  637. emu_assign_single(lhs, rv)
  638. end
  639. def do_assign(assign, vars)
  640. assign = assign.to_s
  641. code1 = "#{assign}; [#{vars.join(",")}]"
  642. assign.gsub!(/\bv\d+\b/, "o.a")
  643. code2 = "o=[];class << o; self end.send(:define_method,:a=){|v|self << v};#{assign};o"
  644. begin
  645. vals1 = eval(code1)
  646. rescue Exception
  647. return {:ex=>$!.message}
  648. end
  649. begin
  650. vals2 = eval(code2)
  651. rescue Exception
  652. return {:ex=>$!.message}
  653. end
  654. assert_equal(vals1, vals2, code1)
  655. vals = vals1
  656. h = {}
  657. [vars, vals].transpose.each {|k,v| h[k] = v }
  658. h
  659. end
  660. def check(assign)
  661. assign, vars = rename_var(assign)
  662. sent = assign.to_s
  663. bruby = do_assign(assign, vars).to_a.sort
  664. bemu = emu_assign(assign).to_a.sort
  665. assert_equal(bemu, bruby, sent)
  666. end
  667. def test_assignment
  668. syntax = Sentence.expand_syntax(Syntax)
  669. Sentence.each(syntax, :xassign, 4) {|assign|
  670. check(assign)
  671. }
  672. end
  673. def test_optimized_aset
  674. bug9448 = Class.new do
  675. def []=(key, new_value)
  676. '[ruby-core:60071] [Bug #9448]'
  677. end
  678. end
  679. o = bug9448.new
  680. assert_equal("ok", o['current'] = "ok")
  681. end
  682. def test_massign_aref_lhs_splat
  683. bug11970 = '[ruby-core:72777] [Bug #11970]'
  684. h = {}
  685. k = [:key]
  686. h[*k], = ["ok", "ng"]
  687. assert_equal("ok", h[:key], bug11970)
  688. end
  689. def test_chainged_assign_command
  690. all_assertions do |a|
  691. asgn = %w'= +='
  692. asgn.product(asgn) do |a1, a2|
  693. stmt = "a #{a1} b #{a2} raise 'x'"
  694. a.for(stmt) {assert_valid_syntax(stmt)}
  695. end
  696. end
  697. end
  698. end