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,118 @@
1
+ require 'support/parser_helpers'
2
+
3
+ describe Opal::Parser do
4
+
5
+ it "parses true keyword" do
6
+ parsed("true").should == [:true]
7
+ end
8
+
9
+ it "true cannot be assigned to" do
10
+ lambda {
11
+ parsed "true = 1"
12
+ }.should raise_error(Exception)
13
+ end
14
+
15
+ it "parses false keyword" do
16
+ parsed("false").should == [:false]
17
+ end
18
+
19
+ it "false cannot be assigned to" do
20
+ lambda {
21
+ parsed "true = 1"
22
+ }.should raise_error(Exception)
23
+ end
24
+
25
+ it "parses nil keyword" do
26
+ parsed("nil").should == [:nil]
27
+ end
28
+
29
+ it "nil cannot be assigned to" do
30
+ lambda {
31
+ parsed "nil = 1"
32
+ }.should raise_error(Exception)
33
+ end
34
+
35
+ it "parses self keyword" do
36
+ parsed("self").should == [:self]
37
+ end
38
+
39
+ it "self cannot be assigned to" do
40
+ lambda {
41
+ parsed "self = 1"
42
+ }.should raise_error(Exception)
43
+ end
44
+
45
+ it "parses __FILE__ and should always return a s(:str) with given parser filename" do
46
+ parsed("__FILE__", "foo").should == [:str, "foo"]
47
+ end
48
+
49
+ it "parses __LINE__ and should always return a literal number of the current line" do
50
+ parsed("__LINE__").should == [:int, 1]
51
+ parsed("\n__LINE__").should == [:int, 2]
52
+ end
53
+
54
+ it "parses integers as a s(:int) sexp" do
55
+ parsed("32").should == [:int, 32]
56
+ end
57
+
58
+ it "parses floats as a s(:float)" do
59
+ parsed("3.142").should == [:float, 3.142]
60
+ end
61
+
62
+ describe "parsing arrays" do
63
+ it "should parse empty arrays as s(:array)" do
64
+ parsed("[]").should == [:array]
65
+ end
66
+
67
+ it "should append regular args onto end of array sexp" do
68
+ parsed("[1]").should == [:array, [:int, 1]]
69
+ parsed("[1, 2]").should == [:array, [:int, 1], [:int, 2]]
70
+ parsed("[1, 2, 3]").should == [:array, [:int, 1], [:int, 2], [:int, 3]]
71
+ end
72
+
73
+ it "should return a single item s(:array) with given splat if no norm args" do
74
+ parsed("[*1]").should == [:array, [:splat, [:int, 1]]]
75
+ end
76
+
77
+ it "should allow splats combined with any number of norm args" do
78
+ parsed("[1, *2]").should == [:array, [:int, 1], [:splat, [:int, 2]]]
79
+ parsed("[1, 2, *3]").should == [:array, [:int, 1], [:int, 2], [:splat, [:int, 3]]]
80
+ end
81
+ end
82
+
83
+ describe "parsing hashes" do
84
+ it "without any assocs should return an empty hash sexp" do
85
+ parsed("{}").should == [:hash]
86
+ end
87
+
88
+ it "adds each assoc pair as individual args onto sexp" do
89
+ parsed("{1 => 2}").should == [:hash, [:int, 1], [:int, 2]]
90
+ parsed("{1 => 2, 3 => 4}").should == [:hash, [:int, 1], [:int, 2], [:int, 3], [:int, 4]]
91
+ end
92
+
93
+ it "supports 1.9 style hash keys" do
94
+ parsed("{ a: 1 }").should == [:hash, [:sym, :a], [:int, 1]]
95
+ parsed("{ a: 1, b: 2 }").should == [:hash, [:sym, :a], [:int, 1], [:sym, :b], [:int, 2]]
96
+ end
97
+
98
+ it "parses hash arrows without spaces around arguments" do
99
+ parsed("{1=>2}").should == [:hash, [:int, 1], [:int, 2]]
100
+ parsed("{:foo=>2}").should == [:hash, [:sym, :foo], [:int, 2]]
101
+ end
102
+ end
103
+
104
+ describe "parsing regexps" do
105
+ it "parses a regexp" do
106
+ parsed("/lol/").should == [:regexp, 'lol', nil]
107
+ end
108
+
109
+ it "parses regexp options" do
110
+ parsed("/lol/i").should == [:regexp, 'lol', 'i']
111
+ end
112
+
113
+ it "can parse regexps using %r notation" do
114
+ parsed('%r(foo)').should == [:regexp, 'foo', nil]
115
+ parsed('%r(foo)i').should == [:regexp, 'foo', 'i']
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,37 @@
1
+ require 'support/parser_helpers'
2
+
3
+ describe "Masgn" do
4
+ describe "with a single lhs splat" do
5
+ it "returns a s(:masgn)" do
6
+ parsed('*a = 1, 2').first.should == :masgn
7
+ parsed('* = 1, 2').first.should == :masgn
8
+ end
9
+
10
+ it "wraps splat inside a s(:array)" do
11
+ parsed('*a = 1, 2')[1].should == [:array, [:splat, [:lasgn, :a]]]
12
+ parsed('* = 1, 2')[1].should == [:array, [:splat]]
13
+ end
14
+ end
15
+
16
+ describe "with more than 1 lhs item" do
17
+ it "returns a s(:masgn) " do
18
+ parsed('a, b = 1, 2').first.should == :masgn
19
+ end
20
+
21
+ it "collects all lhs args into an s(:array)" do
22
+ parsed('a, b = 1, 2')[1].should == [:array, [:lasgn, :a], [:lasgn, :b]]
23
+ parsed('@a, @b = 1, 2')[1].should == [:array, [:iasgn, :@a], [:iasgn, :@b]]
24
+ end
25
+
26
+ it "supports splat parts" do
27
+ parsed('a, *b = 1, 2')[1].should == [:array, [:lasgn, :a], [:splat, [:lasgn, :b]]]
28
+ parsed('@a, * = 1, 2')[1].should == [:array, [:iasgn, :@a], [:splat]]
29
+ end
30
+ end
31
+
32
+ describe "with a single rhs argument" do
33
+ it "should wrap rhs in an s(:to_ary)" do
34
+ parsed('a, b = 1')[2].should == [:to_ary, [:int, 1]]
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,27 @@
1
+ require 'support/parser_helpers'
2
+
3
+ describe "The module keyword" do
4
+ it "returns an empty s(:block) when given an empty body" do
5
+ parsed('module A; end').should == [:module, [:const, :A], [:block]]
6
+ end
7
+
8
+ it "does not place single expressions into a s(:block)" do
9
+ parsed('module A; 1; end').should == [:module, [:const, :A], [:int, 1]]
10
+ end
11
+
12
+ it "adds multiple body expressions into a s(:block)" do
13
+ parsed('module A; 1; 2; end').should == [:module, [:const, :A], [:block, [:int, 1], [:int, 2]]]
14
+ end
15
+
16
+ it "should accept just a constant for the module name" do
17
+ parsed('module A; end')[1].should == [:const, :A]
18
+ end
19
+
20
+ it "should accept a prefix constant for the module name" do
21
+ parsed('module ::A; end')[1].should == [:colon3, :A]
22
+ end
23
+
24
+ it "should accepts a nested constant for the module name" do
25
+ parsed('module A::B; end')[1].should == [:colon2, [:const, :A], :B]
26
+ end
27
+ end
@@ -0,0 +1,27 @@
1
+ require 'support/parser_helpers'
2
+
3
+ describe "The not keyword" do
4
+ it "returns a call sexp" do
5
+ parsed("not self").should == [:call, [:self], '!'.to_sym, [:arglist]]
6
+ parsed("not 42").should == [:call, [:int, 42], '!'.to_sym, [:arglist]]
7
+ end
8
+ end
9
+
10
+ describe "The '!' expression" do
11
+ it "returns a call sexp" do
12
+ parsed("!self").should == [:call, [:self], '!'.to_sym, [:arglist]]
13
+ parsed("!42").should == [:call, [:int, 42], '!'.to_sym, [:arglist]]
14
+ end
15
+ end
16
+
17
+ describe "The '!=' expression" do
18
+ it "rewrites as !(lhs == rhs)" do
19
+ parsed("1 != 2").should == [:call, [:call, [:int, 1], :==, [:arglist, [:int, 2]]], '!'.to_sym, [:arglist]]
20
+ end
21
+ end
22
+
23
+ describe "The '!~' expression" do
24
+ it "rewrites as !(lhs =~ rhs)" do
25
+ parsed("1 !~ 2").should == [:not, [:call, [:int, 1], :=~, [:arglist, [:int, 2]]]]
26
+ end
27
+ end
@@ -0,0 +1,23 @@
1
+ require 'support/parser_helpers'
2
+
3
+ describe "op_asgn1" do
4
+ it "returns s(:op_asgn1)" do
5
+ parsed('self[:foo] += 1')[0].should == :op_asgn1
6
+ end
7
+
8
+ it "correctly assigns the receiver" do
9
+ parsed("self[:foo] += 1")[1].should == [:self]
10
+ end
11
+
12
+ it "returns an arglist for args inside braces" do
13
+ parsed("self[:foo] += 1")[2].should == [:arglist, [:sym, :foo]]
14
+ end
15
+
16
+ it "only uses the operator, not with '=' appended" do
17
+ parsed("self[:foo] += 1")[3].should == '+'
18
+ end
19
+
20
+ it "uses a simple sexp, not an arglist" do
21
+ parsed("self[:foo] += 1")[4].should == [:int, 1]
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ require 'support/parser_helpers'
2
+
3
+ describe "op_asgn2" do
4
+ it "returns s(:op_asgn2)" do
5
+ parsed('self.foo += 1')[0].should == :op_asgn2
6
+ end
7
+
8
+ it "correctly assigns the receiver" do
9
+ parsed("self.foo += 1")[1].should == [:self]
10
+ end
11
+
12
+ it "appends '=' onto the identifier in the sexp" do
13
+ parsed("self.foo += 1")[2].should == :foo=
14
+ end
15
+
16
+ it "only uses the operator, not with '=' appended" do
17
+ parsed("self.foo += 1")[3].should == :+
18
+ end
19
+
20
+ it "uses a simple sexp, not an arglist" do
21
+ parsed("self.foo += 1")[4].should == [:int, 1]
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ require 'support/parser_helpers'
2
+
3
+ describe "The or statement" do
4
+ it "should always return s(:or)" do
5
+ parsed("1 or 2").should == [:or, [:int, 1], [:int, 2]]
6
+ end
7
+ end
8
+
9
+ describe "The || expression" do
10
+ it "should always return s(:or)" do
11
+ parsed("1 || 2").should == [:or, [:int, 1], [:int, 2]]
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ require 'support/parser_helpers'
2
+
3
+ describe "The return keyword" do
4
+ it "should return s(:return) when given no arguments" do
5
+ parsed("return").should == [:return]
6
+ end
7
+
8
+ it "returns s(:return) with the direct argument when given one argument" do
9
+ parsed("return 1").should == [:return, [:int, 1]]
10
+ parsed("return *2").should == [:return, [:splat, [:int, 2]]]
11
+ end
12
+
13
+ it "returns s(:return) with an s(:array) when args size > 1" do
14
+ parsed("return 1, 2").should == [:return, [:array, [:int, 1], [:int, 2]]]
15
+ parsed("return 1, *2").should == [:return, [:array, [:int, 1], [:splat, [:int, 2]]]]
16
+ end
17
+ end
@@ -0,0 +1,21 @@
1
+ require 'support/parser_helpers'
2
+
3
+ describe "Singleton classes" do
4
+ it "returns an empty s(:block) when given an empty body" do
5
+ parsed('class << A; end')[2].should == [:block]
6
+ end
7
+
8
+ it "does not place single expressions into an s(:block)" do
9
+ parsed('class << A; 1; end')[2].should == [:int, 1]
10
+ end
11
+
12
+ it "adds multiple body expressions into a s(:block)" do
13
+ parsed('class << A; 1; 2; end')[2].should == [:block, [:int, 1], [:int, 2]]
14
+ end
15
+
16
+ it "should accept any expressions for singleton part" do
17
+ parsed('class << A; end').should == [:sclass, [:const, :A], [:block]]
18
+ parsed('class << self; end').should == [:sclass, [:self], [:block]]
19
+ end
20
+ end
21
+
@@ -0,0 +1,276 @@
1
+ require 'support/parser_helpers'
2
+
3
+ describe "Strings" do
4
+ it "parses empty strings" do
5
+ parsed('""').should == [:str, ""]
6
+ parsed("''").should == [:str, ""]
7
+ end
8
+
9
+ it "parses a simple string without interpolation as s(:str)" do
10
+ parsed('"foo # { } bar"').should == [:str, "foo # { } bar"]
11
+ end
12
+
13
+ it "does not interpolate with single quotes" do
14
+ parsed("'\#{foo}'").should == [:str, "\#{foo}"]
15
+ parsed("'\#@foo'").should == [:str, "\#@foo"]
16
+ parsed("'\#$foo'").should == [:str, "\#$foo"]
17
+ parsed("'\#@@foo'").should == [:str, "\#@@foo"]
18
+ end
19
+
20
+ it "supports interpolation with double quotes" do
21
+ parsed('"#{foo}"').should == [:dstr, "", [:evstr, [:call, nil, :foo, [:arglist]]]]
22
+ parsed('"#@foo"').should == [:dstr, "", [:evstr, [:ivar, :@foo]]]
23
+ parsed('"#$foo"').should == [:dstr, "", [:evstr, [:gvar, :$foo]]]
24
+ parsed('"#@@foo"').should == [:dstr, "", [:evstr, [:cvar, :@@foo]]]
25
+ end
26
+
27
+ it "allows underscores in ivar, gvar and cvar interpolation" do
28
+ parsed('"#@foo_bar"').should == [:dstr, "", [:evstr, [:ivar, :@foo_bar]]]
29
+ parsed('"#$foo_bar"').should == [:dstr, "", [:evstr, [:gvar, :$foo_bar]]]
30
+ parsed('"#@@foo_bar"').should == [:dstr, "", [:evstr, [:cvar, :@@foo_bar]]]
31
+ end
32
+
33
+ describe "from %Q construction" do
34
+ it "can use '[', '(', '{' or '<' matching pairs for string boundry" do
35
+ parsed('%Q{foo}').should == [:str, "foo"]
36
+ parsed('%Q[foo]').should == [:str, "foo"]
37
+ parsed('%Q(foo)').should == [:str, "foo"]
38
+ parsed('%Q<foo>').should == [:str, "foo"]
39
+ end
40
+
41
+ it "can use valid characters as string boundrys" do
42
+ parsed('%q!Ford!').should == [:str, 'Ford']
43
+ parsed('%qaForda').should == [:str, 'Ford']
44
+ parsed('%q?Ford?').should == [:str, 'Ford']
45
+ end
46
+
47
+ it "can parse empty strings" do
48
+ parsed('%Q{}').should == [:str, ""]
49
+ parsed('%Q[]').should == [:str, ""]
50
+ parsed('%Q()').should == [:str, ""]
51
+ end
52
+
53
+ it "should allow interpolation" do
54
+ parsed('%Q(#{foo})').should == [:dstr, "", [:evstr, [:call, nil, :foo, [:arglist]]]]
55
+ parsed('%Q[#{foo}]').should == [:dstr, "", [:evstr, [:call, nil, :foo, [:arglist]]]]
56
+ parsed('%Q{#{foo}}').should == [:dstr, "", [:evstr, [:call, nil, :foo, [:arglist]]]]
57
+ end
58
+
59
+ it "should allow ivar, gvar and cvar interpolation" do
60
+ parsed('%Q{#@foo}').should == [:dstr, "", [:evstr, [:ivar, :@foo]]]
61
+ parsed('%Q{#$foo}').should == [:dstr, "", [:evstr, [:gvar, :$foo]]]
62
+ parsed('%Q{#@@foo}').should == [:dstr, "", [:evstr, [:cvar, :@@foo]]]
63
+ end
64
+
65
+ it "should match '{' and '}' pairs used to start string before ending match" do
66
+ parsed('%Q{{}}').should == [:str, "{}"]
67
+ parsed('%Q{foo{bar}baz}').should == [:str, "foo{bar}baz"]
68
+ parsed('%Q{{foo}bar}').should == [:str, "{foo}bar"]
69
+ parsed('%Q{foo{bar}}').should == [:str, "foo{bar}"]
70
+ parsed('%Q{foo#{bar}baz}').should == [:dstr, "foo", [:evstr, [:call, nil, :bar, [:arglist]]], [:str, "baz"]]
71
+ parsed('%Q{a{b{c}d{e}f}g}').should == [:str, "a{b{c}d{e}f}g"]
72
+ parsed('%Q{a{b{c}#{foo}d}e}').should == [:dstr, "a{b{c}", [:evstr, [:call, nil, :foo, [:arglist]]], [:str, "d}e"]]
73
+ end
74
+
75
+ it "should match '(' and ')' pairs used to start string before ending match" do
76
+ parsed('%Q(())').should == [:str, "()"]
77
+ parsed('%Q(foo(bar)baz)').should == [:str, "foo(bar)baz"]
78
+ parsed('%Q((foo)bar)').should == [:str, "(foo)bar"]
79
+ parsed('%Q(foo(bar))').should == [:str, "foo(bar)"]
80
+ parsed('%Q(foo#{bar}baz)').should == [:dstr, "foo", [:evstr, [:call, nil, :bar, [:arglist]]], [:str, "baz"]]
81
+ parsed('%Q(a(b(c)d(e)f)g)').should == [:str, "a(b(c)d(e)f)g"]
82
+ parsed('%Q(a(b(c)#{foo}d)e)').should == [:dstr, "a(b(c)", [:evstr, [:call, nil, :foo, [:arglist]]], [:str, "d)e"]]
83
+ end
84
+
85
+ it "should match '[' and ']' pairs used to start string before ending match" do
86
+ parsed('%Q[[]]').should == [:str, "[]"]
87
+ parsed('%Q[foo[bar]baz]').should == [:str, "foo[bar]baz"]
88
+ parsed('%Q[[foo]bar]').should == [:str, "[foo]bar"]
89
+ parsed('%Q[foo[bar]]').should == [:str, "foo[bar]"]
90
+ parsed('%Q[foo#{bar}baz]').should == [:dstr, "foo", [:evstr, [:call, nil, :bar, [:arglist]]], [:str, "baz"]]
91
+ parsed('%Q[a[b[c]d[e]f]g]').should == [:str, "a[b[c]d[e]f]g"]
92
+ parsed('%Q[a[b[c]#{foo}d]e]').should == [:dstr, "a[b[c]", [:evstr, [:call, nil, :foo, [:arglist]]], [:str, "d]e"]]
93
+ end
94
+
95
+ it "correctly parses block braces within interpolations" do
96
+ parsed('%Q{#{each { nil } }}').should == [:dstr, "", [:evstr, [:call, nil, :each, [:arglist], [:iter, nil, [:nil]]]]]
97
+ end
98
+
99
+ it "parses other Qstrings within interpolations" do
100
+ parsed('%Q{#{ %Q{} }}').should == [:dstr, "", [:evstr, [:str, ""]]]
101
+ end
102
+ end
103
+
104
+ describe "from character shortcuts" do
105
+ it "produces a string sexp" do
106
+ parsed("?a").should == [:str, "a"]
107
+ parsed("?&").should == [:str, "&"]
108
+ end
109
+
110
+ it "parses escape sequences" do
111
+ parsed("?\\n").should == [:str, "\n"]
112
+ parsed("?\\t").should == [:str, "\t"]
113
+ end
114
+
115
+ it "parses a string sexp as a command arg" do
116
+ parsed("foo ?a").should == [:call, nil, :foo, [:arglist, [:str, "a"]]]
117
+ end
118
+ end
119
+
120
+ it "parses %[] strings" do
121
+ parsed('%[]').should == [:str, '']
122
+ parsed('%[foo]').should == [:str, 'foo']
123
+ end
124
+ end
125
+
126
+
127
+ describe "x-strings" do
128
+ it "parses simple xstring as s(:xstr)" do
129
+ parsed("`foo`").should == [:xstr, "foo"]
130
+ end
131
+
132
+ it "parses new lines within xstring" do
133
+ parsed("`\nfoo\n\nbar`").should == [:xstr, "\nfoo\n\nbar"]
134
+ end
135
+
136
+ it "allows interpolation within xstring" do
137
+ parsed('`#{bar}`').should == [:dxstr, "", [:evstr, [:call, nil, :bar, [:arglist]]]]
138
+ parsed('`#{bar}#{baz}`').should == [:dxstr, "", [:evstr, [:call, nil, :bar, [:arglist]]], [:evstr, [:call, nil, :baz, [:arglist]]]]
139
+ end
140
+
141
+ it "supports ivar interpolation" do
142
+ parsed('`#@foo`').should == [:dxstr, "", [:evstr, [:ivar, :@foo]]]
143
+ parsed('`#@foo.bar`').should == [:dxstr, "", [:evstr, [:ivar, :@foo]], [:str, ".bar"]]
144
+ end
145
+
146
+ it "supports gvar interpolation" do
147
+ parsed('`#$foo`').should == [:dxstr, "", [:evstr, [:gvar, :$foo]]]
148
+ parsed('`#$foo.bar`').should == [:dxstr, "", [:evstr, [:gvar, :$foo]], [:str, ".bar"]]
149
+ end
150
+
151
+ it "supports cvar interpolation" do
152
+ parsed('`#@@foo`').should == [:dxstr, "", [:evstr, [:cvar, :@@foo]]]
153
+ end
154
+
155
+ it "correctly parses block braces within interpolations" do
156
+ parsed('`#{ each { nil } }`').should == [:dxstr, "", [:evstr, [:call, nil, :each, [:arglist], [:iter, nil, [:nil]]]]]
157
+ end
158
+
159
+ it "parses xstrings within interpolations" do
160
+ parsed('`#{ `bar` }`').should == [:dxstr, "", [:evstr, [:xstr, "bar"]]]
161
+ end
162
+
163
+ it "parses multiple levels of interpolation" do
164
+ parsed('`#{ `#{`bar`}` }`').should == [:dxstr, "", [:evstr, [:dxstr, "", [:evstr, [:xstr, "bar"]]]]]
165
+ end
166
+
167
+ describe "created using %x notation" do
168
+ it "can use '[', '(' or '{' matching pairs for string boundry" do
169
+ parsed('%x{foo}').should == [:xstr, "foo"]
170
+ parsed('%x[foo]').should == [:xstr, "foo"]
171
+ parsed('%x(foo)').should == [:xstr, "foo"]
172
+ end
173
+
174
+ it "can parse empty strings" do
175
+ parsed('%x{}').should == [:xstr, ""]
176
+ parsed('%x[]').should == [:xstr, ""]
177
+ parsed('%x()').should == [:xstr, ""]
178
+ end
179
+
180
+ it "should allow interpolation" do
181
+ parsed('%x{#{foo}}').should == [:dxstr, "", [:evstr, [:call, nil, :foo, [:arglist]]]]
182
+ parsed('%x[#{foo}]').should == [:dxstr, "", [:evstr, [:call, nil, :foo, [:arglist]]]]
183
+ parsed('%x(#{foo})').should == [:dxstr, "", [:evstr, [:call, nil, :foo, [:arglist]]]]
184
+ end
185
+
186
+ it "should allow ivar, gvar and cvar interpolation" do
187
+ parsed('%x{#@foo}').should == [:dxstr, "", [:evstr, [:ivar, :@foo]]]
188
+ parsed('%x{#$foo}').should == [:dxstr, "", [:evstr, [:gvar, :$foo]]]
189
+ parsed('%x{#@@foo}').should == [:dxstr, "", [:evstr, [:cvar, :@@foo]]]
190
+ end
191
+
192
+ it "should match '{' and '}' pairs used to start string before ending match" do
193
+ parsed('%x{{}}').should == [:xstr, "{}"]
194
+ parsed('%x{foo{bar}baz}').should == [:xstr, "foo{bar}baz"]
195
+ parsed('%x{{foo}bar}').should == [:xstr, "{foo}bar"]
196
+ parsed('%x{foo{bar}}').should == [:xstr, "foo{bar}"]
197
+ parsed('%x{foo#{bar}baz}').should == [:dxstr, "foo", [:evstr, [:call, nil, :bar, [:arglist]]], [:str, "baz"]]
198
+ parsed('%x{a{b{c}d{e}f}g}').should == [:xstr, "a{b{c}d{e}f}g"]
199
+ parsed('%x{a{b{c}#{foo}d}e}').should == [:dxstr, "a{b{c}", [:evstr, [:call, nil, :foo, [:arglist]]], [:str, "d}e"]]
200
+ end
201
+
202
+ it "should match '(' and ')' pairs used to start string before ending match" do
203
+ parsed('%x(())').should == [:xstr, "()"]
204
+ parsed('%x(foo(bar)baz)').should == [:xstr, "foo(bar)baz"]
205
+ parsed('%x((foo)bar)').should == [:xstr, "(foo)bar"]
206
+ parsed('%x(foo(bar))').should == [:xstr, "foo(bar)"]
207
+ parsed('%x(foo#{bar}baz)').should == [:dxstr, "foo", [:evstr, [:call, nil, :bar, [:arglist]]], [:str, "baz"]]
208
+ parsed('%x(a(b(c)d(e)f)g)').should == [:xstr, "a(b(c)d(e)f)g"]
209
+ parsed('%x(a(b(c)#{foo}d)e)').should == [:dxstr, "a(b(c)", [:evstr, [:call, nil, :foo, [:arglist]]], [:str, "d)e"]]
210
+ end
211
+
212
+ it "should match '[' and ']' pairs used to start string before ending match" do
213
+ parsed('%x[[]]').should == [:xstr, "[]"]
214
+ parsed('%x[foo[bar]baz]').should == [:xstr, "foo[bar]baz"]
215
+ parsed('%x[[foo]bar]').should == [:xstr, "[foo]bar"]
216
+ parsed('%x[foo[bar]]').should == [:xstr, "foo[bar]"]
217
+ parsed('%x[foo#{bar}baz]').should == [:dxstr, "foo", [:evstr, [:call, nil, :bar, [:arglist]]], [:str, "baz"]]
218
+ parsed('%x[a[b[c]d[e]f]g]').should == [:xstr, "a[b[c]d[e]f]g"]
219
+ parsed('%x[a[b[c]#{foo}d]e]').should == [:dxstr, "a[b[c]", [:evstr, [:call, nil, :foo, [:arglist]]], [:str, "d]e"]]
220
+ end
221
+
222
+ it "correctly parses block braces within interpolations" do
223
+ parsed('%x{#{each { nil } }}').should == [:dxstr, "", [:evstr, [:call, nil, :each, [:arglist], [:iter, nil, [:nil]]]]]
224
+ end
225
+
226
+ it "parses other Xstrings within interpolations" do
227
+ parsed('%x{#{ %x{} }}').should == [:dxstr, "", [:evstr, [:xstr, ""]]]
228
+ parsed('%x{#{ `` }}').should == [:dxstr, "", [:evstr, [:xstr, ""]]]
229
+ parsed('%x{#{ `foo` }}').should == [:dxstr, "", [:evstr, [:xstr, "foo"]]]
230
+ end
231
+ end
232
+
233
+ describe "cannot be created with %X notation" do
234
+ it "should not parse" do
235
+ lambda {
236
+ parsed('%X{}')
237
+ }.should raise_error(Exception)
238
+ end
239
+ end
240
+
241
+ describe "contiguous strings" do
242
+ it "concatenates parts" do
243
+ parsed('"a" "b"').should == [:dstr, "a", [:str, "b"]]
244
+ end
245
+ end
246
+
247
+ end
248
+
249
+ describe "Heredocs" do
250
+
251
+ it "parses as a s(:str)" do
252
+ parsed("a = <<-FOO\nbar\nFOO")[2].should == [:str, "bar\n"]
253
+ end
254
+
255
+ it "allows start marker to be wrapped in quotes" do
256
+ parsed("a = <<-'FOO'\nbar\nFOO")[2].should == [:str, "bar\n"]
257
+ parsed("a = <<-\"FOO\"\nbar\nFOO")[2].should == [:str, "bar\n"]
258
+ end
259
+
260
+ it "does not parse EOS unless beginning of line" do
261
+ parsed("<<-FOO\ncontentFOO\nFOO").should == [:str, "contentFOO\n"]
262
+ end
263
+
264
+ it "does not parse EOS unless end of line" do
265
+ parsed("<<-FOO\nsome FOO content\nFOO").should == [:str, "some FOO content\n"]
266
+ end
267
+
268
+ it "parses postfix code as if it appeared after heredoc" do
269
+ parsed("<<-FOO.class\ncode\nFOO").should == [:call, [:str, "code\n"], :class, [:arglist]]
270
+ parsed("bar(<<-FOO, 1, 2, 3)\ncode\nFOO").should == [:call, nil, :bar,
271
+ [:arglist, [:str, "code\n"],
272
+ [:int, 1],
273
+ [:int, 2],
274
+ [:int, 3]]]
275
+ end
276
+ end