opal-cj 0.7.0.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (470) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.gitmodules +27 -0
  4. data/.rspec +3 -0
  5. data/.spectator +2 -0
  6. data/.spectator-mspec +3 -0
  7. data/.travis.yml +45 -0
  8. data/CHANGELOG.md +406 -0
  9. data/CONTRIBUTING.md +41 -0
  10. data/Gemfile +27 -0
  11. data/Guardfile +77 -0
  12. data/LICENSE +19 -0
  13. data/README.md +178 -0
  14. data/Rakefile +116 -0
  15. data/benchmarks/operators.rb +11 -0
  16. data/bin/opal +22 -0
  17. data/bin/opal-build +77 -0
  18. data/bin/opal-mspec +10 -0
  19. data/bin/opal-repl +72 -0
  20. data/config.ru +14 -0
  21. data/examples/rack/Gemfile +3 -0
  22. data/examples/rack/app/application.rb +13 -0
  23. data/examples/rack/app/user.rb +21 -0
  24. data/examples/rack/config.ru +7 -0
  25. data/examples/rack/index.html.erb +10 -0
  26. data/examples/sinatra/Gemfile +4 -0
  27. data/examples/sinatra/app/application.rb +7 -0
  28. data/examples/sinatra/config.ru +28 -0
  29. data/lib/mspec/opal/main.rb.erb +9 -0
  30. data/lib/mspec/opal/rake_task.rb +278 -0
  31. data/lib/mspec/opal/runner.rb +206 -0
  32. data/lib/mspec/opal/sprockets.js +57 -0
  33. data/lib/opal.rb +11 -0
  34. data/lib/opal/builder.rb +135 -0
  35. data/lib/opal/builder_processors.rb +165 -0
  36. data/lib/opal/cli.rb +145 -0
  37. data/lib/opal/cli_options.rb +149 -0
  38. data/lib/opal/cli_runners.rb +10 -0
  39. data/lib/opal/cli_runners/nodejs.rb +56 -0
  40. data/lib/opal/cli_runners/phantom.js +35 -0
  41. data/lib/opal/cli_runners/phantomjs.rb +28 -0
  42. data/lib/opal/cli_runners/server.rb +54 -0
  43. data/lib/opal/compiler.rb +307 -0
  44. data/lib/opal/erb.rb +64 -0
  45. data/lib/opal/fragment.rb +41 -0
  46. data/lib/opal/hike_path_finder.rb +18 -0
  47. data/lib/opal/nodes.rb +26 -0
  48. data/lib/opal/nodes/arglist.rb +56 -0
  49. data/lib/opal/nodes/array.rb +54 -0
  50. data/lib/opal/nodes/base.rb +151 -0
  51. data/lib/opal/nodes/call.rb +283 -0
  52. data/lib/opal/nodes/call_special.rb +178 -0
  53. data/lib/opal/nodes/case.rb +96 -0
  54. data/lib/opal/nodes/class.rb +42 -0
  55. data/lib/opal/nodes/constants.rb +78 -0
  56. data/lib/opal/nodes/def.rb +157 -0
  57. data/lib/opal/nodes/defined.rb +113 -0
  58. data/lib/opal/nodes/definitions.rb +168 -0
  59. data/lib/opal/nodes/for.rb +35 -0
  60. data/lib/opal/nodes/hash.rb +67 -0
  61. data/lib/opal/nodes/helpers.rb +114 -0
  62. data/lib/opal/nodes/if.rb +67 -0
  63. data/lib/opal/nodes/iter.rb +131 -0
  64. data/lib/opal/nodes/literal.rb +230 -0
  65. data/lib/opal/nodes/logic.rb +217 -0
  66. data/lib/opal/nodes/masgn.rb +62 -0
  67. data/lib/opal/nodes/module.rb +46 -0
  68. data/lib/opal/nodes/rescue.rb +135 -0
  69. data/lib/opal/nodes/runtime_helpers.rb +45 -0
  70. data/lib/opal/nodes/scope.rb +293 -0
  71. data/lib/opal/nodes/singleton_class.rb +25 -0
  72. data/lib/opal/nodes/super.rb +97 -0
  73. data/lib/opal/nodes/top.rb +101 -0
  74. data/lib/opal/nodes/variables.rb +158 -0
  75. data/lib/opal/nodes/while.rb +65 -0
  76. data/lib/opal/nodes/yield.rb +95 -0
  77. data/lib/opal/parser.rb +658 -0
  78. data/lib/opal/parser/grammar.rb +5452 -0
  79. data/lib/opal/parser/grammar.y +1684 -0
  80. data/lib/opal/parser/keywords.rb +66 -0
  81. data/lib/opal/parser/lexer.rb +1208 -0
  82. data/lib/opal/parser/parser_scope.rb +25 -0
  83. data/lib/opal/parser/sexp.rb +75 -0
  84. data/lib/opal/path_reader.rb +28 -0
  85. data/lib/opal/paths.rb +38 -0
  86. data/lib/opal/source_map.rb +70 -0
  87. data/lib/opal/sprockets.rb +4 -0
  88. data/lib/opal/sprockets/cache_key_fix.rb +17 -0
  89. data/lib/opal/sprockets/environment.rb +37 -0
  90. data/lib/opal/sprockets/erb.rb +37 -0
  91. data/lib/opal/sprockets/path_reader.rb +34 -0
  92. data/lib/opal/sprockets/processor.rb +124 -0
  93. data/lib/opal/sprockets/server.rb +180 -0
  94. data/lib/opal/util.rb +64 -0
  95. data/lib/opal/version.rb +3 -0
  96. data/opal.gemspec +36 -0
  97. data/opal/README.md +6 -0
  98. data/opal/corelib/array.rb +1556 -0
  99. data/opal/corelib/array/inheritance.rb +113 -0
  100. data/opal/corelib/basic_object.rb +73 -0
  101. data/opal/corelib/boolean.rb +41 -0
  102. data/opal/corelib/class.rb +55 -0
  103. data/opal/corelib/comparable.rb +56 -0
  104. data/opal/corelib/complex.rb +3 -0
  105. data/opal/corelib/dir.rb +20 -0
  106. data/opal/corelib/enumerable.rb +1132 -0
  107. data/opal/corelib/enumerator.rb +422 -0
  108. data/opal/corelib/error.rb +63 -0
  109. data/opal/corelib/file.rb +56 -0
  110. data/opal/corelib/hash.rb +728 -0
  111. data/opal/corelib/helpers.rb +102 -0
  112. data/opal/corelib/io.rb +59 -0
  113. data/opal/corelib/kernel.rb +569 -0
  114. data/opal/corelib/main.rb +7 -0
  115. data/opal/corelib/match_data.rb +114 -0
  116. data/opal/corelib/method.rb +58 -0
  117. data/opal/corelib/module.rb +462 -0
  118. data/opal/corelib/nil_class.rb +62 -0
  119. data/opal/corelib/numeric.rb +532 -0
  120. data/opal/corelib/proc.rb +52 -0
  121. data/opal/corelib/range.rb +116 -0
  122. data/opal/corelib/rational.rb +3 -0
  123. data/opal/corelib/regexp.rb +133 -0
  124. data/opal/corelib/runtime.js +1240 -0
  125. data/opal/corelib/string.rb +1212 -0
  126. data/opal/corelib/string/inheritance.rb +78 -0
  127. data/opal/corelib/struct.rb +141 -0
  128. data/opal/corelib/time.rb +584 -0
  129. data/opal/corelib/variables.rb +24 -0
  130. data/opal/opal.rb +32 -0
  131. data/package.json +9 -0
  132. data/spec/filters/bugs/array.rb +232 -0
  133. data/spec/filters/bugs/basic_object.rb +14 -0
  134. data/spec/filters/bugs/class.rb +21 -0
  135. data/spec/filters/bugs/enumerable.rb +69 -0
  136. data/spec/filters/bugs/enumerator.rb +3 -0
  137. data/spec/filters/bugs/hash.rb +128 -0
  138. data/spec/filters/bugs/kernel.rb +10 -0
  139. data/spec/filters/bugs/language.rb +415 -0
  140. data/spec/filters/bugs/math.rb +95 -0
  141. data/spec/filters/bugs/module.rb +14 -0
  142. data/spec/filters/bugs/nil.rb +7 -0
  143. data/spec/filters/bugs/numeric.rb +20 -0
  144. data/spec/filters/bugs/opal.rb +14 -0
  145. data/spec/filters/bugs/regexp.rb +11 -0
  146. data/spec/filters/bugs/set.rb +7 -0
  147. data/spec/filters/bugs/singleton.rb +6 -0
  148. data/spec/filters/bugs/string.rb +360 -0
  149. data/spec/filters/bugs/stringscanner.rb +22 -0
  150. data/spec/filters/bugs/struct.rb +45 -0
  151. data/spec/filters/bugs/time.rb +177 -0
  152. data/spec/filters/bugs/unknown.rb +11 -0
  153. data/spec/filters/unsupported/encoding.rb +95 -0
  154. data/spec/filters/unsupported/enumerator.rb +14 -0
  155. data/spec/filters/unsupported/float.rb +5 -0
  156. data/spec/filters/unsupported/frozen.rb +90 -0
  157. data/spec/filters/unsupported/hash_compare_by_identity.rb +16 -0
  158. data/spec/filters/unsupported/integer_size.rb +7 -0
  159. data/spec/filters/unsupported/method_added.rb +10 -0
  160. data/spec/filters/unsupported/mutable_strings.rb +361 -0
  161. data/spec/filters/unsupported/private_constants.rb +30 -0
  162. data/spec/filters/unsupported/private_methods.rb +44 -0
  163. data/spec/filters/unsupported/random.rb +4 -0
  164. data/spec/filters/unsupported/ruby_exe.rb +5 -0
  165. data/spec/filters/unsupported/tainted.rb +155 -0
  166. data/spec/filters/unsupported/time.rb +21 -0
  167. data/spec/filters/unsupported/trusted.rb +80 -0
  168. data/spec/lib/builder_processors_spec.rb +27 -0
  169. data/spec/lib/builder_spec.rb +66 -0
  170. data/spec/lib/cli_spec.rb +134 -0
  171. data/spec/lib/compiler_spec.rb +197 -0
  172. data/spec/lib/dependency_resolver_spec.rb +40 -0
  173. data/spec/lib/fixtures/no_requires.rb +1 -0
  174. data/spec/lib/fixtures/opal_file.rb +2 -0
  175. data/spec/lib/fixtures/require_tree_test.rb +3 -0
  176. data/spec/lib/fixtures/required_tree_test/required_file1.rb +1 -0
  177. data/spec/lib/fixtures/required_tree_test/required_file2.rb +1 -0
  178. data/spec/lib/fixtures/requires.rb +7 -0
  179. data/spec/lib/fixtures/sprockets_file.js.rb +3 -0
  180. data/spec/lib/fixtures/sprockets_require_tree_test.rb +3 -0
  181. data/spec/lib/hike_path_finder_spec.rb +23 -0
  182. data/spec/lib/lexer_spec.rb +110 -0
  183. data/spec/lib/parser/alias_spec.rb +26 -0
  184. data/spec/lib/parser/and_spec.rb +13 -0
  185. data/spec/lib/parser/attrasgn_spec.rb +28 -0
  186. data/spec/lib/parser/begin_spec.rb +42 -0
  187. data/spec/lib/parser/block_spec.rb +12 -0
  188. data/spec/lib/parser/break_spec.rb +17 -0
  189. data/spec/lib/parser/call_spec.rb +139 -0
  190. data/spec/lib/parser/class_spec.rb +35 -0
  191. data/spec/lib/parser/comments_spec.rb +11 -0
  192. data/spec/lib/parser/def_spec.rb +61 -0
  193. data/spec/lib/parser/if_spec.rb +26 -0
  194. data/spec/lib/parser/iter_spec.rb +59 -0
  195. data/spec/lib/parser/lambda_spec.rb +64 -0
  196. data/spec/lib/parser/literal_spec.rb +118 -0
  197. data/spec/lib/parser/masgn_spec.rb +37 -0
  198. data/spec/lib/parser/module_spec.rb +27 -0
  199. data/spec/lib/parser/not_spec.rb +27 -0
  200. data/spec/lib/parser/op_asgn1_spec.rb +23 -0
  201. data/spec/lib/parser/op_asgn2_spec.rb +23 -0
  202. data/spec/lib/parser/or_spec.rb +13 -0
  203. data/spec/lib/parser/return_spec.rb +17 -0
  204. data/spec/lib/parser/sclass_spec.rb +21 -0
  205. data/spec/lib/parser/string_spec.rb +276 -0
  206. data/spec/lib/parser/super_spec.rb +20 -0
  207. data/spec/lib/parser/unary_spec.rb +48 -0
  208. data/spec/lib/parser/undef_spec.rb +15 -0
  209. data/spec/lib/parser/unless_spec.rb +13 -0
  210. data/spec/lib/parser/variables_spec.rb +92 -0
  211. data/spec/lib/parser/while_spec.rb +15 -0
  212. data/spec/lib/parser/yield_spec.rb +20 -0
  213. data/spec/lib/path_reader_spec.rb +24 -0
  214. data/spec/lib/shared/path_finder_shared.rb +19 -0
  215. data/spec/lib/shared/path_reader_shared.rb +31 -0
  216. data/spec/lib/spec_helper.rb +9 -0
  217. data/spec/lib/sprockets/environment_spec.rb +30 -0
  218. data/spec/lib/sprockets/erb_spec.rb +25 -0
  219. data/spec/lib/sprockets/path_reader_spec.rb +25 -0
  220. data/spec/lib/sprockets/processor_spec.rb +35 -0
  221. data/spec/lib/sprockets/server_spec.rb +20 -0
  222. data/spec/opal/compiler/irb_spec.rb +44 -0
  223. data/spec/opal/core/array/select_spec.rb +14 -0
  224. data/spec/opal/core/array/set_range_to_array_spec.rb +7 -0
  225. data/spec/opal/core/date_spec.rb +122 -0
  226. data/spec/opal/core/enumerable/all_break_spec.rb +5 -0
  227. data/spec/opal/core/enumerable/any_break_spec.rb +5 -0
  228. data/spec/opal/core/enumerable/collect_break_spec.rb +13 -0
  229. data/spec/opal/core/enumerable/count_break_spec.rb +5 -0
  230. data/spec/opal/core/enumerable/detect_break_spec.rb +5 -0
  231. data/spec/opal/core/enumerable/drop_while_break_spec.rb +5 -0
  232. data/spec/opal/core/enumerable/each_slice_break.rb +6 -0
  233. data/spec/opal/core/enumerable/each_with_index_break_spec.rb +5 -0
  234. data/spec/opal/core/enumerable/each_with_object_break_spec.rb +5 -0
  235. data/spec/opal/core/enumerable/find_all_break_spec.rb +5 -0
  236. data/spec/opal/core/enumerable/find_index_break_spec.rb +5 -0
  237. data/spec/opal/core/enumerable/grep_break_spec.rb +5 -0
  238. data/spec/opal/core/enumerable/max_break_spec.rb +5 -0
  239. data/spec/opal/core/enumerable/max_by_break_spec.rb +5 -0
  240. data/spec/opal/core/enumerable/min_break_spec.rb +5 -0
  241. data/spec/opal/core/enumerable/min_by_break_spec.rb +5 -0
  242. data/spec/opal/core/enumerable/none_break_spec.rb +5 -0
  243. data/spec/opal/core/enumerable/one_break_spec.rb +5 -0
  244. data/spec/opal/core/enumerable/reduce_break_spec.rb +5 -0
  245. data/spec/opal/core/enumerable/take_while_break_spec.rb +5 -0
  246. data/spec/opal/core/fixtures/class.rb +124 -0
  247. data/spec/opal/core/fixtures/class_variables.rb +0 -0
  248. data/spec/opal/core/fixtures/constants.rb +33 -0
  249. data/spec/opal/core/fixtures/require_tree_files/file 1.rb +1 -0
  250. data/spec/opal/core/fixtures/require_tree_files/file 2.rb +1 -0
  251. data/spec/opal/core/fixtures/require_tree_files/file 3.rb +1 -0
  252. data/spec/opal/core/fixtures/require_tree_files/file 4.rb +1 -0
  253. data/spec/opal/core/fixtures/require_tree_files/file 5.rb +1 -0
  254. data/spec/opal/core/kernel/Array_spec.rb +10 -0
  255. data/spec/opal/core/kernel/block_given_spec.rb +30 -0
  256. data/spec/opal/core/kernel/class_spec.rb +6 -0
  257. data/spec/opal/core/kernel/define_singleton_method_spec.rb +21 -0
  258. data/spec/opal/core/kernel/equal_value_spec.rb +12 -0
  259. data/spec/opal/core/kernel/extend_spec.rb +21 -0
  260. data/spec/opal/core/kernel/format_spec.rb +122 -0
  261. data/spec/opal/core/kernel/freeze_spec.rb +15 -0
  262. data/spec/opal/core/kernel/instance_eval_spec.rb +28 -0
  263. data/spec/opal/core/kernel/instance_variable_defined_spec.rb +15 -0
  264. data/spec/opal/core/kernel/instance_variable_get_spec.rb +14 -0
  265. data/spec/opal/core/kernel/instance_variable_set_spec.rb +10 -0
  266. data/spec/opal/core/kernel/loop_spec.rb +23 -0
  267. data/spec/opal/core/kernel/match_spec.rb +5 -0
  268. data/spec/opal/core/kernel/method_spec.rb +31 -0
  269. data/spec/opal/core/kernel/methods_spec.rb +25 -0
  270. data/spec/opal/core/kernel/nil_spec.rb +7 -0
  271. data/spec/opal/core/kernel/p_spec.rb +15 -0
  272. data/spec/opal/core/kernel/printf_spec.rb +11 -0
  273. data/spec/opal/core/kernel/proc_spec.rb +13 -0
  274. data/spec/opal/core/kernel/rand_spec.rb +23 -0
  275. data/spec/opal/core/kernel/require_tree_spec.rb +7 -0
  276. data/spec/opal/core/kernel/respond_to_spec.rb +41 -0
  277. data/spec/opal/core/kernel/send_spec.rb +56 -0
  278. data/spec/opal/core/kernel/sprintf_spec.rb +5 -0
  279. data/spec/opal/core/language/block_spec.rb +538 -0
  280. data/spec/opal/core/language/fixtures/array.rb +11 -0
  281. data/spec/opal/core/language/fixtures/block.rb +57 -0
  282. data/spec/opal/core/language/fixtures/break.rb +240 -0
  283. data/spec/opal/core/language/fixtures/ensure.rb +72 -0
  284. data/spec/opal/core/language/fixtures/literal_lambda.rb +7 -0
  285. data/spec/opal/core/language/fixtures/metaclass.rb +33 -0
  286. data/spec/opal/core/language/fixtures/module.rb +24 -0
  287. data/spec/opal/core/language/fixtures/next.rb +128 -0
  288. data/spec/opal/core/language/fixtures/return.rb +118 -0
  289. data/spec/opal/core/language/fixtures/send.rb +110 -0
  290. data/spec/opal/core/language/fixtures/send_1.9.rb +22 -0
  291. data/spec/opal/core/language/fixtures/super.rb +308 -0
  292. data/spec/opal/core/language/fixtures/variables.rb +58 -0
  293. data/spec/opal/core/language/fixtures/yield.rb +28 -0
  294. data/spec/opal/core/language/predefined_spec.rb +85 -0
  295. data/spec/opal/core/language/proc_spec.rb +263 -0
  296. data/spec/opal/core/language/regexp_spec.rb +20 -0
  297. data/spec/opal/core/language/send_spec.rb +225 -0
  298. data/spec/opal/core/language/string_spec.rb +44 -0
  299. data/spec/opal/core/language/symbol_spec.rb +40 -0
  300. data/spec/opal/core/language/variables_spec.rb +1366 -0
  301. data/spec/opal/core/language/versions/array_1.9.rb +39 -0
  302. data/spec/opal/core/language/versions/block_1.9.rb +0 -0
  303. data/spec/opal/core/language/versions/break_1.9.rb +0 -0
  304. data/spec/opal/core/language/versions/case_1.9.rb +20 -0
  305. data/spec/opal/core/language/versions/hash_1.9.rb +18 -0
  306. data/spec/opal/core/language/versions/literal_lambda_1.9.rb +143 -0
  307. data/spec/opal/core/language/versions/not_1.9.rb +22 -0
  308. data/spec/opal/core/language/versions/send_1.9.rb +241 -0
  309. data/spec/opal/core/language/versions/symbol_1.9.rb +15 -0
  310. data/spec/opal/core/language/versions/variables_1.9.rb +8 -0
  311. data/spec/opal/core/module/alias_method_spec.rb +28 -0
  312. data/spec/opal/core/module/ancestors_spec.rb +11 -0
  313. data/spec/opal/core/module/append_features_spec.rb +14 -0
  314. data/spec/opal/core/module/attr_accessor_spec.rb +26 -0
  315. data/spec/opal/core/module/const_defined_spec.rb +85 -0
  316. data/spec/opal/core/module/const_get_spec.rb +85 -0
  317. data/spec/opal/core/module/const_missing_spec.rb +17 -0
  318. data/spec/opal/core/module/const_set_spec.rb +64 -0
  319. data/spec/opal/core/module/constants_spec.rb +49 -0
  320. data/spec/opal/core/module/fixtures/classes.rb +434 -0
  321. data/spec/opal/core/module/method_defined_spec.rb +48 -0
  322. data/spec/opal/core/module/module_function_spec.rb +25 -0
  323. data/spec/opal/core/module/name_spec.rb +52 -0
  324. data/spec/opal/core/module/public_method_defined_spec.rb +18 -0
  325. data/spec/opal/core/module/remove_const_spec.rb +22 -0
  326. data/spec/opal/core/module/undef_method_spec.rb +66 -0
  327. data/spec/opal/core/numeric/bit_and_spec.rb +7 -0
  328. data/spec/opal/core/numeric/bit_or_spec.rb +8 -0
  329. data/spec/opal/core/numeric/bit_xor_spec.rb +6 -0
  330. data/spec/opal/core/numeric/ceil_spec.rb +8 -0
  331. data/spec/opal/core/numeric/chr_spec.rb +8 -0
  332. data/spec/opal/core/numeric/comparison_spec.rb +24 -0
  333. data/spec/opal/core/numeric/complement_spec.rb +8 -0
  334. data/spec/opal/core/numeric/divide_spec.rb +10 -0
  335. data/spec/opal/core/numeric/eql_spec.rb +9 -0
  336. data/spec/opal/core/numeric/exponent_spec.rb +33 -0
  337. data/spec/opal/core/numeric/floor_spec.rb +8 -0
  338. data/spec/opal/core/numeric/gt_spec.rb +11 -0
  339. data/spec/opal/core/numeric/gte_spec.rb +12 -0
  340. data/spec/opal/core/numeric/integer_spec.rb +9 -0
  341. data/spec/opal/core/numeric/left_shift_spec.rb +21 -0
  342. data/spec/opal/core/numeric/lt_spec.rb +11 -0
  343. data/spec/opal/core/numeric/lte_spec.rb +12 -0
  344. data/spec/opal/core/numeric/minus_spec.rb +8 -0
  345. data/spec/opal/core/numeric/modulo_spec.rb +19 -0
  346. data/spec/opal/core/numeric/multiply_spec.rb +9 -0
  347. data/spec/opal/core/numeric/next_spec.rb +9 -0
  348. data/spec/opal/core/numeric/ord_spec.rb +9 -0
  349. data/spec/opal/core/numeric/plus_spec.rb +8 -0
  350. data/spec/opal/core/numeric/pred_spec.rb +7 -0
  351. data/spec/opal/core/numeric/right_shift_spec.rb +25 -0
  352. data/spec/opal/core/numeric/step_spec.rb +11 -0
  353. data/spec/opal/core/numeric/succ_spec.rb +9 -0
  354. data/spec/opal/core/numeric/times_spec.rb +36 -0
  355. data/spec/opal/core/numeric/to_f_spec.rb +7 -0
  356. data/spec/opal/core/numeric/to_i_spec.rb +7 -0
  357. data/spec/opal/core/numeric/to_json_spec.rb +8 -0
  358. data/spec/opal/core/numeric/to_s_spec.rb +26 -0
  359. data/spec/opal/core/numeric/uminus_spec.rb +9 -0
  360. data/spec/opal/core/numeric/upto_spec.rb +19 -0
  361. data/spec/opal/core/numeric/zero_spec.rb +7 -0
  362. data/spec/opal/core/proc/call_spec.rb +21 -0
  363. data/spec/opal/core/proc/element_reference_spec.rb +21 -0
  364. data/spec/opal/core/proc/proc_tricks_spec.rb +7 -0
  365. data/spec/opal/core/runtime/begin_spec.rb +39 -0
  366. data/spec/opal/core/runtime/block_send_spec.rb +28 -0
  367. data/spec/opal/core/runtime/block_spec.rb +23 -0
  368. data/spec/opal/core/runtime/bridged_classes_spec.rb +64 -0
  369. data/spec/opal/core/runtime/constants_spec.rb +13 -0
  370. data/spec/opal/core/runtime/eval_spec.rb +5 -0
  371. data/spec/opal/core/runtime/main_methods_spec.rb +27 -0
  372. data/spec/opal/core/runtime/method_missing_spec.rb +62 -0
  373. data/spec/opal/core/runtime/method_spec.rb +31 -0
  374. data/spec/opal/core/runtime/operator_call_spec.rb +13 -0
  375. data/spec/opal/core/runtime/paren_spec.rb +14 -0
  376. data/spec/opal/core/runtime/rescue_spec.rb +38 -0
  377. data/spec/opal/core/runtime/return_spec.rb +38 -0
  378. data/spec/opal/core/runtime/send_spec.rb +34 -0
  379. data/spec/opal/core/runtime/singleton_class_spec.rb +13 -0
  380. data/spec/opal/core/runtime/super_spec.rb +212 -0
  381. data/spec/opal/core/runtime/truthy_spec.rb +23 -0
  382. data/spec/opal/core/runtime/variables_spec.rb +20 -0
  383. data/spec/opal/core/source_map_spec.rb +15 -0
  384. data/spec/opal/core/string_spec.rb +11 -0
  385. data/spec/opal/stdlib/erb/erb_spec.rb +30 -0
  386. data/spec/opal/stdlib/erb/inline_block.opalerb +3 -0
  387. data/spec/opal/stdlib/erb/quoted.opalerb +1 -0
  388. data/spec/opal/stdlib/erb/simple.opalerb +1 -0
  389. data/spec/opal/stdlib/json/ext_spec.rb +48 -0
  390. data/spec/opal/stdlib/json/parse_spec.rb +33 -0
  391. data/spec/opal/stdlib/native/alias_native_spec.rb +27 -0
  392. data/spec/opal/stdlib/native/each_spec.rb +13 -0
  393. data/spec/opal/stdlib/native/element_reference_spec.rb +16 -0
  394. data/spec/opal/stdlib/native/exposure_spec.rb +33 -0
  395. data/spec/opal/stdlib/native/ext_spec.rb +19 -0
  396. data/spec/opal/stdlib/native/initialize_spec.rb +17 -0
  397. data/spec/opal/stdlib/native/method_missing_spec.rb +51 -0
  398. data/spec/opal/stdlib/native/native_reader_spec.rb +22 -0
  399. data/spec/opal/stdlib/native/native_writer_spec.rb +30 -0
  400. data/spec/opal/stdlib/native/new_spec.rb +8 -0
  401. data/spec/opal/stdlib/promise/error_spec.rb +15 -0
  402. data/spec/opal/stdlib/promise/rescue_spec.rb +35 -0
  403. data/spec/opal/stdlib/promise/then_spec.rb +54 -0
  404. data/spec/opal/stdlib/promise/trace_spec.rb +35 -0
  405. data/spec/opal/stdlib/promise/value_spec.rb +15 -0
  406. data/spec/opal/stdlib/promise/when_spec.rb +34 -0
  407. data/spec/opal/stdlib/template/paths_spec.rb +10 -0
  408. data/spec/opal/stdlib/thread/mutex_spec.rb +40 -0
  409. data/spec/opal/stdlib/thread/thread_queue_spec.rb +32 -0
  410. data/spec/opal/stdlib/thread/thread_spec.rb +60 -0
  411. data/spec/rubyspecs +329 -0
  412. data/spec/spec_helper.rb +42 -0
  413. data/spec/support/mspec_rspec_adapter.rb +33 -0
  414. data/spec/support/parser_helpers.rb +37 -0
  415. data/stdlib/README.md +3 -0
  416. data/stdlib/base64.rb +152 -0
  417. data/stdlib/benchmark.rb +10 -0
  418. data/stdlib/buffer.rb +40 -0
  419. data/stdlib/buffer/array.rb +66 -0
  420. data/stdlib/buffer/view.rb +70 -0
  421. data/stdlib/date.rb +170 -0
  422. data/stdlib/delegate.rb +29 -0
  423. data/stdlib/dir.rb +1 -0
  424. data/stdlib/encoding.rb +166 -0
  425. data/stdlib/enumerator.rb +1 -0
  426. data/stdlib/erb.rb +16 -0
  427. data/stdlib/file.rb +1 -0
  428. data/stdlib/forwardable.rb +71 -0
  429. data/stdlib/json.rb +182 -0
  430. data/stdlib/math.rb +370 -0
  431. data/stdlib/native.rb +530 -0
  432. data/stdlib/nodejs.rb +5 -0
  433. data/stdlib/nodejs/dir.rb +13 -0
  434. data/stdlib/nodejs/file.rb +98 -0
  435. data/stdlib/nodejs/fileutils.rb +26 -0
  436. data/stdlib/nodejs/io.rb +2 -0
  437. data/stdlib/nodejs/irb.rb +45 -0
  438. data/stdlib/nodejs/process.rb +16 -0
  439. data/stdlib/nodejs/require.rb +32 -0
  440. data/stdlib/nodejs/rubygems.rb +68 -0
  441. data/stdlib/nodejs/runtime.rb +25 -0
  442. data/stdlib/nodejs/yaml.rb +11 -0
  443. data/stdlib/observer.rb +202 -0
  444. data/stdlib/opal-parser.rb +53 -0
  445. data/stdlib/opal-source-maps.rb +2 -0
  446. data/stdlib/ostruct.rb +69 -0
  447. data/stdlib/pathname.rb +31 -0
  448. data/stdlib/phantomjs.rb +8 -0
  449. data/stdlib/pp.rb +12 -0
  450. data/stdlib/process.rb +10 -0
  451. data/stdlib/promise.rb +300 -0
  452. data/stdlib/racc/parser.rb +215 -0
  453. data/stdlib/rbconfig.rb +20 -0
  454. data/stdlib/securerandom.rb +12 -0
  455. data/stdlib/set.rb +116 -0
  456. data/stdlib/singleton.rb +40 -0
  457. data/stdlib/source_map.rb +5 -0
  458. data/stdlib/source_map/map.rb +220 -0
  459. data/stdlib/source_map/mapping.rb +26 -0
  460. data/stdlib/source_map/offset.rb +88 -0
  461. data/stdlib/source_map/version.rb +3 -0
  462. data/stdlib/source_map/vlq.rb +98 -0
  463. data/stdlib/sourcemap.rb +1 -0
  464. data/stdlib/stringio.rb +181 -0
  465. data/stdlib/strscan.rb +155 -0
  466. data/stdlib/template.rb +46 -0
  467. data/stdlib/thread.rb +160 -0
  468. data/stdlib/time.rb +9 -0
  469. data/tasks/github.rake +19 -0
  470. metadata +690 -0
@@ -0,0 +1,28 @@
1
+ require 'support/parser_helpers'
2
+
3
+ describe "Attribute assignments" do
4
+ it "should return a s(:attrasgn) for simple assignments" do
5
+ parsed('self.foo = 1').should == [:attrasgn, [:self], :foo=, [:arglist, [:int, 1]]]
6
+ parsed('bar.foo = 1').should == [:attrasgn, [:call, nil, :bar, [:arglist]], :foo=, [:arglist, [:int, 1]]]
7
+ parsed('@bar.foo = 1').should == [:attrasgn, [:ivar, :@bar], :foo=, [:arglist, [:int, 1]]]
8
+ end
9
+
10
+ it "accepts both '.' and '::' for method call operators" do
11
+ parsed('self.foo = 1').should == [:attrasgn, [:self], :foo=, [:arglist, [:int, 1]]]
12
+ parsed('self::foo = 1').should == [:attrasgn, [:self], :foo=, [:arglist, [:int, 1]]]
13
+ end
14
+
15
+ it "can accept a constant as assignable name when using '.'" do
16
+ parsed('self.FOO = 1').should == [:attrasgn, [:self], :FOO=, [:arglist, [:int, 1]]]
17
+ end
18
+
19
+ describe "when setting element reference" do
20
+ it "uses []= as the method call" do
21
+ parsed('self[1] = 2').should == [:attrasgn, [:self], :[]=, [:arglist, [:int, 1], [:int, 2]]]
22
+ end
23
+
24
+ it "supports multiple arguments inside brackets" do
25
+ parsed('self[1, 2] = 3').should == [:attrasgn, [:self], :[]=, [:arglist, [:int, 1], [:int, 2], [:int, 3]]]
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,42 @@
1
+ require 'support/parser_helpers'
2
+
3
+ describe "The begin keyword" do
4
+ it "should be removed when used without a resuce or enusre body" do
5
+ parsed('begin; 1; end').should == [:int, 1]
6
+ parsed('begin; 1; 2; end').should == [:block, [:int, 1], [:int, 2]]
7
+ end
8
+
9
+ describe "with 'rescue' bodies" do
10
+ it "should create a s(:rescue) sexp" do
11
+ parsed('begin; 1; rescue; 2; end').should == [:rescue, [:int, 1], [:resbody, [:array], [:int, 2]]]
12
+ end
13
+
14
+ it "allows multiple rescue bodies" do
15
+ parsed('begin 1; rescue; 2; rescue; 3; end').should == [:rescue, [:int, 1], [:resbody, [:array], [:int, 2]], [:resbody, [:array], [:int, 3]]]
16
+ end
17
+
18
+ it "accepts a list of classes used to match against the exception" do
19
+ parsed('begin 1; rescue Klass; 2; end').should == [:rescue, [:int, 1], [:resbody, [:array, [:const, :Klass]], [:int, 2]]]
20
+ end
21
+
22
+ it "accepts an identifier to assign exception to" do
23
+ parsed('begin 1; rescue => a; 2; end').should == [:rescue, [:int, 1], [:resbody, [:array, [:lasgn, :a, [:gvar, :$!]]], [:int, 2]]]
24
+ parsed('begin 1; rescue Klass => a; 2; end').should == [:rescue, [:int, 1], [:resbody, [:array, [:const, :Klass],[:lasgn, :a, [:gvar, :$!]]], [:int, 2]]]
25
+ end
26
+
27
+ it "accepts an ivar to assign exception to" do
28
+ parsed('begin 1; rescue => @a; 2; end').should == [:rescue, [:int, 1], [:resbody, [:array, [:iasgn, :@a, [:gvar, :$!]]], [:int, 2]]]
29
+ parsed('begin 1; rescue Klass => @a; 2; end').should == [:rescue, [:int, 1], [:resbody, [:array, [:const, :Klass],[:iasgn, :@a, [:gvar, :$!]]], [:int, 2]]]
30
+ end
31
+
32
+ it "should parse newline right after rescue" do
33
+ parsed("begin; 1; rescue\n 2; end").should == [:rescue, [:int, 1], [:resbody, [:array], [:int, 2]]]
34
+ end
35
+ end
36
+
37
+ describe "with an 'ensure' block" do
38
+ it "should propagate into single s(:ensure) statement when no rescue block given" do
39
+ parsed('begin; 1; ensure; 2; end').should == [:ensure, [:int, 1], [:int, 2]]
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,12 @@
1
+ require 'support/parser_helpers'
2
+
3
+ describe "Block statements" do
4
+ it "should return the direct expression if only one expresssion in block" do
5
+ parsed("42").should == [:int, 42]
6
+ end
7
+
8
+ it "should return an s(:block) with all expressions appended for > 1 expression" do
9
+ parsed("42; 43").should == [:block, [:int, 42], [:int, 43]]
10
+ parsed("42; 43\n44").should == [:block, [:int, 42], [:int, 43], [:int, 44]]
11
+ end
12
+ end
@@ -0,0 +1,17 @@
1
+ require 'support/parser_helpers'
2
+
3
+ describe "The break keyword" do
4
+ it "should return s(:break) when given no args" do
5
+ parsed("break").should == [:break]
6
+ end
7
+
8
+ it "returns s(:break) with a single arg not wrapped in s(:array)" do
9
+ parsed("break 1").should == [:break, [:int, 1]]
10
+ parsed("break *1").should == [:break, [:splat, [:int, 1]]]
11
+ end
12
+
13
+ it "returns s(:break) with an s(:array) for args size > 1" do
14
+ parsed("break 1, 2").should == [:break, [:array, [:int, 1], [:int, 2]]]
15
+ parsed("break 1, *2").should == [:break, [:array, [:int, 1], [:splat, [:int, 2]]]]
16
+ end
17
+ end
@@ -0,0 +1,139 @@
1
+ require 'support/parser_helpers'
2
+
3
+ describe "Method calls" do
4
+ it "should use 'nil' for calls without a receiver" do
5
+ parsed("foo").should == [:call, nil, :foo, [:arglist]]
6
+ parsed("foo()").should == [:call, nil, :foo, [:arglist]]
7
+ end
8
+
9
+ it "should always have an arglist when not passed any arguments" do
10
+ parsed("foo").should == [:call, nil, :foo, [:arglist]]
11
+ parsed("self.foo").should == [:call, [:self], :foo, [:arglist]]
12
+ parsed("foo()").should == [:call, nil, :foo, [:arglist]]
13
+ parsed("self.foo()").should == [:call, [:self], :foo, [:arglist]]
14
+ end
15
+
16
+ it "appends all arguments onto arglist" do
17
+ parsed("foo 1").should == [:call, nil, :foo, [:arglist, [:int, 1]]]
18
+ parsed("foo 1, 2").should == [:call, nil, :foo, [:arglist, [:int, 1], [:int, 2]]]
19
+ parsed("foo 1, *2").should == [:call, nil, :foo, [:arglist, [:int, 1], [:splat, [:int, 2]]]]
20
+ end
21
+
22
+ it "supports leading dots on newline" do
23
+ parsed("foo\n.bar").should == [:call, [:call, nil, :foo, [:arglist]], :bar, [:arglist]]
24
+ lambda { parsed("foo\n..bar") }.should raise_error(Exception)
25
+ end
26
+ end
27
+
28
+ describe "Operator calls" do
29
+ it "should parse all other operators into method calls" do
30
+ parsed("1 % 2").should == [:call, [:int, 1], :%, [:arglist, [:int, 2]]]
31
+ parsed("1 ** 2").should == [:call, [:int, 1], :**, [:arglist, [:int, 2]]]
32
+
33
+ parsed("+self").should == [:call, [:self], :+@, [:arglist]]
34
+ parsed("-self").should == [:call, [:self], :-@, [:arglist]]
35
+
36
+ parsed("1 | 2").should == [:call, [:int, 1], :|, [:arglist, [:int, 2]]]
37
+ parsed("1 ^ 2").should == [:call, [:int, 1], :^, [:arglist, [:int, 2]]]
38
+ parsed("1 & 2").should == [:call, [:int, 1], :&, [:arglist, [:int, 2]]]
39
+ parsed("1 <=> 2").should == [:call, [:int, 1], :<=>, [:arglist, [:int, 2]]]
40
+
41
+ parsed("1 < 2").should == [:call, [:int, 1], :<, [:arglist, [:int, 2]]]
42
+ parsed("1 <= 2").should == [:call, [:int, 1], :<=, [:arglist, [:int, 2]]]
43
+ parsed("1 > 2").should == [:call, [:int, 1], :>, [:arglist, [:int, 2]]]
44
+ parsed("1 >= 2").should == [:call, [:int, 1], :>=, [:arglist, [:int, 2]]]
45
+
46
+ parsed("1 == 2").should == [:call, [:int, 1], :==, [:arglist, [:int, 2]]]
47
+ parsed("1 === 2").should == [:call, [:int, 1], :===, [:arglist, [:int, 2]]]
48
+ parsed("1 =~ 2").should == [:call, [:int, 1], :=~, [:arglist, [:int, 2]]]
49
+
50
+ parsed("~1").should == [:call, [:int, 1], :~, [:arglist]]
51
+ parsed("1 << 2").should == [:call, [:int, 1], :<<, [:arglist, [:int, 2]]]
52
+ parsed("1 >> 2").should == [:call, [:int, 1], :>>, [:arglist, [:int, 2]]]
53
+ end
54
+
55
+ it "optimizes +@ and -@ on numerics" do
56
+ parsed("+1").should == [:int, 1]
57
+ parsed("-1").should == [:int, -1]
58
+ end
59
+ end
60
+
61
+ describe "Optional paren calls" do
62
+ it "should correctly parse - and -@" do
63
+ parsed("x - 1").should == [:call, [:call, nil, :x, [:arglist]], :-, [:arglist, [:int, 1]]]
64
+ parsed("x -1").should == [:call, nil, :x, [:arglist, [:int, -1]]]
65
+ end
66
+
67
+ it "should correctly parse + and +@" do
68
+ parsed("x + 1").should == [:call, [:call, nil, :x, [:arglist]], :+, [:arglist, [:int, 1]]]
69
+ parsed("x +1").should == [:call, nil, :x, [:arglist, [:int, 1]]]
70
+ end
71
+
72
+ it "should correctly parse / and regexps" do
73
+ parsed("x / 500").should == [:call, [:call, nil, :x, [:arglist]], :/, [:arglist, [:int, 500]]]
74
+ parsed("x /foo/").should == [:call, nil, :x, [:arglist, [:regexp, 'foo', nil]]]
75
+ end
76
+
77
+ it "should parse LPAREN_ARG correctly" do
78
+ parsed("x (1).y").should == [:call, nil, :x, [:arglist, [:call, [:int, 1], :y, [:arglist]]]]
79
+ parsed("x(1).y").should == [:call, [:call, nil, :x, [:arglist, [:int, 1]]], :y, [:arglist]]
80
+ end
81
+ end
82
+
83
+ describe "Operator precedence" do
84
+ it "should be raised with parentheses" do
85
+ parsed("(1 + 2) + (3 - 4)").should == [:call,
86
+ [:paren, [:call, [:int, 1], :+, [:arglist, [:int, 2]]]],
87
+ :+,
88
+ [:arglist, [:paren, [:call, [:int, 3], :-, [:arglist, [:int, 4]]]]],
89
+ ]
90
+ parsed("(1 + 2) - (3 - 4)").should == [:call,
91
+ [:paren, [:call, [:int, 1], :+, [:arglist, [:int, 2]]]],
92
+ :-,
93
+ [:arglist, [:paren, [:call, [:int, 3], :-, [:arglist, [:int, 4]]]]],
94
+ ]
95
+ parsed("(1 + 2) * (3 - 4)").should == [:call,
96
+ [:paren, [:call, [:int, 1], :+, [:arglist, [:int, 2]]]],
97
+ :*,
98
+ [:arglist, [:paren, [:call, [:int, 3], :-, [:arglist, [:int, 4]]]]],
99
+ ]
100
+ parsed("(1 + 2) / (3 - 4)").should == [:call,
101
+ [:paren, [:call, [:int, 1], :+, [:arglist, [:int, 2]]]],
102
+ :/,
103
+ [:arglist, [:paren, [:call, [:int, 3], :-, [:arglist, [:int, 4]]]]],
104
+ ]
105
+ end
106
+ end
107
+
108
+ describe "Calls with keywords as method names" do
109
+
110
+ keywords = %w[class module defined? def undef end do if unless else elsif self true false
111
+ nil __LINE__ __FILE__ begin rescue ensure case when or and not return next
112
+ redo break super then while until yield alias]
113
+
114
+ it "should correctly parse the keyword as a method name when after a '.'" do
115
+ keywords.each do |kw|
116
+ parsed("self.#{kw}").should == [:call, [:self], kw.to_sym, [:arglist]]
117
+ end
118
+ end
119
+ end
120
+
121
+ describe "Calls with operators as method names" do
122
+ operators = %w[+ - * / & ** | ^ & <=> > >= < <= << >>]
123
+
124
+ it "should correctly parse the operator as method name after '.'" do
125
+ operators.each do |op|
126
+ parsed("self.#{op}").should == [:call, [:self], op.to_sym, [:arglist]]
127
+ parsed("self.#{op}(1)").should == [:call, [:self], op.to_sym, [:arglist, [:int, 1]]]
128
+ parsed("self.#{op}(1, 2)").should == [:call, [:self], op.to_sym, [:arglist, [:int, 1], [:int, 2]]]
129
+ end
130
+ end
131
+ end
132
+
133
+ describe "Command calls with operators" do
134
+ it "parses operators before \n in command calls" do
135
+ [:<<, :>>, :|, :^, :&, :<=>, :==, :===, :=~, :>, :>=, :<, :<=, :<<, :>>, :%, :**].each do |mid|
136
+ parsed("self #{mid}\nself").should == [:call, [:self], mid, [:arglist, [:self]]]
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,35 @@
1
+ require 'support/parser_helpers'
2
+
3
+ describe "The class keyword" do
4
+ it "returns an empty s(:block) when given an empty body" do
5
+ parsed('class A; end').should == [:class, [:const, :A], nil, [:block]]
6
+ end
7
+
8
+ it "does not place single expressions into a s(:block)" do
9
+ parsed('class A; 1; end').should == [:class, [:const, :A], nil, [:int, 1]]
10
+ end
11
+
12
+ it "adds multiple body expressions into a s(:block)" do
13
+ parsed('class A; 1; 2; end').should == [:class, [:const, :A], nil, [:block, [:int, 1], [:int, 2]]]
14
+ end
15
+
16
+ it "uses nil as a placeholder when no superclass is given" do
17
+ parsed('class A; end')[2].should == nil
18
+ end
19
+
20
+ it "reflects the given superclass" do
21
+ parsed('class A < B; end')[2].should == [:const, :B]
22
+ end
23
+
24
+ it "should accept just a constant for the class name" do
25
+ parsed('class A; end')[1].should == [:const, :A]
26
+ end
27
+
28
+ it "should accept a prefix constant for the class name" do
29
+ parsed('class ::A; end')[1].should == [:colon3, :A]
30
+ end
31
+
32
+ it "should accept a nested constant for the class name" do
33
+ parsed('class A::B; end')[1].should == [:colon2, [:const, :A], :B]
34
+ end
35
+ end
@@ -0,0 +1,11 @@
1
+ require 'support/parser_helpers'
2
+
3
+ describe "Multiline comments" do
4
+ it "parses multiline comments and ignores them" do
5
+ parsed("=begin\nfoo\n=end\n100").should == [:int, 100]
6
+ end
7
+
8
+ it "raises an exception if not closed before end of file" do
9
+ lambda { parsed("=begin\nfoo\nbar") }.should raise_error(Exception, /embedded document meets end of file/)
10
+ end
11
+ end
@@ -0,0 +1,61 @@
1
+ require 'support/parser_helpers'
2
+
3
+ describe "The def keyword" do
4
+ describe "for normal definitions" do
5
+ it "should return s(:def)" do
6
+ parsed("def a; end").should == [:def, nil, :a, [:args], [:block, [:nil]]]
7
+ end
8
+
9
+ it "adds s(:nil) on an empty body" do
10
+ parsed("def foo; end").last.should == [:block, [:nil]]
11
+ end
12
+ end
13
+
14
+ describe "for singleton definitions" do
15
+ it "should return s(:def)" do
16
+ parsed("def self.a; end").should == [:def, [:self], :a, [:args], [:block, [:nil]]]
17
+ end
18
+
19
+ it "adds s(:nil) on an empty body" do
20
+ parsed("def self.foo; end").last.should == [:block, [:nil]]
21
+ end
22
+ end
23
+
24
+ describe "with normal args" do
25
+ it "should list all args" do
26
+ parsed("def foo(a); end")[3].should == [:args, :a]
27
+ parsed("def foo(a, b); end")[3].should == [:args, :a, :b]
28
+ parsed("def foo(a, b, c); end")[3].should == [:args, :a, :b, :c]
29
+ end
30
+ end
31
+
32
+ describe "with opt args" do
33
+ it "should list all opt args as well as block with each lasgn" do
34
+ parsed("def foo(a = 1); end")[3].should == [:args, :a, [:block, [:lasgn, :a, [:int, 1]]]]
35
+ parsed("def foo(a = 1, b = 2); end")[3].should == [:args, :a, :b, [:block, [:lasgn, :a, [:int, 1]], [:lasgn, :b, [:int, 2]]]]
36
+ end
37
+
38
+ it "should list lasgn block after all other args" do
39
+ parsed("def foo(a, b = 1); end")[3].should == [:args, :a, :b, [:block, [:lasgn, :b, [:int, 1]]]]
40
+ parsed("def foo(b = 1, *c); end")[3].should == [:args, :b, :"*c", [:block, [:lasgn, :b, [:int, 1]]]]
41
+ parsed("def foo(b = 1, &block); end")[3].should == [:args, :b, :"&block", [:block, [:lasgn, :b, [:int, 1]]]]
42
+ end
43
+ end
44
+
45
+ describe "with rest args" do
46
+ it "should list rest args in place as a symbol with '*' prefix" do
47
+ parsed("def foo(*a); end")[3].should == [:args, :"*a"]
48
+ end
49
+
50
+ it "uses '*' as an arg name for rest args without a name" do
51
+ parsed("def foo(*); end")[3].should == [:args, :"*"]
52
+ end
53
+ end
54
+
55
+ describe "with block arg" do
56
+ it "should list block argument with the '&' prefix" do
57
+ parsed("def foo(&a); end")[3].should == [:args, :"&a"]
58
+ end
59
+ end
60
+ end
61
+
@@ -0,0 +1,26 @@
1
+ require 'support/parser_helpers'
2
+
3
+ describe "The if keyword" do
4
+ it "should return an s(:if) with given truthy and falsy bodies" do
5
+ parsed("if 1; 2; else; 3; end").should == [:if, [:int, 1], [:int, 2], [:int, 3]]
6
+ end
7
+
8
+ it "uses nil as fasly body if not given else-then" do
9
+ parsed("if 1; 2; end").should == [:if, [:int, 1], [:int, 2], nil]
10
+ end
11
+
12
+ it "is treats elsif parts as sub if expressions for else body" do
13
+ parsed("if 1; 2; elsif 3; 4; else; 5; end").should == [:if, [:int, 1], [:int, 2], [:if, [:int, 3], [:int, 4], [:int, 5]]]
14
+ parsed("if 1; 2; elsif 3; 4; end").should == [:if, [:int, 1], [:int, 2], [:if, [:int, 3], [:int, 4], nil]]
15
+ end
16
+
17
+ it "returns a simple s(:if) with nil else body for prefix if statement" do
18
+ parsed("1 if 2").should == [:if, [:int, 2], [:int, 1], nil]
19
+ end
20
+ end
21
+
22
+ describe "The ternary operator" do
23
+ it "gets converted into an if statement with true and false parts" do
24
+ parsed("1 ? 2 : 3").should == [:if, [:int, 1], [:int, 2], [:int, 3]]
25
+ end
26
+ end
@@ -0,0 +1,59 @@
1
+ require 'support/parser_helpers'
2
+
3
+ describe "Iters" do
4
+ describe "Iter on a command" do
5
+ it "the outer command call gets the iter" do
6
+ parsed("a b do; end").should == [:call, nil, :a, [:arglist, [:call, nil, :b, [:arglist]]], [:iter, nil]]
7
+ parsed("a 1, b do; end").should == [:call, nil, :a, [:arglist, [:int, 1], [:call, nil, :b, [:arglist]]], [:iter, nil]]
8
+ end
9
+ end
10
+
11
+ describe "with no args" do
12
+ it "has 'nil' as the args part of sexp" do
13
+ parsed("proc do; end")[4][1].should == nil
14
+ end
15
+ end
16
+
17
+ describe "with empty || args" do
18
+ it "should have args set to nil" do
19
+ parsed("proc do ||; end")[4][1].should == nil
20
+ end
21
+ end
22
+
23
+ describe "with normal args" do
24
+ it "adds a single s(:lasgn) for 1 norm arg" do
25
+ parsed("proc do |a|; end")[4][1].should == [:lasgn, :a]
26
+ end
27
+
28
+ it "lists multiple norm args inside a s(:masgn)" do
29
+ parsed("proc do |a, b|; end")[4][1].should == [:masgn, [:array, [:lasgn, :a], [:lasgn, :b]]]
30
+ parsed("proc do |a, b, c|; end")[4][1].should == [:masgn, [:array, [:lasgn, :a], [:lasgn, :b], [:lasgn, :c]]]
31
+ end
32
+ end
33
+
34
+ describe "with splat arg" do
35
+ it "adds a s(:masgn) for the s(:splat) even if its the only arg" do
36
+ parsed("proc do |*a|; end")[4][1].should == [:masgn, [:array, [:splat, [:lasgn, :a]]]]
37
+ parsed("proc do |a, *b|; end")[4][1].should == [:masgn, [:array, [:lasgn, :a], [:splat, [:lasgn, :b]]]]
38
+ end
39
+ end
40
+
41
+ describe "with opt args" do
42
+ it "adds a s(:block) arg to end of s(:masgn) for each lasgn" do
43
+ parsed("proc do |a = 1|; end")[4][1].should == [:masgn, [:array, [:lasgn, :a], [:block, [:lasgn, :a, [:int, 1]]]]]
44
+ parsed("proc do |a = 1, b = 2|; end")[4][1].should == [:masgn, [:array, [:lasgn, :a], [:lasgn, :b], [:block, [:lasgn, :a, [:int, 1]], [:lasgn, :b, [:int, 2]]]]]
45
+ end
46
+
47
+ it "should add lasgn block after all other args" do
48
+ parsed("proc do |a, b = 1|; end")[4][1].should == [:masgn, [:array, [:lasgn, :a], [:lasgn, :b], [:block, [:lasgn, :b, [:int, 1]]]]]
49
+ parsed("proc do |b = 1, *c|; end")[4][1].should == [:masgn, [:array, [:lasgn, :b], [:splat, [:lasgn, :c]], [:block, [:lasgn, :b, [:int, 1]]]]]
50
+ parsed("proc do |b = 1, &c|; end")[4][1].should == [:masgn, [:array, [:lasgn, :b], [:block_pass, [:lasgn, :c]], [:block, [:lasgn, :b, [:int, 1]]]]]
51
+ end
52
+ end
53
+
54
+ describe "with block arg" do
55
+ it "should add block arg with s(:block_pass) wrapping s(:lasgn) prefix" do
56
+ parsed("proc do |&a|; end")[4][1].should == [:masgn, [:array, [:block_pass, [:lasgn, :a]]]]
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,64 @@
1
+ require 'support/parser_helpers'
2
+
3
+ describe "Lambda literals" do
4
+ it "should parse with either do/end construct or curly braces" do
5
+ parsed("-> {}").first.should == :call
6
+ parsed("-> do; end").first.should == :call
7
+ end
8
+
9
+ it "should parse as a call to 'lambda' with the lambda body as a block" do
10
+ parsed("-> {}").should == [:call, nil, :lambda, [:arglist], [:iter, nil]]
11
+ end
12
+
13
+ describe "with no args" do
14
+ it "should accept no args" do
15
+ parsed("-> {}")[4][1].should == nil
16
+ end
17
+ end
18
+
19
+ describe "with normal args" do
20
+ it "adds a single s(:lasgn) for 1 norm arg" do
21
+ parsed("->(a) {}")[4][1].should == [:lasgn, :a]
22
+ end
23
+
24
+ it "lists multiple norm args inside a s(:masgn)" do
25
+ parsed("-> (a, b) {}")[4][1].should == [:masgn, [:array, [:lasgn, :a], [:lasgn, :b]]]
26
+ parsed("-> (a, b, c) {}")[4][1].should == [:masgn, [:array, [:lasgn, :a], [:lasgn, :b], [:lasgn, :c]]]
27
+ end
28
+ end
29
+
30
+ describe "with optional braces" do
31
+ it "parses normal args" do
32
+ parsed("-> a {}")[4][1].should == [:lasgn, :a]
33
+ parsed("-> a, b {}")[4][1].should == [:masgn, [:array, [:lasgn, :a], [:lasgn, :b]]]
34
+ end
35
+
36
+ it "parses splat args" do
37
+ parsed("-> *a {}")[4][1].should == [:masgn, [:array, [:splat, [:lasgn, :a]]]]
38
+ parsed("-> a, *b {}")[4][1].should == [:masgn, [:array, [:lasgn, :a], [:splat, [:lasgn, :b]]]]
39
+ end
40
+
41
+ it "parses opt args" do
42
+ parsed("-> a = 1 {}")[4][1].should == [:masgn, [:array, [:lasgn, :a], [:block, [:lasgn, :a, [:int, 1]]]]]
43
+ parsed("-> a = 1, b = 2 {}")[4][1].should == [:masgn, [:array, [:lasgn, :a], [:lasgn, :b], [:block, [:lasgn, :a, [:int, 1]], [:lasgn, :b, [:int, 2]]]]]
44
+ end
45
+
46
+ it "parses block args" do
47
+ parsed("-> &a {}")[4][1].should == [:masgn, [:array, [:block_pass, [:lasgn, :a]]]]
48
+ end
49
+ end
50
+
51
+ describe "with body statements" do
52
+ it "should be nil when no statements given" do
53
+ parsed("-> {}")[4][2].should == nil
54
+ end
55
+
56
+ it "should be the single sexp when given one statement" do
57
+ parsed("-> { 42 }")[4][2].should == [:int, 42]
58
+ end
59
+
60
+ it "should wrap multiple statements into a s(:block)" do
61
+ parsed("-> { 42; 3.142 }")[4][2].should == [:block, [:int, 42], [:float, 3.142]]
62
+ end
63
+ end
64
+ end