PageRenderTime 57ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/TDDBC_Yokohama2_PCUnit/Ruby/doc/ruby/ruby-1.9.2/test/ruby/test_assignment.rb

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