opal 0.10.6 → 0.11.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (450) hide show
  1. checksums.yaml +5 -5
  2. data/.codeclimate.yml +19 -0
  3. data/.gitmodules +1 -1
  4. data/.jshintrc +1 -2
  5. data/.travis.yml +26 -18
  6. data/CHANGELOG.md +89 -23
  7. data/{CODE_OF_CONDUCT.md → CONDUCT.md} +0 -0
  8. data/Gemfile +19 -21
  9. data/HACKING.md +2 -0
  10. data/README.md +7 -6
  11. data/Rakefile +1 -1
  12. data/appveyor.yml +21 -4
  13. data/benchmark-ips/bm_case.rb +33 -0
  14. data/benchmark-ips/bm_constants_lookup.rb +13 -0
  15. data/benchmark-ips/bm_is_number.rb +29 -0
  16. data/benchmark-ips/bm_symbol_to_proc.rb +19 -0
  17. data/benchmark/bm_constant_lookup_big.rb +799 -0
  18. data/benchmark/bm_constant_lookup_small.rb +59 -0
  19. data/benchmark/bm_module_definition_big.rb +400 -0
  20. data/benchmark/bm_module_definition_small.rb +30 -0
  21. data/bin/opal-repl +23 -1
  22. data/docs/compiled_ruby.md +16 -14
  23. data/docs/faq.md +3 -3
  24. data/docs/rspec.md +2 -1
  25. data/docs/unsupported_features.md +6 -4
  26. data/examples/rack/Gemfile +1 -0
  27. data/examples/rack/app/application.rb +14 -3
  28. data/examples/rack/app/user.rb +2 -0
  29. data/examples/rack/config.ru +1 -1
  30. data/examples/rack/index.html.erb +1 -0
  31. data/lib/opal.rb +6 -1
  32. data/lib/opal/ast/builder.rb +17 -0
  33. data/lib/opal/ast/node.rb +30 -0
  34. data/lib/opal/builder.rb +14 -3
  35. data/lib/opal/builder_processors.rb +1 -0
  36. data/lib/opal/cli.rb +45 -59
  37. data/lib/opal/cli_options.rb +11 -7
  38. data/lib/opal/cli_runners.rb +1 -0
  39. data/lib/opal/cli_runners/applescript.rb +3 -3
  40. data/lib/opal/cli_runners/nashorn.rb +1 -0
  41. data/lib/opal/cli_runners/nodejs.rb +4 -1
  42. data/lib/opal/cli_runners/phantom.js +1 -2
  43. data/lib/opal/cli_runners/phantomjs.rb +3 -2
  44. data/lib/opal/cli_runners/server.rb +1 -0
  45. data/lib/opal/compiler.rb +145 -94
  46. data/lib/opal/config.rb +1 -0
  47. data/lib/opal/deprecations.rb +18 -0
  48. data/lib/opal/erb.rb +1 -0
  49. data/lib/opal/errors.rb +1 -0
  50. data/lib/opal/fragment.rb +1 -0
  51. data/lib/opal/hike_path_finder.rb +1 -0
  52. data/lib/opal/nodes.rb +3 -0
  53. data/lib/opal/nodes/arglist.rb +2 -1
  54. data/lib/opal/nodes/args/initialize_kwargs.rb +1 -0
  55. data/lib/opal/nodes/args/kwarg.rb +7 -7
  56. data/lib/opal/nodes/args/kwoptarg.rb +6 -7
  57. data/lib/opal/nodes/args/kwrestarg.rb +5 -5
  58. data/lib/opal/nodes/args/mlhsarg.rb +3 -2
  59. data/lib/opal/nodes/args/normarg.rb +6 -7
  60. data/lib/opal/nodes/args/optarg.rb +5 -7
  61. data/lib/opal/nodes/args/post_args.rb +6 -5
  62. data/lib/opal/nodes/args/post_kwargs.rb +1 -0
  63. data/lib/opal/nodes/args/restarg.rb +7 -7
  64. data/lib/opal/nodes/array.rb +1 -0
  65. data/lib/opal/nodes/base.rb +24 -3
  66. data/lib/opal/nodes/call.rb +167 -155
  67. data/lib/opal/nodes/call_special.rb +31 -217
  68. data/lib/opal/nodes/case.rb +36 -22
  69. data/lib/opal/nodes/class.rb +4 -3
  70. data/lib/opal/nodes/constants.rb +28 -48
  71. data/lib/opal/nodes/csend.rb +25 -0
  72. data/lib/opal/nodes/def.rb +49 -16
  73. data/lib/opal/nodes/defined.rb +170 -60
  74. data/lib/opal/nodes/definitions.rb +40 -133
  75. data/lib/opal/nodes/defs.rb +29 -0
  76. data/lib/opal/nodes/for.rb +52 -25
  77. data/lib/opal/nodes/hash.rb +12 -35
  78. data/lib/opal/nodes/helpers.rb +27 -54
  79. data/lib/opal/nodes/if.rb +21 -32
  80. data/lib/opal/nodes/inline_args.rb +12 -13
  81. data/lib/opal/nodes/iter.rb +61 -36
  82. data/lib/opal/nodes/literal.rb +189 -116
  83. data/lib/opal/nodes/logic.rb +20 -25
  84. data/lib/opal/nodes/masgn.rb +20 -18
  85. data/lib/opal/nodes/module.rb +10 -11
  86. data/lib/opal/nodes/node_with_args.rb +14 -17
  87. data/lib/opal/nodes/rescue.rb +37 -70
  88. data/lib/opal/nodes/runtime_helpers.rb +8 -3
  89. data/lib/opal/nodes/scope.rb +9 -5
  90. data/lib/opal/nodes/singleton_class.rb +4 -3
  91. data/lib/opal/nodes/super.rb +115 -87
  92. data/lib/opal/nodes/top.rb +7 -2
  93. data/lib/opal/nodes/variables.rb +46 -35
  94. data/lib/opal/nodes/while.rb +11 -1
  95. data/lib/opal/nodes/yield.rb +1 -17
  96. data/lib/opal/parser.rb +28 -770
  97. data/lib/opal/path_reader.rb +5 -1
  98. data/lib/opal/paths.rb +10 -4
  99. data/lib/opal/regexp_anchors.rb +1 -0
  100. data/lib/opal/rewriter.rb +60 -0
  101. data/lib/opal/rewriters/base.rb +60 -0
  102. data/lib/opal/rewriters/binary_operator_assignment.rb +144 -0
  103. data/lib/opal/rewriters/block_to_iter.rb +17 -0
  104. data/lib/opal/rewriters/break_finder.rb +34 -0
  105. data/lib/opal/rewriters/dot_js_syntax.rb +60 -0
  106. data/lib/opal/rewriters/explicit_writer_return.rb +58 -0
  107. data/lib/opal/rewriters/js_reserved_words.rb +111 -0
  108. data/lib/opal/rewriters/logical_operator_assignment.rb +155 -0
  109. data/lib/opal/rewriters/opal_engine_check.rb +42 -0
  110. data/lib/opal/rewriters/rubyspec/filters_rewriter.rb +67 -0
  111. data/lib/opal/server.rb +4 -0
  112. data/lib/opal/simple_server.rb +100 -0
  113. data/lib/opal/source_map.rb +1 -1
  114. data/lib/opal/util.rb +5 -5
  115. data/lib/opal/version.rb +2 -1
  116. data/lib/tilt/opal.rb +1 -0
  117. data/opal.gemspec +8 -7
  118. data/opal/README.md +1 -1
  119. data/opal/corelib/array.rb +137 -83
  120. data/opal/corelib/basic_object.rb +6 -6
  121. data/opal/corelib/class.rb +14 -11
  122. data/opal/corelib/complex.rb +5 -1
  123. data/opal/corelib/constants.rb +3 -3
  124. data/opal/corelib/enumerable.rb +129 -11
  125. data/opal/corelib/error.rb +35 -17
  126. data/opal/corelib/file.rb +65 -170
  127. data/opal/corelib/hash.rb +128 -13
  128. data/opal/corelib/helpers.rb +12 -15
  129. data/opal/corelib/io.rb +1 -0
  130. data/opal/corelib/kernel.rb +40 -21
  131. data/opal/corelib/marshal/read_buffer.rb +1 -1
  132. data/opal/corelib/method.rb +33 -13
  133. data/opal/corelib/module.rb +133 -81
  134. data/opal/corelib/number.rb +141 -25
  135. data/opal/corelib/numeric.rb +0 -8
  136. data/opal/corelib/process.rb +44 -4
  137. data/opal/corelib/random.rb +117 -0
  138. data/opal/corelib/random/seedrandom.js.rb +15 -0
  139. data/opal/corelib/range.rb +133 -10
  140. data/opal/corelib/regexp.rb +37 -9
  141. data/opal/corelib/runtime.js +601 -390
  142. data/opal/corelib/string.rb +39 -8
  143. data/opal/corelib/string/encoding.rb +51 -7
  144. data/opal/corelib/struct.rb +20 -0
  145. data/opal/corelib/time.rb +3 -3
  146. data/opal/corelib/variables.rb +1 -1
  147. data/opal/opal.rb +1 -0
  148. data/spec/filters/bugs/array.rb +5 -1
  149. data/spec/filters/bugs/basicobject.rb +2 -5
  150. data/spec/filters/bugs/bigdecimal.rb +8 -22
  151. data/spec/filters/bugs/class.rb +2 -1
  152. data/spec/filters/bugs/comparable.rb +5 -0
  153. data/spec/filters/bugs/date.rb +3 -3
  154. data/spec/filters/bugs/enumerable.rb +4 -11
  155. data/spec/filters/bugs/enumerator.rb +2 -4
  156. data/spec/filters/bugs/exception.rb +16 -2
  157. data/spec/filters/bugs/file.rb +8 -0
  158. data/spec/filters/bugs/float.rb +7 -1
  159. data/spec/filters/bugs/hash.rb +6 -2
  160. data/spec/filters/bugs/integer.rb +2 -0
  161. data/spec/filters/bugs/io.rb +8 -0
  162. data/spec/filters/bugs/kernel.rb +9 -138
  163. data/spec/filters/bugs/language.rb +89 -174
  164. data/spec/filters/bugs/marshal.rb +33 -35
  165. data/spec/filters/bugs/method.rb +0 -24
  166. data/spec/filters/bugs/module.rb +19 -55
  167. data/spec/filters/bugs/numeric.rb +0 -119
  168. data/spec/filters/bugs/pathname.rb +2 -0
  169. data/spec/filters/bugs/proc.rb +5 -4
  170. data/spec/filters/bugs/random.rb +7 -0
  171. data/spec/filters/bugs/range.rb +12 -120
  172. data/spec/filters/bugs/rational.rb +1 -1
  173. data/spec/filters/bugs/regexp.rb +2 -40
  174. data/spec/filters/bugs/set.rb +0 -1
  175. data/spec/filters/bugs/string.rb +5 -8
  176. data/spec/filters/bugs/stringscanner.rb +11 -19
  177. data/spec/filters/bugs/time.rb +7 -1
  178. data/spec/filters/bugs/unboundmethod.rb +1 -11
  179. data/spec/filters/unsupported/array.rb +5 -1
  180. data/spec/filters/unsupported/basicobject.rb +1 -1
  181. data/spec/filters/unsupported/bignum.rb +4 -1
  182. data/spec/filters/unsupported/class.rb +1 -1
  183. data/spec/filters/unsupported/delegator.rb +1 -1
  184. data/spec/filters/unsupported/enumerable.rb +1 -1
  185. data/spec/filters/unsupported/enumerator.rb +1 -1
  186. data/spec/filters/unsupported/file.rb +4 -0
  187. data/spec/filters/unsupported/fixnum.rb +1 -1
  188. data/spec/filters/unsupported/float.rb +4 -1
  189. data/spec/filters/unsupported/freeze.rb +27 -5
  190. data/spec/filters/unsupported/hash.rb +7 -15
  191. data/spec/filters/unsupported/integer.rb +1 -1
  192. data/spec/filters/unsupported/kernel.rb +2 -1
  193. data/spec/filters/unsupported/language.rb +6 -1
  194. data/spec/filters/unsupported/marshal.rb +1 -1
  195. data/spec/filters/unsupported/matchdata.rb +4 -1
  196. data/spec/filters/unsupported/math.rb +1 -1
  197. data/spec/filters/unsupported/pathname.rb +1 -1
  198. data/spec/filters/unsupported/privacy.rb +141 -9
  199. data/spec/filters/unsupported/proc.rb +1 -1
  200. data/spec/filters/unsupported/random.rb +4 -0
  201. data/spec/filters/unsupported/range.rb +7 -0
  202. data/spec/filters/unsupported/regexp.rb +25 -15
  203. data/spec/filters/unsupported/set.rb +1 -1
  204. data/spec/filters/unsupported/singleton.rb +1 -1
  205. data/spec/filters/unsupported/string.rb +110 -101
  206. data/spec/filters/unsupported/struct.rb +1 -1
  207. data/spec/filters/unsupported/symbol.rb +2 -1
  208. data/spec/filters/unsupported/taint.rb +22 -7
  209. data/spec/filters/unsupported/thread.rb +1 -1
  210. data/spec/filters/unsupported/time.rb +1 -1
  211. data/spec/lib/builder_spec.rb +17 -0
  212. data/spec/lib/cli_spec.rb +37 -8
  213. data/spec/lib/compiler/call_spec.rb +98 -66
  214. data/spec/lib/compiler_spec.rb +39 -30
  215. data/spec/lib/dependency_resolver_spec.rb +2 -2
  216. data/spec/lib/deprecations_spec.rb +16 -0
  217. data/spec/lib/fixtures/source_location_test.rb +7 -0
  218. data/spec/lib/rewriters/binary_operator_assignment_spec.rb +151 -0
  219. data/spec/lib/rewriters/block_to_iter_spec.rb +28 -0
  220. data/spec/lib/rewriters/dot_js_syntax_spec.rb +108 -0
  221. data/spec/lib/rewriters/explicit_writer_return_spec.rb +186 -0
  222. data/spec/lib/rewriters/js_reserved_words_spec.rb +116 -0
  223. data/spec/lib/rewriters/logical_operator_assignment_spec.rb +202 -0
  224. data/spec/lib/rewriters/opal_engine_check_spec.rb +82 -0
  225. data/spec/lib/rewriters/rubyspec/filters_rewriter_spec.rb +53 -0
  226. data/spec/lib/simple_server_spec.rb +54 -0
  227. data/spec/mspec-opal/formatters.rb +65 -17
  228. data/spec/mspec-opal/runner.rb +47 -67
  229. data/spec/opal/core/date_spec.rb +14 -0
  230. data/spec/opal/core/exception_spec.rb +10 -0
  231. data/spec/opal/core/hash/internals_spec.rb +10 -10
  232. data/spec/opal/core/kernel/rand_spec.rb +0 -4
  233. data/spec/opal/core/kernel/respond_to_spec.rb +5 -2
  234. data/spec/opal/core/language/constant_lookup_spec.rb +38 -0
  235. data/spec/opal/core/language/predefined_spec.rb +1 -1
  236. data/spec/opal/core/language/safe_navigator_spec.rb +7 -0
  237. data/spec/opal/core/language/send_spec.rb +1 -9
  238. data/spec/opal/core/language/string_spec.rb +8 -8
  239. data/spec/opal/core/language/versions/def_2_0_spec.rb +0 -4
  240. data/spec/opal/core/language_spec.rb +32 -0
  241. data/spec/opal/core/module/const_get_spec.rb +1 -1
  242. data/spec/opal/core/runtime/is_a_spec.rb +36 -0
  243. data/spec/opal/core/runtime/rescue_spec.rb +35 -0
  244. data/spec/opal/core/runtime_spec.rb +4 -4
  245. data/spec/opal/core/string_spec.rb +8 -8
  246. data/spec/opal/core/time_spec.rb +26 -17
  247. data/spec/opal/stdlib/erb/quoted.opalerb +1 -1
  248. data/spec/opal/stdlib/json/parse_spec.rb +4 -0
  249. data/spec/opal/stdlib/native/hash_spec.rb +16 -0
  250. data/spec/ruby_specs +2 -1
  251. data/spec/spec_helper.rb +1 -0
  252. data/spec/support/rewriters_helper.rb +24 -0
  253. data/stdlib/base64.rb +4 -2
  254. data/stdlib/bigdecimal/bignumber.js.rb +1 -1
  255. data/stdlib/date.rb +18 -19
  256. data/stdlib/json.rb +16 -4
  257. data/stdlib/nashorn/file.rb +15 -0
  258. data/stdlib/native.rb +21 -12
  259. data/stdlib/nodejs/dir.rb +1 -1
  260. data/stdlib/nodejs/file.rb +49 -20
  261. data/stdlib/nodejs/io.rb +22 -1
  262. data/stdlib/nodejs/{node_modules/js-yaml/dist/js-yaml.js → js-yaml-3-6-1.js} +815 -626
  263. data/stdlib/nodejs/kernel.rb +3 -1
  264. data/stdlib/nodejs/package.json +0 -1
  265. data/stdlib/nodejs/stacktrace.rb +163 -0
  266. data/stdlib/nodejs/yaml.rb +2 -1
  267. data/stdlib/opal-platform.rb +15 -0
  268. data/stdlib/opal/platform.rb +5 -13
  269. data/stdlib/pathname.rb +1 -1
  270. data/stdlib/strscan.rb +15 -1
  271. data/stdlib/yaml.rb +1 -1
  272. data/tasks/benchmarking.rake +9 -0
  273. data/tasks/building.rake +24 -20
  274. data/tasks/linting.rake +24 -13
  275. data/tasks/testing.rake +322 -205
  276. data/tasks/testing/mspec_special_calls.rb +44 -15
  277. data/tasks/testing/opal_rspec_smoketest.Gemfile +13 -0
  278. data/test/nodejs/fixtures/hello.rb +1 -0
  279. data/test/nodejs/test_file.rb +57 -0
  280. data/test/nodejs/test_io.rb +18 -0
  281. data/test/nodejs/test_opal_builder.rb +12 -0
  282. data/test/opal/unsupported_and_bugs.rb +9 -0
  283. metadata +127 -240
  284. data/lib/opal/parser/grammar.rb +0 -6157
  285. data/lib/opal/parser/grammar.y +0 -2011
  286. data/lib/opal/parser/keywords.rb +0 -66
  287. data/lib/opal/parser/lexer.rb +0 -1352
  288. data/lib/opal/parser/parser_scope.rb +0 -28
  289. data/lib/opal/parser/sexp.rb +0 -90
  290. data/lib/opal/sprockets.rb +0 -77
  291. data/lib/opal/sprockets/environment.rb +0 -23
  292. data/lib/opal/sprockets/erb.rb +0 -28
  293. data/lib/opal/sprockets/path_reader.rb +0 -36
  294. data/lib/opal/sprockets/processor.rb +0 -173
  295. data/lib/opal/sprockets/server.rb +0 -133
  296. data/lib/opal/sprockets/source_map_header_patch.rb +0 -41
  297. data/lib/opal/sprockets/source_map_server.rb +0 -117
  298. data/spec/filters/bugs/compiler_opal.rb +0 -5
  299. data/spec/filters/bugs/language_opal.rb +0 -88
  300. data/spec/filters/unsupported/module.rb +0 -8
  301. data/spec/lib/compiler/pre_processed_conditionals_spec.rb +0 -87
  302. data/spec/lib/lexer_spec.rb +0 -110
  303. data/spec/lib/parser/alias_spec.rb +0 -26
  304. data/spec/lib/parser/and_spec.rb +0 -13
  305. data/spec/lib/parser/aref_spec.rb +0 -10
  306. data/spec/lib/parser/attrasgn_spec.rb +0 -28
  307. data/spec/lib/parser/begin_spec.rb +0 -42
  308. data/spec/lib/parser/block_spec.rb +0 -12
  309. data/spec/lib/parser/break_spec.rb +0 -17
  310. data/spec/lib/parser/call_spec.rb +0 -201
  311. data/spec/lib/parser/class_spec.rb +0 -35
  312. data/spec/lib/parser/comments_spec.rb +0 -11
  313. data/spec/lib/parser/def_spec.rb +0 -109
  314. data/spec/lib/parser/if_spec.rb +0 -26
  315. data/spec/lib/parser/iter_spec.rb +0 -59
  316. data/spec/lib/parser/lambda_spec.rb +0 -219
  317. data/spec/lib/parser/literal_spec.rb +0 -118
  318. data/spec/lib/parser/masgn_spec.rb +0 -37
  319. data/spec/lib/parser/module_spec.rb +0 -27
  320. data/spec/lib/parser/not_spec.rb +0 -21
  321. data/spec/lib/parser/op_asgn1_spec.rb +0 -23
  322. data/spec/lib/parser/op_asgn2_spec.rb +0 -23
  323. data/spec/lib/parser/op_asgn_spec.rb +0 -17
  324. data/spec/lib/parser/or_spec.rb +0 -13
  325. data/spec/lib/parser/return_spec.rb +0 -22
  326. data/spec/lib/parser/sclass_spec.rb +0 -21
  327. data/spec/lib/parser/string_spec.rb +0 -286
  328. data/spec/lib/parser/super_spec.rb +0 -20
  329. data/spec/lib/parser/unary_spec.rb +0 -52
  330. data/spec/lib/parser/undef_spec.rb +0 -19
  331. data/spec/lib/parser/unless_spec.rb +0 -13
  332. data/spec/lib/parser/variables_spec.rb +0 -112
  333. data/spec/lib/parser/while_spec.rb +0 -15
  334. data/spec/lib/parser/yield_spec.rb +0 -20
  335. data/spec/lib/sprockets/erb_spec.rb +0 -38
  336. data/spec/lib/sprockets/path_reader_spec.rb +0 -41
  337. data/spec/lib/sprockets/processor_spec.rb +0 -79
  338. data/spec/lib/sprockets/server_spec.rb +0 -102
  339. data/spec/lib/sprockets_spec.rb +0 -39
  340. data/spec/lib/tilt/opal_spec.rb +0 -37
  341. data/spec/opal/core/language/block_spec.rb +0 -538
  342. data/spec/opal/core/language/proc_spec.rb +0 -263
  343. data/spec/opal/core/language/variables_spec.rb +0 -1366
  344. data/spec/opal/core/runtime/block_send_spec.rb +0 -28
  345. data/spec/opal/core/runtime/send_spec.rb +0 -34
  346. data/spec/support/parser_helpers.rb +0 -37
  347. data/stdlib/nodejs/node_modules/js-yaml/HISTORY.md +0 -277
  348. data/stdlib/nodejs/node_modules/js-yaml/LICENSE +0 -21
  349. data/stdlib/nodejs/node_modules/js-yaml/README.md +0 -288
  350. data/stdlib/nodejs/node_modules/js-yaml/bin/js-yaml.js +0 -140
  351. data/stdlib/nodejs/node_modules/js-yaml/bower.json +0 -23
  352. data/stdlib/nodejs/node_modules/js-yaml/dist/js-yaml.min.js +0 -3
  353. data/stdlib/nodejs/node_modules/js-yaml/examples/custom_types.js +0 -102
  354. data/stdlib/nodejs/node_modules/js-yaml/examples/custom_types.yml +0 -18
  355. data/stdlib/nodejs/node_modules/js-yaml/examples/dumper.js +0 -31
  356. data/stdlib/nodejs/node_modules/js-yaml/examples/dumper.json +0 -22
  357. data/stdlib/nodejs/node_modules/js-yaml/examples/sample_document.js +0 -18
  358. data/stdlib/nodejs/node_modules/js-yaml/examples/sample_document.yml +0 -197
  359. data/stdlib/nodejs/node_modules/js-yaml/index.js +0 -7
  360. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml.js +0 -39
  361. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/common.js +0 -62
  362. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/dumper.js +0 -554
  363. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/exception.js +0 -25
  364. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/loader.js +0 -1581
  365. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/mark.js +0 -78
  366. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema.js +0 -103
  367. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/core.js +0 -18
  368. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/default_full.js +0 -25
  369. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/default_safe.js +0 -28
  370. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/failsafe.js +0 -17
  371. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/json.js +0 -25
  372. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type.js +0 -61
  373. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/binary.js +0 -133
  374. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/bool.js +0 -37
  375. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/float.js +0 -110
  376. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/int.js +0 -183
  377. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/function.js +0 -85
  378. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/regexp.js +0 -84
  379. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/undefined.js +0 -27
  380. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/map.js +0 -8
  381. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/merge.js +0 -12
  382. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/null.js +0 -36
  383. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/omap.js +0 -56
  384. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/pairs.js +0 -61
  385. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/seq.js +0 -8
  386. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/set.js +0 -33
  387. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/str.js +0 -8
  388. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/timestamp.js +0 -98
  389. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/HISTORY.md +0 -115
  390. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/LICENSE +0 -21
  391. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/README.md +0 -239
  392. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/arguments.js +0 -36
  393. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/choice.js +0 -22
  394. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/constants.js +0 -59
  395. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/help.js +0 -13
  396. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/nargs.js +0 -33
  397. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/parents.js +0 -28
  398. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/prefix_chars.js +0 -23
  399. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/sub_commands.js +0 -49
  400. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/sum.js +0 -35
  401. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/testformatters.js +0 -270
  402. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/index.js +0 -1
  403. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action.js +0 -146
  404. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/append.js +0 -55
  405. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/append/constant.js +0 -47
  406. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/count.js +0 -40
  407. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/help.js +0 -48
  408. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store.js +0 -50
  409. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/constant.js +0 -43
  410. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/false.js +0 -27
  411. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/true.js +0 -26
  412. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/subparsers.js +0 -148
  413. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/version.js +0 -50
  414. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action_container.js +0 -481
  415. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argparse.js +0 -14
  416. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/error.js +0 -50
  417. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/exclusive.js +0 -54
  418. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/group.js +0 -75
  419. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument_parser.js +0 -1168
  420. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/const.js +0 -18
  421. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/help/added_formatters.js +0 -88
  422. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/help/formatter.js +0 -798
  423. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/namespace.js +0 -77
  424. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.npmignore +0 -2
  425. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.travis.yml +0 -8
  426. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/README.markdown +0 -825
  427. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/bower.json +0 -33
  428. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/component.json +0 -11
  429. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/foo.js +0 -10
  430. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/gulpfile.js +0 -26
  431. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/lib/underscore.string.js +0 -673
  432. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/libpeerconnection.log +0 -0
  433. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/package.json +0 -107
  434. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/LICENSE +0 -23
  435. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/README.md +0 -22
  436. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/package.json +0 -69
  437. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore-min.js +0 -6
  438. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore.js +0 -1415
  439. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/package.json +0 -62
  440. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/README.md +0 -73
  441. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/bin/esparse.js +0 -117
  442. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/bin/esvalidate.js +0 -177
  443. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/esprima.js +0 -3908
  444. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/package.json +0 -69
  445. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/compat.js +0 -239
  446. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/reflect.js +0 -422
  447. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/run.js +0 -66
  448. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/runner.js +0 -387
  449. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/test.js +0 -20238
  450. data/stdlib/nodejs/node_modules/js-yaml/package.json +0 -83
@@ -1,263 +0,0 @@
1
- describe "A Proc" do
2
- it "captures locals from the surrounding scope" do
3
- var = 1
4
- lambda { var }.call.should == 1
5
- end
6
-
7
- ruby_version_is ""..."1.9" do
8
- it "overwrites a captured local when used as an argument" do
9
- var = 1
10
- lambda { |var| var }.call(2).should == 2
11
- var.should == 2
12
- end
13
- end
14
-
15
- ruby_version_is "1.9" do
16
- it "does not capture a local when an argument has the same name" do
17
- var = 1
18
- lambda { |var| var }.call(2).should == 2
19
- var.should == 1
20
- end
21
- end
22
-
23
- describe "taking zero arguments" do
24
- before :each do
25
- @l = lambda { 1 }
26
- end
27
-
28
- it "does not raise an exception if no values are passed" do
29
- @l.call.should == 1
30
- end
31
-
32
- ruby_version_is ""..."1.9" do
33
- it "does not raise an exception if a value is passed" do
34
- @l.call(0).should == 1
35
- end
36
- end
37
-
38
- ruby_version_is "1.9" do
39
- it "raises an ArgumentErro if a value is passed" do
40
- lambda { @l.call(0) }.should raise_error(ArgumentError)
41
- end
42
- end
43
- end
44
-
45
- describe "taking || arguments" do
46
- before :each do
47
- @l = lambda { || 1 }
48
- end
49
-
50
- it "does not raise an exception when passed no values" do
51
- @l.call.should == 1
52
- end
53
-
54
- it "raises an ArgumentError if a value is passed" do
55
- lambda { @l.call(0) }.should raise_error(ArgumentError)
56
- end
57
- end
58
-
59
- describe "taking |a| arguments" do
60
- before :each do
61
- @l = lambda { |a| a }
62
- end
63
-
64
- it "assigns the value passed to the argument" do
65
- @l.call(2).should == 2
66
- end
67
-
68
- it "does not destructure a single Array value" do
69
- @l.call([1, 2]).should == [1, 2]
70
- end
71
-
72
- it "does not call #to_ary to convert a single passed object to an Array" do
73
- obj = mock("block yield to_ary")
74
- obj.should_not_receive(:to_ary)
75
-
76
- @l.call(obj).should equal(obj)
77
- end
78
-
79
- ruby_version_is ""..."1.9" do
80
- it "assigns nil to the argument if no value is passed" do
81
- @l.call.should be_nil
82
- end
83
-
84
- it "assigns all the values passed to the argument as an Array" do
85
- @l.call(1, 2).should == [1, 2]
86
- end
87
- end
88
-
89
- ruby_version_is "1.9" do
90
- it "raises an ArgumentError if no value is passed" do
91
- lambda { @l.call }.should raise_error(ArgumentError)
92
- end
93
- end
94
- end
95
-
96
- describe "taking |a, b| arguments" do
97
- before :each do
98
- @l = lambda { |a, b| [a, b] }
99
- end
100
-
101
- it "raises an ArgumentError if passed no values" do
102
- lambda { @l.call }.should raise_error(ArgumentError)
103
- end
104
-
105
- it "raises an ArgumentError if passed one value" do
106
- lambda { @l.call(0) }.should raise_error(ArgumentError)
107
- end
108
-
109
- it "assigns the values passed to the arguments" do
110
- @l.call(1, 2).should == [1, 2]
111
- end
112
-
113
- it "does not call #to_ary to convert a single passed object to an Array" do
114
- obj = mock("proc call to_ary")
115
- obj.should_not_receive(:to_ary)
116
-
117
- lambda { @l.call(obj) }.should raise_error(ArgumentError)
118
- end
119
- end
120
-
121
- describe "taking |a, *b| arguments" do
122
- before :each do
123
- @l = lambda { |a, *b| [a, b] }
124
- end
125
-
126
- it "raises an ArgumentError if passed no values" do
127
- lambda { @l.call }.should raise_error(ArgumentError)
128
- end
129
-
130
- it "does not destructure a single Array value yielded" do
131
- @l.call([1, 2, 3]).should == [[1, 2, 3], []]
132
- end
133
-
134
- it "assigns all passed values after the first to the rest argument" do
135
- @l.call(1, 2, 3).should == [1, [2, 3]]
136
- end
137
-
138
- it "does not call #to_ary to convert a single passed object to an Array" do
139
- obj = mock("block yield to_ary")
140
- obj.should_not_receive(:to_ary)
141
-
142
- @l.call(obj).should == [obj, []]
143
- end
144
- end
145
-
146
- describe "taking |*| arguments" do
147
- before :each do
148
- # @l = lambda { |*| 1 }
149
- end
150
-
151
- it "does not raise an exception when passed no values" do
152
- @l.call.should == 1
153
- end
154
-
155
- it "does not raise an exception when passed multiple values" do
156
- @l.call(2, 3, 4).should == 1
157
- end
158
-
159
- it "does not call #to_ary to convert a single passed object to an Array" do
160
- obj = mock("block yield to_ary")
161
- obj.should_not_receive(:to_ary)
162
-
163
- @l.call(obj).should == 1
164
- end
165
- end
166
-
167
- describe "taking |*a| arguments" do
168
- before :each do
169
- @l = lambda { |*a| a }
170
- end
171
-
172
- it "assigns [] to the argument when passed no values" do
173
- @l.call.should == []
174
- end
175
-
176
- it "assigns the argument an Array wrapping one passed value" do
177
- @l.call(1).should == [1]
178
- end
179
-
180
- it "assigns the argument an Array wrapping all values passed" do
181
- @l.call(1, 2, 3).should == [1, 2, 3]
182
- end
183
-
184
- it "does not call #to_ary to convert a single passed object to an Array" do
185
- obj = mock("block yield to_ary")
186
- obj.should_not_receive(:to_ary)
187
-
188
- @l.call(obj).should == [obj]
189
- end
190
- end
191
-
192
- describe "taking |a, | arguments" do
193
- before :each do
194
- # @l = lambda { |a, | a }
195
- end
196
-
197
- it "raises an ArgumentError when passed no values" do
198
- lambda { @l.call }.should raise_error(ArgumentError)
199
- end
200
-
201
- it "raises an ArgumentError when passed more than one value" do
202
- lambda { @l.call(1, 2) }.should raise_error(ArgumentError)
203
- end
204
-
205
- it "assigns the argument the value passed" do
206
- @l.call(1).should == 1
207
- end
208
-
209
- it "does not destructure when passed a single Array" do
210
- @l.call([1,2]).should == [1, 2]
211
- end
212
-
213
- it "does not call #to_ary to convert a single passed object to an Array" do
214
- obj = mock("block yield to_ary")
215
- obj.should_not_receive(:to_ary)
216
-
217
- @l.call(obj).should == obj
218
- end
219
- end
220
-
221
- describe "taking |(a, b)| arguments" do
222
- before :each do
223
- # @l = lambda { |(a, b)| [a, b] }
224
- end
225
-
226
- it "raises an ArgumentError when passed no values" do
227
- lambda { @l.call }.should raise_error(ArgumentError)
228
- end
229
-
230
- ruby_version_is ""..."1.9" do
231
- it "raises an ArgumentError when passed a single Array" do
232
- lambda { @l.call([1, 2]) }.should raise_error(ArgumentError)
233
- end
234
-
235
- it "raises an ArgumentError when passed a single object" do
236
- obj = mock("block yield to_ary")
237
- obj.should_not_receive(:to_ary)
238
-
239
- lambda { @l.call(obj) }.should raise_error(ArgumentError)
240
- end
241
- end
242
-
243
- ruby_version_is "1.9" do
244
- it "destructures a single Array value yielded" do
245
- @l.call([1, 2]).should == [1, 2]
246
- end
247
-
248
- it "calls #to_ary to convert a single passed object to an Array" do
249
- obj = mock("block yield to_ary")
250
- obj.should_receive(:to_ary).and_return([1, 2])
251
-
252
- @l.call(obj).should == [1, 2]
253
- end
254
-
255
- it "raises an TypeError if #to_ary does not return an Array" do
256
- obj = mock("block yield to_ary invalid")
257
- obj.should_receive(:to_ary).and_return(1)
258
-
259
- lambda { @l.call(obj) }.should raise_error(TypeError)
260
- end
261
- end
262
- end
263
- end
@@ -1,1366 +0,0 @@
1
- require File.expand_path('../fixtures/variables', __FILE__)
2
-
3
- # TODO: partition these specs into distinct cases based on the
4
- # real parsed forms, not the superficial code forms.
5
- describe "Basic assignment" do
6
- it "allows the rhs to be assigned to the lhs" do
7
- a = nil
8
- a.should == nil
9
- end
10
-
11
- it "assigns nil to lhs when rhs is an empty expression" do
12
- a = ()
13
- a.should be_nil
14
- end
15
-
16
- ruby_version_is "" ... "1.9" do
17
- it "assigns nil to lhs when rhs is an empty splat expression" do
18
- a = *()
19
- a.should be_nil
20
- end
21
- end
22
-
23
- ruby_version_is "1.9" do
24
- it "assigns [] to lhs when rhs is an empty splat expression" do
25
- a = *()
26
- a.should == []
27
- end
28
- end
29
-
30
- ruby_version_is "" ... "1.9" do
31
- it "allows the assignment of the rhs to the lhs using the rhs splat operator" do
32
- a = *nil; a.should == nil
33
- a = *1; a.should == 1
34
- a = *[]; a.should == nil
35
- a = *[1]; a.should == 1
36
- a = *[nil]; a.should == nil
37
- a = *[[]]; a.should == []
38
- a = *[1,2]; a.should == [1,2]
39
- end
40
- end
41
-
42
- ruby_version_is "1.9" do
43
- it "allows the assignment of the rhs to the lhs using the rhs splat operator" do
44
- a = *nil; a.should == []
45
- a = *1; a.should == [1]
46
- a = *[]; a.should == []
47
- a = *[1]; a.should == [1]
48
- a = *[nil]; a.should == [nil]
49
- a = *[[]]; a.should == [[]]
50
- a = *[1,2]; a.should == [1,2]
51
- end
52
- end
53
-
54
- ruby_version_is "" ... "1.9" do
55
- it "allows the assignment of the rhs to the lhs using the lhs splat operator" do
56
- # * = 1,2 # Valid syntax, but pretty useless! Nothing to test
57
- *a = nil; a.should == [nil]
58
- *a = 1; a.should == [1]
59
- *a = []; a.should == [[]]
60
- *a = [1]; a.should == [[1]]
61
- *a = [1,2]; a.should == [[1,2]]
62
- end
63
- end
64
-
65
- ruby_version_is "1.9" do
66
- it "allows the assignment of the rhs to the lhs using the lhs splat operator" do
67
- # * = 1,2 # Valid syntax, but pretty useless! Nothing to test
68
- *a = nil; a.should == [nil]
69
- *a = 1; a.should == [1]
70
- *a = []; a.should == []
71
- *a = [1]; a.should == [1]
72
- *a = [1,2]; a.should == [1,2]
73
- end
74
- end
75
-
76
- ruby_version_is "" ... "1.9" do
77
- it "allows the assignment of rhs to the lhs using the lhs and rhs splat operators simultaneously" do
78
- *a = *nil; a.should == [nil]
79
- *a = *1; a.should == [1]
80
- *a = *[]; a.should == []
81
- *a = *[1]; a.should == [1]
82
- *a = *[nil]; a.should == [nil]
83
- *a = *[1,2]; a.should == [1,2]
84
- end
85
- end
86
-
87
- ruby_version_is "1.9" do
88
- it "allows the assignment of rhs to the lhs using the lhs and rhs splat operators simultaneously" do
89
- *a = *nil; a.should == []
90
- *a = *1; a.should == [1]
91
- *a = *[]; a.should == []
92
- *a = *[1]; a.should == [1]
93
- *a = *[nil]; a.should == [nil]
94
- *a = *[1,2]; a.should == [1,2]
95
- end
96
- end
97
-
98
- it "sets unavailable values to nil" do
99
- ary = []
100
- a, b, c = ary
101
-
102
- a.should be_nil
103
- b.should be_nil
104
- c.should be_nil
105
- end
106
-
107
- it "sets the splat to an empty Array if there are no more values" do
108
- ary = []
109
- a, b, *c = ary
110
-
111
- a.should be_nil
112
- b.should be_nil
113
- c.should == []
114
- end
115
-
116
- it "allows multiple values to be assigned" do
117
- a,b,*c = nil; [a,b,c].should == [nil, nil, []]
118
- a,b,*c = 1; [a,b,c].should == [1, nil, []]
119
- a,b,*c = []; [a,b,c].should == [nil, nil, []]
120
- a,b,*c = [1]; [a,b,c].should == [1, nil, []]
121
- a,b,*c = [nil]; [a,b,c].should == [nil, nil, []]
122
- a,b,*c = [[]]; [a,b,c].should == [[], nil, []]
123
- a,b,*c = [1,2]; [a,b,c].should == [1,2,[]]
124
-
125
- a,b,*c = *nil; [a,b,c].should == [nil, nil, []]
126
- a,b,*c = *1; [a,b,c].should == [1, nil, []]
127
- a,b,*c = *[]; [a,b,c].should == [nil, nil, []]
128
- a,b,*c = *[1]; [a,b,c].should == [1, nil, []]
129
- a,b,*c = *[nil]; [a,b,c].should == [nil, nil, []]
130
- a,b,*c = *[[]]; [a,b,c].should == [[], nil, []]
131
- a,b,*c = *[1,2]; [a,b,c].should == [1,2,[]]
132
- end
133
-
134
- it "calls to_a on the given argument when using a splat" do
135
- a,b = *VariablesSpecs::ArrayLike.new([1,2]); [a,b].should == [1,2]
136
- end
137
-
138
- it "supports the {|r,| } form of block assignment" do
139
- f = lambda {|r,| r.should == []}
140
- f.call([], *[])
141
-
142
- f = lambda{|x,| x}
143
- f.call(42).should == 42
144
- f.call([42]).should == [42]
145
- f.call([[42]]).should == [[42]]
146
- f.call([42,55]).should == [42,55]
147
- end
148
-
149
- it "allows assignment through lambda" do
150
- f = lambda {|r,*l| r.should == []; l.should == [1]}
151
- f.call([], *[1])
152
-
153
- f = lambda{|x| x}
154
- f.call(42).should == 42
155
- f.call([42]).should == [42]
156
- f.call([[42]]).should == [[42]]
157
- f.call([42,55]).should == [42,55]
158
-
159
- f = lambda{|*x| x}
160
- f.call(42).should == [42]
161
- f.call([42]).should == [[42]]
162
- f.call([[42]]).should == [[[42]]]
163
- f.call([42,55]).should == [[42,55]]
164
- f.call(42,55).should == [42,55]
165
- end
166
-
167
- it "allows chained assignment" do
168
- (a = 1 + b = 2 + c = 4 + d = 8).should == 15
169
- d.should == 8
170
- c.should == 12
171
- b.should == 14
172
- a.should == 15
173
- end
174
- end
175
-
176
- describe "Assignment using expansion" do
177
- ruby_version_is "" ... "1.9" do
178
- it "succeeds without conversion" do
179
- *x = (1..7).to_a
180
- x.should == [[1, 2, 3, 4, 5, 6, 7]]
181
- end
182
- end
183
-
184
- ruby_version_is "1.9" do
185
- it "succeeds without conversion" do
186
- *x = (1..7).to_a
187
- x.should == [1, 2, 3, 4, 5, 6, 7]
188
- end
189
- end
190
- end
191
-
192
- describe "Basic multiple assignment" do
193
- describe "with a single RHS value" do
194
- it "does not call #to_ary on an Array instance" do
195
- x = [1, 2]
196
- x.should_not_receive(:to_ary)
197
-
198
- a, b = x
199
- a.should == 1
200
- b.should == 2
201
- end
202
-
203
- it "does not call #to_a on an Array instance" do
204
- x = [1, 2]
205
- x.should_not_receive(:to_a)
206
-
207
- a, b = x
208
- a.should == 1
209
- b.should == 2
210
- end
211
-
212
- it "does not call #to_ary on an Array subclass instance" do
213
- x = VariablesSpecs::ArraySubclass.new [1, 2]
214
- x.should_not_receive(:to_ary)
215
-
216
- a, b = x
217
- a.should == 1
218
- b.should == 2
219
- end
220
-
221
- it "does not call #to_a on an Array subclass instance" do
222
- x = VariablesSpecs::ArraySubclass.new [1, 2]
223
- x.should_not_receive(:to_a)
224
-
225
- a, b = x
226
- a.should == 1
227
- b.should == 2
228
- end
229
-
230
- it "calls #to_ary on an object" do
231
- x = mock("single rhs value for masgn")
232
- x.should_receive(:to_ary).and_return([1, 2])
233
-
234
- a, b = x
235
- a.should == 1
236
- b.should == 2
237
- end
238
-
239
- it "does not call #to_a on an object if #to_ary is not defined" do
240
- x = mock("single rhs value for masgn")
241
- x.should_not_receive(:to_a)
242
-
243
- a, b = x
244
- a.should == x
245
- b.should be_nil
246
- end
247
-
248
- it "does not call #to_a on a String" do
249
- x = "one\ntwo"
250
-
251
- a, b = x
252
- a.should == x
253
- b.should be_nil
254
- end
255
- end
256
-
257
- describe "with a splatted single RHS value" do
258
- it "does not call #to_ary on an Array instance" do
259
- x = [1, 2]
260
- x.should_not_receive(:to_ary)
261
-
262
- a, b = *x
263
- a.should == 1
264
- b.should == 2
265
- end
266
-
267
- it "does not call #to_a on an Array instance" do
268
- x = [1, 2]
269
- x.should_not_receive(:to_a)
270
-
271
- a, b = *x
272
- a.should == 1
273
- b.should == 2
274
- end
275
-
276
- it "does not call #to_ary on an Array subclass instance" do
277
- x = VariablesSpecs::ArraySubclass.new [1, 2]
278
- x.should_not_receive(:to_ary)
279
-
280
- a, b = *x
281
- a.should == 1
282
- b.should == 2
283
- end
284
-
285
- it "does not call #to_a on an Array subclass instance" do
286
- x = VariablesSpecs::ArraySubclass.new [1, 2]
287
- x.should_not_receive(:to_a)
288
-
289
- a, b = *x
290
- a.should == 1
291
- b.should == 2
292
- end
293
-
294
- it "calls #to_a on an object if #to_ary is not defined" do
295
- x = mock("single splatted rhs value for masgn")
296
- x.should_receive(:to_a).and_return([1, 2])
297
-
298
- a, b = *x
299
- a.should == 1
300
- b.should == 2
301
- end
302
-
303
- ruby_version_is ""..."1.9" do
304
- it "calls #to_ary on an object" do
305
- x = mock("single splatted rhs value for masgn")
306
- x.should_receive(:to_ary).and_return([1, 2])
307
-
308
- a, b = *x
309
- a.should == 1
310
- b.should == 2
311
- end
312
-
313
- it "calls #to_a on a String" do
314
- x = "one\ntwo"
315
-
316
- a, b = *x
317
- a.should == "one\n"
318
- b.should == "two"
319
- end
320
- end
321
-
322
- ruby_version_is "1.9" do
323
- it "does not call #to_ary on an object" do
324
- x = mock("single splatted rhs value for masgn")
325
- x.should_not_receive(:to_ary)
326
-
327
- a, b = *x
328
- a.should == x
329
- b.should be_nil
330
- end
331
-
332
- it "does not call #to_a on a String" do
333
- x = "one\ntwo"
334
-
335
- a, b = *x
336
- a.should == x
337
- b.should be_nil
338
- end
339
- end
340
- end
341
- end
342
-
343
- describe "Assigning multiple values" do
344
- it "allows parallel assignment" do
345
- a, b = 1, 2
346
- a.should == 1
347
- b.should == 2
348
-
349
- # a, = 1,2
350
- a.should == 1
351
- end
352
-
353
- it "allows safe parallel swapping" do
354
- a, b = 1, 2
355
- a, b = b, a
356
- a.should == 2
357
- b.should == 1
358
- end
359
-
360
- not_compliant_on :rubinius do
361
- it "returns the rhs values used for assignment as an array" do
362
- # x = begin; a, b, c = 1, 2, 3; end
363
- x.should == [1,2,3]
364
- end
365
- end
366
-
367
- ruby_version_is "" ... "1.9" do
368
- it "wraps a single value in an Array" do
369
- *a = 1
370
- a.should == [1]
371
-
372
- b = [1]
373
- *a = b
374
- a.should == [b]
375
- end
376
- end
377
-
378
- ruby_version_is "1.9" do
379
- it "wraps a single value in an Array if it's not already one" do
380
- *a = 1
381
- a.should == [1]
382
-
383
- b = [1]
384
- *a = b
385
- a.should == b
386
- end
387
- end
388
-
389
- it "evaluates rhs left-to-right" do
390
- a = VariablesSpecs::ParAsgn.new
391
- d, e ,f = a.inc, a.inc, a.inc
392
- d.should == 1
393
- e.should == 2
394
- f.should == 3
395
- end
396
-
397
- it "supports parallel assignment to lhs args via object.method=" do
398
- a = VariablesSpecs::ParAsgn.new
399
- a.x, b = 1, 2
400
-
401
- a.x.should == 1
402
- b.should == 2
403
-
404
- c = VariablesSpecs::ParAsgn.new
405
- c.x, a.x = a.x, b
406
-
407
- c.x.should == 1
408
- a.x.should == 2
409
- end
410
-
411
- it "supports parallel assignment to lhs args using []=" do
412
- a = [1,2,3]
413
- a[3], b = 4,5
414
-
415
- a.should == [1,2,3,4]
416
- b.should == 5
417
- end
418
-
419
- it "bundles remaining values to an array when using the splat operator" do
420
- a, *b = 1, 2, 3
421
- a.should == 1
422
- b.should == [2, 3]
423
-
424
- *a = 1, 2, 3
425
- a.should == [1, 2, 3]
426
-
427
- *a = 4
428
- a.should == [4]
429
-
430
- *a = nil
431
- a.should == [nil]
432
-
433
- a, = *[1]
434
- a.should == 1
435
- end
436
-
437
- ruby_version_is ""..."1.9" do
438
- it "calls #to_ary on rhs arg if rhs has only a single arg" do
439
- x = VariablesSpecs::ParAsgn.new
440
- a,b,c = x
441
- a.should == 1
442
- b.should == 2
443
- c.should == 3
444
-
445
- a,b,c = x,5
446
- a.should == x
447
- b.should == 5
448
- c.should == nil
449
-
450
- a,b,c = 5,x
451
- a.should == 5
452
- b.should == x
453
- c.should == nil
454
-
455
- a,b,*c = x,5
456
- a.should == x
457
- b.should == 5
458
- c.should == []
459
-
460
- # a,(b,c) = 5,x
461
- a.should == 5
462
- b.should == 1
463
- c.should == 2
464
-
465
- # a,(b,*c) = 5,x
466
- a.should == 5
467
- b.should == 1
468
- c.should == [2,3,4]
469
-
470
- # a,(b,(*c)) = 5,x
471
- a.should == 5
472
- b.should == 1
473
- c.should == [2]
474
-
475
- # a,(b,(*c),(*d)) = 5,x
476
- a.should == 5
477
- b.should == 1
478
- c.should == [2]
479
- d.should == [3]
480
-
481
- # a,(b,(*c),(d,*e)) = 5,x
482
- a.should == 5
483
- b.should == 1
484
- c.should == [2]
485
- d.should == 3
486
- e.should == []
487
- end
488
- end
489
-
490
- ruby_version_is "1.9" do
491
- it "calls #to_ary on RHS arg if the corresponding LHS var is a splat" do
492
- x = VariablesSpecs::ParAsgn.new
493
-
494
- # a,(*b),c = 5,x
495
- a.should == 5
496
- b.should == x.to_ary
497
- c.should == nil
498
- end
499
- end
500
-
501
- ruby_version_is ""..."1.9" do
502
- it "doen't call #to_ary on RHS arg when the corresponding LHS var is a splat" do
503
- x = VariablesSpecs::ParAsgn.new
504
-
505
- # a,(*b),c = 5,x
506
- a.should == 5
507
- b.should == [x]
508
- c.should == nil
509
- end
510
- end
511
-
512
- it "allows complex parallel assignment" do
513
- # a, (b, c), d = 1, [2, 3], 4
514
- a.should == 1
515
- b.should == 2
516
- c.should == 3
517
- d.should == 4
518
-
519
- # x, (y, z) = 1, 2, 3
520
- [x,y,z].should == [1,2,nil]
521
- # x, (y, z) = 1, [2,3]
522
- [x,y,z].should == [1,2,3]
523
- # x, (y, z) = 1, [2]
524
- [x,y,z].should == [1,2,nil]
525
-
526
- # a,(b,c,*d),(e,f),*g = 0,[1,2,3,4],[5,6],7,8
527
- a.should == 0
528
- b.should == 1
529
- c.should == 2
530
- d.should == [3,4]
531
- e.should == 5
532
- f.should == 6
533
- g.should == [7,8]
534
-
535
- x = VariablesSpecs::ParAsgn.new
536
- # a,(b,c,*d),(e,f),*g = 0,x,[5,6],7,8
537
- a.should == 0
538
- b.should == 1
539
- c.should == 2
540
- d.should == [3,4]
541
- e.should == 5
542
- f.should == 6
543
- g.should == [7,8]
544
- end
545
-
546
- it "allows a lhs arg to be used in another lhs args parallel assignment" do
547
- c = [4,5,6]
548
- a,b,c[a] = 1,2,3
549
- a.should == 1
550
- b.should == 2
551
- c.should == [4,3,6]
552
-
553
- c[a],b,a = 7,8,9
554
- a.should == 9
555
- b.should == 8
556
- c.should == [4,7,6]
557
- end
558
- end
559
-
560
- describe "Conditional assignment" do
561
- it "assigns the lhs if previously unassigned" do
562
- a=[]
563
- a[0] ||= "bar"
564
- a[0].should == "bar"
565
-
566
- h={}
567
- h["foo"] ||= "bar"
568
- h["foo"].should == "bar"
569
-
570
- h["foo".to_sym] ||= "bar"
571
- h["foo".to_sym].should == "bar"
572
-
573
- aa = 5
574
- aa ||= 25
575
- aa.should == 5
576
-
577
- bb ||= 25
578
- bb.should == 25
579
-
580
- cc &&=33
581
- cc.should == nil
582
-
583
- cc = 5
584
- cc &&=44
585
- cc.should == 44
586
- end
587
-
588
- it "checks for class variable definition before fetching its value" do
589
- class VariableSpecCVarSpec
590
- @@cvarspec ||= 5
591
- @@cvarspec.should == 5
592
- end
593
- end
594
- end
595
-
596
- describe "Unconditional operator assignment 'var op= expr'" do
597
- it "is equivalent to 'var = var op expr'" do
598
- x = 13
599
- (x += 5).should == 18
600
- x.should == 18
601
-
602
- x = 17
603
- (x -= 11).should == 6
604
- x.should == 6
605
-
606
- x = 2
607
- (x *= 5).should == 10
608
- x.should == 10
609
-
610
- x = 36
611
- (x /= 9).should == 4
612
- x.should == 4
613
-
614
- x = 23
615
- (x %= 5).should == 3
616
- x.should == 3
617
- (x %= 3).should == 0
618
- x.should == 0
619
-
620
- x = 2
621
- (x **= 3).should == 8
622
- x.should == 8
623
-
624
- x = 4
625
- (x |= 3).should == 7
626
- x.should == 7
627
- (x |= 4).should == 7
628
- x.should == 7
629
-
630
- x = 6
631
- (x &= 3).should == 2
632
- x.should == 2
633
- (x &= 4).should == 0
634
- x.should == 0
635
-
636
- # XOR
637
- x = 2
638
- (x ^= 3).should == 1
639
- x.should == 1
640
- (x ^= 4).should == 5
641
- x.should == 5
642
-
643
- # Bit-shift left
644
- x = 17
645
- (x <<= 3).should == 136
646
- x.should == 136
647
-
648
- # Bit-shift right
649
- x = 5
650
- (x >>= 1).should == 2
651
- x.should == 2
652
- end
653
- end
654
-
655
- describe "Conditional operator assignment 'var op= expr'" do
656
- it "assigns the lhs if its truthiness is false for ||, true for &&" do
657
- x = nil
658
- (x ||= 17).should == 17
659
- x.should == 17
660
- (x ||= 2).should == 17
661
- x.should == 17
662
-
663
- x = false
664
- (x &&= true).should == false
665
- x.should == false
666
- (x &&= false).should == false
667
- x.should == false
668
- x = true
669
- (x &&= true).should == true
670
- x.should == true
671
- (x &&= false).should == false
672
- x.should == false
673
- end
674
-
675
- it "may not assign at all, depending on the truthiness of lhs" do
676
- Object.new.instance_eval do
677
- @falsey = false
678
- @truthy = true
679
- freeze
680
- # lambda{ @truthy ||= 42 }.should_not raise_error
681
- # lambda{ @falsey &&= 42 }.should_not raise_error
682
- end
683
- end
684
-
685
- it "uses short-circuit arg evaluation" do
686
- x = 8
687
- y = VariablesSpecs::OpAsgn.new
688
- (x ||= y.do_side_effect).should == 8
689
- y.side_effect.should == nil
690
-
691
- x = nil
692
- (x &&= y.do_side_effect).should == nil
693
- y.side_effect.should == nil
694
-
695
- y.a = 5
696
- (x ||= y.do_side_effect).should == 5
697
- y.side_effect.should == true
698
- end
699
- end
700
-
701
- describe "Unconditional operator assignment 'obj.meth op= expr'" do
702
- it "is equivalent to 'obj.meth = obj.meth op expr'" do
703
- @x = VariablesSpecs::OpAsgn.new
704
- @x.a = 13
705
- (@x.a += 5).should == 18
706
- @x.a.should == 18
707
-
708
- @x.a = 17
709
- (@x.a -= 11).should == 6
710
- @x.a.should == 6
711
-
712
- @x.a = 2
713
- (@x.a *= 5).should == 10
714
- @x.a.should == 10
715
-
716
- @x.a = 36
717
- (@x.a /= 9).should == 4
718
- @x.a.should == 4
719
-
720
- @x.a = 23
721
- (@x.a %= 5).should == 3
722
- @x.a.should == 3
723
- (@x.a %= 3).should == 0
724
- @x.a.should == 0
725
-
726
- @x.a = 2
727
- (@x.a **= 3).should == 8
728
- @x.a.should == 8
729
-
730
- @x.a = 4
731
- (@x.a |= 3).should == 7
732
- @x.a.should == 7
733
- (@x.a |= 4).should == 7
734
- @x.a.should == 7
735
-
736
- @x.a = 6
737
- (@x.a &= 3).should == 2
738
- @x.a.should == 2
739
- (@x.a &= 4).should == 0
740
- @x.a.should == 0
741
-
742
- # XOR
743
- @x.a = 2
744
- (@x.a ^= 3).should == 1
745
- @x.a.should == 1
746
- (@x.a ^= 4).should == 5
747
- @x.a.should == 5
748
-
749
- @x.a = 17
750
- (@x.a <<= 3).should == 136
751
- @x.a.should == 136
752
-
753
- @x.a = 5
754
- (@x.a >>= 1).should == 2
755
- @x.a.should == 2
756
- end
757
- end
758
-
759
- describe "Conditional operator assignment 'obj.meth op= expr'" do
760
- it "is equivalent to 'obj.meth op obj.meth = expr'" do
761
- @x = VariablesSpecs::OpAsgn.new
762
- @x.a = nil
763
- (@x.a ||= 17).should == 17
764
- @x.a.should == 17
765
- (@x.a ||= 2).should == 17
766
- @x.a.should == 17
767
-
768
- @x.a = false
769
- (@x.a &&= true).should == false
770
- @x.a.should == false
771
- (@x.a &&= false).should == false
772
- @x.a.should == false
773
- @x.a = true
774
- (@x.a &&= true).should == true
775
- @x.a.should == true
776
- (@x.a &&= false).should == false
777
- @x.a.should == false
778
- end
779
-
780
- it "may not assign at all, depending on the truthiness of lhs" do
781
- m = mock("object")
782
- m.should_receive(:foo).and_return(:truthy)
783
- m.should_not_receive(:foo=)
784
- # m.foo ||= 42
785
-
786
- m.should_receive(:bar).and_return(false)
787
- m.should_not_receive(:bar=)
788
- # m.bar &&= 42
789
- end
790
-
791
- it "uses short-circuit arg evaluation" do
792
- x = 8
793
- y = VariablesSpecs::OpAsgn.new
794
- (x ||= y.do_side_effect).should == 8
795
- y.side_effect.should == nil
796
-
797
- x = nil
798
- (x &&= y.do_side_effect).should == nil
799
- y.side_effect.should == nil
800
-
801
- y.a = 5
802
- (x ||= y.do_side_effect).should == 5
803
- y.side_effect.should == true
804
- end
805
- end
806
-
807
- describe "Operator assignment 'obj.meth op= expr'" do
808
- it "evaluates lhs one time" do
809
- x = VariablesSpecs::OpAsgn.new
810
- x.a = 5
811
- (x.do_more_side_effects.a += 5).should == 15
812
- x.a.should == 15
813
-
814
- x.a = 5
815
- (x.do_more_side_effects.a -= 4).should == 6
816
- x.a.should == 6
817
-
818
- x.a = 2
819
- (x.do_more_side_effects.a *= 5).should == 35
820
- x.a.should == 35
821
-
822
- x.a = 31
823
- (x.do_more_side_effects.a /= 9).should == 4
824
- x.a.should == 4
825
-
826
- x.a = 18
827
- (x.do_more_side_effects.a %= 5).should == 3
828
- x.a.should == 3
829
-
830
- x.a = 0
831
- (x.do_more_side_effects.a **= 3).should == 125
832
- x.a.should == 125
833
-
834
- x.a = -1
835
- (x.do_more_side_effects.a |= 3).should == 7
836
- x.a.should == 7
837
-
838
- x.a = 1
839
- (x.do_more_side_effects.a &= 3).should == 2
840
- x.a.should == 2
841
-
842
- # XOR
843
- x.a = -3
844
- (x.do_more_side_effects.a ^= 3).should == 1
845
- x.a.should == 1
846
-
847
- x.a = 12
848
- (x.do_more_side_effects.a <<= 3).should == 136
849
- x.a.should == 136
850
-
851
- x.a = 0
852
- (x.do_more_side_effects.a >>= 1).should == 2
853
- x.a.should == 2
854
-
855
- x.a = nil
856
- x.b = 0
857
- (x.do_bool_side_effects.a ||= 17).should == 17
858
- x.a.should == 17
859
- x.b.should == 1
860
-
861
- x.a = false
862
- x.b = 0
863
- (x.do_bool_side_effects.a &&= true).should == false
864
- x.a.should == false
865
- x.b.should == 1
866
- (x.do_bool_side_effects.a &&= false).should == false
867
- x.a.should == false
868
- x.b.should == 2
869
- x.a = true
870
- x.b = 0
871
- (x.do_bool_side_effects.a &&= true).should == true
872
- x.a.should == true
873
- x.b.should == 1
874
- (x.do_bool_side_effects.a &&= false).should == false
875
- x.a.should == false
876
- x.b.should == 2
877
- end
878
- end
879
-
880
- describe "Unconditional operator assignment 'obj[idx] op= expr'" do
881
- it "is equivalent to 'obj[idx] = obj[idx] op expr'" do
882
- # x = [2,13,7]
883
- # (x[1] += 5).should == 18
884
- # x.should == [2,18,7]
885
-
886
- # x = [17,6]
887
- # (x[0] -= 11).should == 6
888
- # x.should == [6,6]
889
-
890
- # x = [nil,2,28]
891
- # (x[2] *= 2).should == 56
892
- # x.should == [nil,2,56]
893
-
894
- # x = [3,9,36]
895
- # (x[2] /= x[1]).should == 4
896
- # x.should == [3,9,4]
897
-
898
- # x = [23,4]
899
- # (x[0] %= 5).should == 3
900
- # x.should == [3,4]
901
- # (x[0] %= 3).should == 0
902
- # x.should == [0,4]
903
-
904
- # x = [1,2,3]
905
- # (x[1] **= 3).should == 8
906
- # x.should == [1,8,3]
907
-
908
- # x = [4,5,nil]
909
- # (x[0] |= 3).should == 7
910
- # x.should == [7,5,nil]
911
- # (x[0] |= 4).should == 7
912
- # x.should == [7,5,nil]
913
-
914
- # x = [3,6,9]
915
- # (x[1] &= 3).should == 2
916
- # x.should == [3,2,9]
917
- # (x[1] &= 4).should == 0
918
- # x.should == [3,0,9]
919
-
920
- # # XOR
921
- # x = [0,1,2]
922
- # (x[2] ^= 3).should == 1
923
- # x.should == [0,1,1]
924
- # (x[2] ^= 4).should == 5
925
- # x.should == [0,1,5]
926
-
927
- # x = [17]
928
- # (x[0] <<= 3).should == 136
929
- # x.should == [136]
930
-
931
- # x = [nil,5,8]
932
- # (x[1] >>= 1).should == 2
933
- # x.should == [nil,2,8]
934
- end
935
- end
936
-
937
- describe "Conditional operator assignment 'obj[idx] op= expr'" do
938
- it "is equivalent to 'obj[idx] op obj[idx] = expr'" do
939
- # x = [1,nil,12]
940
- # (x[1] ||= 17).should == 17
941
- # x.should == [1,17,12]
942
- # (x[1] ||= 2).should == 17
943
- # x.should == [1,17,12]
944
-
945
- # x = [true, false, false]
946
- # (x[1] &&= true).should == false
947
- # x.should == [true, false, false]
948
- # (x[1] &&= false).should == false
949
- # x.should == [true, false, false]
950
- # (x[0] &&= true).should == true
951
- # x.should == [true, false, false]
952
- # (x[0] &&= false).should == false
953
- # x.should == [false, false, false]
954
- end
955
-
956
- it "may not assign at all, depending on the truthiness of lhs" do
957
- # m = mock("object")
958
- # m.should_receive(:[]).and_return(:truthy)
959
- # m.should_not_receive(:[]=)
960
- # m[:foo] ||= 42
961
-
962
- # m = mock("object")
963
- # m.should_receive(:[]).and_return(false)
964
- # m.should_not_receive(:[]=)
965
- # m[:bar] &&= 42
966
- end
967
-
968
- it "uses short-circuit arg evaluation" do
969
- # x = 8
970
- # y = VariablesSpecs::OpAsgn.new
971
- # (x ||= y.do_side_effect).should == 8
972
- # y.side_effect.should == nil
973
-
974
- # x = nil
975
- # (x &&= y.do_side_effect).should == nil
976
- # y.side_effect.should == nil
977
-
978
- # y.a = 5
979
- # (x ||= y.do_side_effect).should == 5
980
- # y.side_effect.should == true
981
- end
982
- end
983
-
984
- describe "Operator assignment 'obj[idx] op= expr'" do
985
- class ArrayWithDefaultIndex < Array
986
- def [](index=nil)
987
- super(index || 0)
988
- end
989
-
990
- def []=(first_arg, second_arg=nil)
991
- if second_arg
992
- index = fist_arg
993
- value = second_arg
994
- else
995
- index = 0
996
- value = first_arg
997
- end
998
-
999
- super(index, value)
1000
- end
1001
- end
1002
-
1003
- it "handles empty index (idx) arguments" do
1004
- # array = ArrayWithDefaultIndex.new
1005
- # array << 1
1006
- # (array[] += 5).should == 6
1007
- end
1008
-
1009
- it "handles complex index (idx) arguments" do
1010
- # x = [1,2,3,4]
1011
- # (x[0,2] += [5]).should == [1,2,5]
1012
- # x.should == [1,2,5,3,4]
1013
- # (x[0,2] += [3,4]).should == [1,2,3,4]
1014
- # x.should == [1,2,3,4,5,3,4]
1015
-
1016
- # (x[2..3] += [8]).should == [3,4,8]
1017
- # x.should == [1,2,3,4,8,5,3,4]
1018
-
1019
- # y = VariablesSpecs::OpAsgn.new
1020
- # y.a = 1
1021
- # (x[y.do_side_effect] *= 2).should == 4
1022
- # x.should == [1,4,3,4,8,5,3,4]
1023
-
1024
- # h = {'key1' => 23, 'key2' => 'val'}
1025
- # (h['key1'] %= 5).should == 3
1026
- # (h['key2'] += 'ue').should == 'value'
1027
- # h.should == {'key1' => 3, 'key2' => 'value'}
1028
- end
1029
-
1030
- it "handles empty splat index (idx) arguments" do
1031
- # array = ArrayWithDefaultIndex.new
1032
- # array << 5
1033
- # splat_index = []
1034
-
1035
- # (array[*splat_index] += 5).should == 10
1036
- # array.should== [10]
1037
- end
1038
-
1039
- it "handles single splat index (idx) arguments" do
1040
- # array = [1,2,3,4]
1041
- # splat_index = [0]
1042
-
1043
- # (array[*splat_index] += 5).should == 6
1044
- # array.should == [6,2,3,4]
1045
- end
1046
-
1047
- it "handles multiple splat index (idx) arguments" do
1048
- # array = [1,2,3,4]
1049
- # splat_index = [0,2]
1050
-
1051
- # (array[*splat_index] += [5]).should == [1,2,5]
1052
- # array.should == [1,2,5,3,4]
1053
- end
1054
-
1055
- it "handles splat index (idx) arguments with normal arguments" do
1056
- # array = [1,2,3,4]
1057
- # splat_index = [2]
1058
-
1059
- # (array[0, *splat_index] += [5]).should == [1,2,5]
1060
- # array.should == [1,2,5,3,4]
1061
- end
1062
-
1063
- # This example fails on 1.9 because of bug #2050
1064
- it "returns result of rhs not result of []=" do
1065
- # a = VariablesSpecs::Hashalike.new
1066
-
1067
- # (a[123] = 2).should == 2
1068
- # (a[123] += 2).should == 125
1069
- # (a[123] -= 2).should == 121
1070
- # (a[123] *= 2).should == 246
1071
- # # Guard against the Mathn library
1072
- # # TODO: Make these specs not rely on specific behaviour / result values
1073
- # # by using mocks.
1074
- # conflicts_with :Prime do
1075
- # (a[123] /= 2).should == 61
1076
- # end
1077
- # (a[123] %= 2).should == 1
1078
- # (a[123] **= 2).should == 15129
1079
- # (a[123] |= 2).should == 123
1080
- # (a[123] &= 2).should == 2
1081
- # (a[123] ^= 2).should == 121
1082
- # (a[123] <<= 2).should == 492
1083
- # (a[123] >>= 2).should == 30
1084
- # (a[123] ||= 2).should == 123
1085
- # (a[nil] ||= 2).should == 2
1086
- # (a[123] &&= 2).should == 2
1087
- # (a[nil] &&= 2).should == nil
1088
- end
1089
- end
1090
-
1091
- describe "Single assignment" do
1092
- it "Assignment does not modify the lhs, it reassigns its reference" do
1093
- a = 'Foobar'
1094
- b = a
1095
- b = 'Bazquux'
1096
- a.should == 'Foobar'
1097
- b.should == 'Bazquux'
1098
- end
1099
-
1100
- it "Assignment does not copy the object being assigned, just creates a new reference to it" do
1101
- a = []
1102
- b = a
1103
- b << 1
1104
- a.should == [1]
1105
- end
1106
-
1107
- it "If rhs has multiple arguments, lhs becomes an Array of them" do
1108
- a = 1, 2, 3
1109
- a.should == [1, 2, 3]
1110
-
1111
- a = 1, (), 3
1112
- a.should == [1, nil, 3]
1113
- end
1114
- end
1115
-
1116
- describe "Multiple assignment without grouping or splatting" do
1117
- it "An equal number of arguments on lhs and rhs assigns positionally" do
1118
- a, b, c, d = 1, 2, 3, 4
1119
- a.should == 1
1120
- b.should == 2
1121
- c.should == 3
1122
- d.should == 4
1123
- end
1124
-
1125
- it "If rhs has too few arguments, the missing ones on lhs are assigned nil" do
1126
- a, b, c = 1, 2
1127
- a.should == 1
1128
- b.should == 2
1129
- c.should == nil
1130
- end
1131
-
1132
- it "If rhs has too many arguments, the extra ones are silently not assigned anywhere" do
1133
- a, b = 1, 2, 3
1134
- a.should == 1
1135
- b.should == 2
1136
- end
1137
-
1138
- it "The assignments are done in parallel so that lhs and rhs are independent of eachother without copying" do
1139
- o_of_a, o_of_b = mock('a'), mock('b')
1140
- a, b = o_of_a, o_of_b
1141
- a, b = b, a
1142
- a.should equal(o_of_b)
1143
- b.should equal(o_of_a)
1144
- end
1145
- end
1146
-
1147
- describe "Multiple assignments with splats" do
1148
- ruby_version_is ""..."1.9" do
1149
- it "* on the lhs has to be applied to the last parameter" do
1150
- lambda { eval 'a, *b, c = 1, 2, 3' }.should raise_error(SyntaxError)
1151
- end
1152
- end
1153
-
1154
- it "* on the lhs collects all parameters from its position onwards as an Array or an empty Array" do
1155
- a, *b = 1, 2
1156
- c, *d = 1
1157
- e, *f = 1, 2, 3
1158
- g, *h = 1, [2, 3]
1159
- *i = 1, [2,3]
1160
- *k = 1,2,3
1161
-
1162
- a.should == 1
1163
- b.should == [2]
1164
- c.should == 1
1165
- d.should == []
1166
- e.should == 1
1167
- f.should == [2, 3]
1168
- g.should == 1
1169
- h.should == [[2, 3]]
1170
- i.should == [1, [2, 3]]
1171
- k.should == [1,2,3]
1172
- end
1173
-
1174
- ruby_version_is ""..."1.9" do
1175
- it "* on the LHS returns the Array on the RHS enclosed in an Array" do
1176
- *j = [1,2,3]
1177
- j.should == [[1,2,3]]
1178
- end
1179
- end
1180
-
1181
- ruby_version_is "1.9" do
1182
- it "* on the LHS returns the Array on the RHS without enclosing it in an Array" do
1183
- *j = [1,2,3]
1184
- j.should == [1,2,3]
1185
- end
1186
- end
1187
- end
1188
-
1189
- describe "Multiple assignments with grouping" do
1190
- it "A group on the lhs is considered one position and treats its corresponding rhs position like an Array" do
1191
- # a, (b, c), d = 1, 2, 3, 4
1192
- # e, (f, g), h = 1, [2, 3, 4], 5
1193
- # i, (j, k), l = 1, 2, 3
1194
- a.should == 1
1195
- b.should == 2
1196
- c.should == nil
1197
- d.should == 3
1198
- e.should == 1
1199
- f.should == 2
1200
- g.should == 3
1201
- h.should == 5
1202
- i.should == 1
1203
- j.should == 2
1204
- k.should == nil
1205
- l.should == 3
1206
- end
1207
-
1208
- it "supports multiple levels of nested groupings" do
1209
- # a,(b,(c,d)) = 1,[2,[3,4]]
1210
- a.should == 1
1211
- b.should == 2
1212
- c.should == 3
1213
- d.should == 4
1214
-
1215
- # a,(b,(c,d)) = [1,[2,[3,4]]]
1216
- a.should == 1
1217
- b.should == 2
1218
- c.should == 3
1219
- d.should == 4
1220
-
1221
- x = [1,[2,[3,4]]]
1222
- # a,(b,(c,d)) = x
1223
- a.should == 1
1224
- b.should == 2
1225
- c.should == 3
1226
- d.should == 4
1227
- end
1228
-
1229
- it "rhs cannot use parameter grouping, it is a syntax error" do
1230
- lambda { eval '(a, b) = (1, 2)' }.should raise_error(SyntaxError)
1231
- end
1232
- end
1233
-
1234
- # TODO: merge the following two describe blocks and partition the specs
1235
- # into distinct cases.
1236
- describe "Multiple assignment" do
1237
- not_compliant_on :rubinius do
1238
- it "has the proper return value" do
1239
- # (a,b,*c = *[5,6,7,8,9,10]).should == [5,6,7,8,9,10]
1240
- # (d,e = VariablesSpecs.reverse_foo(4,3)).should == [3,4]
1241
- # (f,g,h = VariablesSpecs.reverse_foo(6,7)).should == [7,6]
1242
- # (i,*j = *[5,6,7]).should == [5,6,7]
1243
- # (k,*l = [5,6,7]).should == [5,6,7]
1244
- a.should == 5
1245
- b.should == 6
1246
- c.should == [7,8,9,10]
1247
- d.should == 3
1248
- e.should == 4
1249
- f.should == 7
1250
- g.should == 6
1251
- h.should == nil
1252
- i.should == 5
1253
- j.should == [6,7]
1254
- k.should == 5
1255
- l.should == [6,7]
1256
- end
1257
- end
1258
-
1259
- # TODO: write Rubinius versions
1260
- end
1261
-
1262
- # For now, masgn is deliberately non-compliant with MRI wrt the return val from an masgn.
1263
- # Rubinius returns true as the result of the assignment, but MRI returns an array
1264
- # containing all the elements on the rhs. As this result is never used, the cost
1265
- # of creating and then discarding this array is avoided
1266
- describe "Multiple assignment, array-style" do
1267
- not_compliant_on :rubinius do
1268
- it "returns an array of all rhs values" do
1269
- (a,b = 5,6,7).should == [5,6,7]
1270
- a.should == 5
1271
- b.should == 6
1272
-
1273
- (c,d,*e = 99,8).should == [99,8]
1274
- c.should == 99
1275
- d.should == 8
1276
- e.should == []
1277
-
1278
- (f,g,h = 99,8).should == [99,8]
1279
- f.should == 99
1280
- g.should == 8
1281
- h.should == nil
1282
- end
1283
- end
1284
-
1285
- deviates_on :rubinius do
1286
- it "returns true" do
1287
- (a,b = 5,6,7).should == true
1288
- a.should == 5
1289
- b.should == 6
1290
-
1291
- (c,d,*e = 99,8).should == true
1292
- c.should == 99
1293
- d.should == 8
1294
- e.should == []
1295
-
1296
- (f,g,h = 99,8).should == true
1297
- f.should == 99
1298
- g.should == 8
1299
- h.should == nil
1300
- end
1301
- end
1302
- end
1303
-
1304
- describe "Scope of variables" do
1305
- it "instance variables not overwritten by local variable in each block" do
1306
-
1307
- class ScopeVariables
1308
- attr_accessor :v
1309
-
1310
- def initialize
1311
- @v = ['a', 'b', 'c']
1312
- end
1313
-
1314
- def check_access
1315
- v.should == ['a', 'b', 'c']
1316
- self.v.should == ['a', 'b', 'c']
1317
- end
1318
-
1319
- def check_local_variable
1320
- v = nil
1321
- self.v.should == ['a', 'b', 'c']
1322
- end
1323
-
1324
- def check_each_block
1325
- self.v.each { |v|
1326
- # Don't actually do anything
1327
- }
1328
- self.v.should == ['a', 'b', 'c']
1329
- v.should == ['a', 'b', 'c']
1330
- self.v.object_id.should == v.object_id
1331
- end
1332
- end # Class ScopeVariables
1333
-
1334
- instance = ScopeVariables.new()
1335
- instance.check_access
1336
- instance.check_local_variable
1337
- instance.check_each_block
1338
- end
1339
- end
1340
-
1341
- describe "A local variable in a #define_method scope" do
1342
- ruby_bug '#1322', '1.8.7.228' do
1343
- it "shares the lexical scope containing the call to #define_method" do
1344
- # We need a new scope to reproduce this bug.
1345
- handle = mock("handle for containing scope method")
1346
-
1347
- def handle.produce_bug
1348
- local = 1
1349
-
1350
- klass = Class.new
1351
- klass.send :define_method, :set_local do |arg|
1352
- lambda { local = 2 }.call
1353
- end
1354
-
1355
- # We must call with at least one argument to reproduce the bug.
1356
- klass.new.set_local(nil)
1357
-
1358
- local
1359
- end
1360
-
1361
- handle.produce_bug.should == 2
1362
- end
1363
- end
1364
- end
1365
-
1366
- language_version __FILE__, "variables"