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,4 @@
1
+ opal_filter "RNGs" do
2
+ fails "Array#shuffle uses given random generator"
3
+ fails "Array#shuffle uses default random generator"
4
+ end
@@ -0,0 +1,5 @@
1
+ opal_filter "ruby_exe" do
2
+ fails "The break statement in a lambda created at the toplevel returns a value when invoking from the toplevel"
3
+ fails "The break statement in a lambda created at the toplevel returns a value when invoking from a method"
4
+ fails "The break statement in a lambda created at the toplevel returns a value when invoking from a block"
5
+ end
@@ -0,0 +1,155 @@
1
+ opal_filter 'tainted' do
2
+ fails "Kernel#to_s returns a tainted result if self is tainted"
3
+
4
+ fails "Array#* with a string with a tainted separator taints the result if the array has two or more elements"
5
+ fails "Array#* with a string with a tainted separator does not taint the result if the array has only one element"
6
+ fails "Array#* with a string with a tainted separator does not taint the result if the array is empty"
7
+ fails "Array#* with an integer copies the taint status of the original array if the passed count is not 0"
8
+ fails "Array#* with an integer copies the taint status of the original array even if the array is empty"
9
+ fails "Array#* with an integer copies the taint status of the original array even if the passed count is 0"
10
+
11
+ fails "Array#+ does not get infected even if an original array is tainted"
12
+
13
+ fails "Array#concat is not infected by the other"
14
+
15
+ fails "Array#clear keeps tainted status"
16
+
17
+ fails "Array#clone copies taint status from the original"
18
+
19
+ fails "Array#collect does not copy tainted status"
20
+
21
+ fails "Array#collect! keeps tainted status"
22
+
23
+ fails "Array#compact does not keep tainted status even if all elements are removed"
24
+
25
+ fails "Array#compact! keeps tainted status even if all elements are removed"
26
+
27
+ fails "Array#concat keeps tainted status"
28
+ fails "Array#concat keeps the tainted status of elements"
29
+
30
+ fails "Array#delete keeps tainted status"
31
+
32
+ fails "Array#delete_at keeps tainted status"
33
+
34
+ fails "Array#delete_if keeps tainted status"
35
+
36
+ fails "Array#dup copies taint status from the original"
37
+
38
+ fails "Array#flatten returns a tainted array if self is tainted"
39
+
40
+ fails "Array#inspect taints the result if an element is tainted"
41
+ fails "Array#inspect does not taint the result if the Array is tainted but empty"
42
+ fails "Array#inspect taints the result if the Array is non-empty and tainted"
43
+
44
+ fails "Array#join with a tainted separator taints the result if the array has two or more elements"
45
+ fails "Array#join with a tainted separator does not taint the result if the array has only one element"
46
+ fails "Array#join with a tainted separator does not taint the result if the array is empty"
47
+ fails "Array#join taints the result if the result of coercing an element is tainted"
48
+ fails "Array#join does not taint the result if the Array is tainted but empty"
49
+ fails "Array#join taints the result if the Array is tainted and non-empty"
50
+
51
+ fails "Array#pop passed a number n as an argument keeps taint status"
52
+ fails "Array#pop passed a number n as an argument returns an untainted array even if the array is tainted"
53
+ fails "Array#pop keeps taint status"
54
+
55
+ fails "Array#map! keeps tainted status"
56
+ fails "Array#map does not copy tainted status"
57
+
58
+ fails "Array#shift passed a number n as an argument keeps taint status"
59
+ fails "Array#shift passed a number n as an argument returns an untainted array even if the array is tainted"
60
+
61
+ fails "Array#to_s taints the result if an element is tainted"
62
+ fails "Array#to_s does not taint the result if the Array is tainted but empty"
63
+ fails "Array#to_s taints the result if the Array is non-empty and tainted"
64
+
65
+ fails "Hash#reject taints the resulting hash"
66
+ fails "Hash#to_a returns a tainted array if self is tainted"
67
+ fails "Hash#to_s returns a tainted string if self is tainted and not empty"
68
+ fails "Hash#inspect returns a tainted string if self is tainted and not empty"
69
+
70
+ fails "String#[] with index, length always taints resulting strings when self is tainted"
71
+ fails "String#[] with Range always taints resulting strings when self is tainted"
72
+ fails "String#[] with Regexp always taints resulting strings when self or regexp is tainted"
73
+ fails "String#[] with Regexp, index always taints resulting strings when self or regexp is tainted"
74
+ fails "String#[] with String taints resulting strings when other is tainted"
75
+
76
+ fails "String#capitalize taints resulting string when self is tainted"
77
+
78
+ fails "String#downcase taints result when self is tainted"
79
+
80
+ fails "String#center with length, padding when padding is tainted and self is untainted returns a tainted string if and only if length is longer than self"
81
+ fails "String#center with length, padding taints result when self or padstr is tainted"
82
+
83
+ fails "String#chomp when passed a String does not taint the result when the argument is tainted"
84
+ fails "String#chomp when passed a String taints the result if self is tainted"
85
+ fails "String#chomp when passed '\\n' taints the result if self is tainted"
86
+ fails "String#chomp when passed '' taints the result if self is tainted"
87
+ fails "String#chomp when passed nil taints the result if self is tainted"
88
+ fails "String#chomp when passed nil returns a copy of the String"
89
+ fails "String#chomp when passed no argument taints the result if self is tainted"
90
+
91
+ fails "String#chop taints result when self is tainted"
92
+
93
+ fails "String#each_line taints substrings that are passed to the block if self is tainted"
94
+
95
+ fails "String#gsub with pattern and replacement taints the result if the original string or replacement is tainted"
96
+ fails "String#gsub with pattern and Hash taints the result if the original string is tainted"
97
+ fails "String#gsub with pattern and Hash taints the result if a hash value is tainted"
98
+
99
+ fails "String#lines taints substrings that are passed to the block if self is tainted"
100
+
101
+ fails "String#ljust with length, padding taints result when self or padstr is tainted"
102
+ fails "String#ljust with length, padding when padding is tainted and self is untainted returns a tainted string if and only if length is longer than self"
103
+
104
+ fails "String#lstrip taints the result when self is tainted"
105
+
106
+ fails "String#next taints the result if self is tainted"
107
+
108
+ fails "String#reverse taints the result if self is tainted"
109
+
110
+ fails "String#rjust with length, padding taints result when self or padstr is tainted"
111
+ fails "String#rjust with length, padding when padding is tainted and self is untainted returns a tainted string if and only if length is longer than self"
112
+
113
+
114
+ fails "String#rstrip taints the result when self is tainted"
115
+
116
+ fails "String#slice with index, length always taints resulting strings when self is tainted"
117
+ fails "String#slice with Range always taints resulting strings when self is tainted"
118
+ fails "String#slice with Regexp always taints resulting strings when self or regexp is tainted"
119
+ fails "String#slice with Regexp, index always taints resulting strings when self or regexp is tainted"
120
+ fails "String#slice with String taints resulting strings when other is tainted"
121
+
122
+ fails "String#split with String taints the resulting strings if self is tainted"
123
+ fails "String#split with Regexp taints the resulting strings if self is tainted"
124
+ fails "String#split with Regexp taints an empty string if self is tainted"
125
+ fails "String#split with Regexp doesn't taints the resulting strings if the Regexp is tainted"
126
+
127
+ fails "String#squeeze taints the result when self is tainted"
128
+
129
+ fails "String#strip taints the result when self is tainted"
130
+
131
+ fails "String#swapcase taints resulting string when self is tainted"
132
+
133
+ fails "String#sub with pattern, replacement taints the result if the original string or replacement is tainted"
134
+ fails "String#sub with pattern and block taints the result if the original string or replacement is tainted"
135
+
136
+ fails "String#succ taints the result if self is tainted"
137
+
138
+ fails "String#to_s taints the result when self is tainted"
139
+
140
+ fails "String#to_str taints the result when self is tainted"
141
+
142
+ fails "String#tr taints the result when self is tainted"
143
+
144
+ fails "String#tr_s taints the result when self is tainted"
145
+
146
+ fails "String#upcase taints result when self is tainted"
147
+
148
+ fails "Pathname.new is tainted if path is tainted"
149
+
150
+ fails "Enumerable#entries returns a tainted array if self is tainted"
151
+
152
+ fails "Enumerable#group_by returns a tainted hash if self is tainted"
153
+
154
+ fails "Enumerable#to_a returns a tainted array if self is tainted"
155
+ end
@@ -0,0 +1,21 @@
1
+ opal_filter "Time" do
2
+ fails "Time.mktime handles microseconds"
3
+ fails "Time.mktime handles fractional microseconds as a Float"
4
+ fails "Time.mktime handles fractional microseconds as a Rational"
5
+ fails "Time.mktime ignores fractional seconds if a passed whole number of microseconds"
6
+ fails "Time.mktime ignores fractional seconds if a passed fractional number of microseconds"
7
+
8
+ fails "Time#strftime returns the fractional seconds digits, default is 9 digits (nanosecond) with %N"
9
+ fails "Time#strftime with %N formats the nanoseconds of of the second with %N"
10
+ fails "Time#strftime with %N formats the milliseconds of of the second with %3N"
11
+ fails "Time#strftime with %N formats the microseconds of of the second with %6N"
12
+ fails "Time#strftime with %N formats the nanoseconds of of the second with %9N"
13
+ fails "Time#strftime with %N formats the picoseconds of of the second with %12N"
14
+ fails "Time#strftime with %z formats a UTC time offset as '+0000'"
15
+ fails "Time#strftime with %z formats a time with fixed positive offset as '+HHMM'"
16
+ fails "Time#strftime with %z formats a time with fixed negative offset as '-HHMM'"
17
+ fails "Time#strftime with %z formats a time with fixed offset as '+/-HH:MM' with ':' specifier"
18
+ fails "Time#strftime with %z formats a time with fixed offset as '+/-HH:MM:SS' with '::' specifier"
19
+ fails "Time#strftime with %z rounds fixed offset to the nearest second"
20
+ fails "Time#strftime with %L formats the milliseconds of of the second"
21
+ end
@@ -0,0 +1,80 @@
1
+ opal_filter "Object#trusted/untrusted" do
2
+ fails "Kernel#to_s returns an untrusted result if self is untrusted"
3
+
4
+ fails "Array#+ does not infected even if an original array is untrusted"
5
+
6
+ fails "Array#* with an integer copies the untrusted status of the original array if the passed count is not 0"
7
+ fails "Array#* with an integer copies the untrusted status of the original array even if the array is empty"
8
+ fails "Array#* with an integer copies the untrusted status of the original array even if the passed count is 0"
9
+ fails "Array#* with a string with an untrusted separator untrusts the result if the array has two or more elements"
10
+ fails "Array#* with a string with an untrusted separator does not untrust the result if the array has only one element"
11
+ fails "Array#* with a string with an untrusted separator does not untrust the result if the array is empty"
12
+
13
+ fails "Array#delete keeps untrusted status"
14
+
15
+ fails "Array#delete_if keeps untrusted status"
16
+
17
+ fails "Array#delete_at keeps untrusted status"
18
+
19
+ fails "Array#clear keeps untrusted status"
20
+
21
+ fails "Array#clone copies untrusted status from the original"
22
+
23
+ fails "Array#collect does not copy untrusted status"
24
+
25
+ fails "Array#compact does not keep untrusted status even if all elements are removed"
26
+
27
+ fails "Array#compact! keeps untrusted status even if all elements are removed"
28
+
29
+ fails "Array#collect! keeps untrusted status"
30
+
31
+ fails "Array#concat keeps untrusted status"
32
+ fails "Array#concat is not infected untrustedness by the other"
33
+ fails "Array#concat keeps the untrusted status of elements"
34
+
35
+ fails "Array#dup copies untrusted status from the original"
36
+
37
+ fails "Array#flatten returns an untrusted array if self is untrusted"
38
+
39
+ fails "Array#inspect untrusts the result if an element is untrusted"
40
+ fails "Array#inspect does not untrust the result if the Array is untrusted but empty"
41
+ fails "Array#inspect untrusts the result if the Array is untrusted"
42
+
43
+ fails "Array#join with an untrusted separator untrusts the result if the array has two or more elements"
44
+ fails "Array#join with an untrusted separator does not untrust the result if the array has only one element"
45
+ fails "Array#join with an untrusted separator does not untrust the result if the array is empty"
46
+ fails "Array#join untrusts the result if the result of coercing an element is untrusted"
47
+ fails "Array#join does not untrust the result if the Array is untrusted but empty"
48
+ fails "Array#join untrusts the result if the Array is untrusted and non-empty"
49
+
50
+ fails "Array#map does not copy untrusted status"
51
+
52
+ fails "Array#pop passed a number n as an argument keeps untrusted status"
53
+ fails "Array#pop passed a number n as an argument returns a trusted array even if the array is untrusted"
54
+ fails "Array#pop keeps untrusted status"
55
+
56
+ fails "Array#map! keeps untrusted status"
57
+
58
+ fails "Array#to_s untrusts the result if an element is untrusted"
59
+ fails "Array#to_s does not untrust the result if the Array is untrusted but empty"
60
+ fails "Array#to_s untrusts the result if the Array is untrusted"
61
+
62
+ fails "Enumerable#to_a returns an untrusted array if self is untrusted"
63
+
64
+ fails "Enumerable#entries returns an untrusted array if self is untrusted"
65
+
66
+ fails "Enumerable#group_by returns an untrusted hash if self is untrusted"
67
+
68
+ fails "Hash#inspect returns an untrusted string if self is untrusted and not empty"
69
+
70
+ fails "Hash#to_a returns an untrusted array if self is untrusted"
71
+
72
+ fails "Hash#to_s returns an untrusted string if self is untrusted and not empty"
73
+
74
+ fails "String#chop untrusts result when self is untrusted"
75
+
76
+ fails "String#gsub with pattern and replacement untrusts the result if the original string or replacement is untrusted"
77
+ fails "String#gsub with pattern and Hash untrusts the result if the original string is untrusted"
78
+ fails "String#gsub with pattern and Hash untrusts the result if a hash value is untrusted"
79
+ fails "String#gsub with pattern and block untrusts the result if the original string or replacement is untrusted"
80
+ end
@@ -0,0 +1,27 @@
1
+ require 'lib/spec_helper'
2
+ require 'opal/builder_processors'
3
+
4
+ describe Opal::Builder::RubyProcessor do
5
+ it 'compiles ruby to js' do
6
+ processor = described_class.new('puts 5', '-e')
7
+ expect(processor.to_s).to include('$puts(5)')
8
+ end
9
+
10
+ describe ':requirable option' do
11
+ it 'is respected' do
12
+ processor = described_class.new('puts 5', '-e', requirable: true)
13
+ expect(processor.to_s).to include('Opal.modules[')
14
+ end
15
+
16
+ it 'defaults to "false"' do
17
+ processor = described_class.new('puts 5', '-e')
18
+ expect(processor.to_s).not_to include('Opal.modules[')
19
+ end
20
+ end
21
+
22
+ it 'fills required_trees' do
23
+ processor = described_class.new('require_tree "./pippo"', '-e')
24
+ expect(processor.required_trees).to eq(['pippo'])
25
+ end
26
+ end
27
+
@@ -0,0 +1,66 @@
1
+ require 'lib/spec_helper'
2
+ require 'opal/builder'
3
+ require 'lib/shared/path_reader_shared'
4
+
5
+ describe Opal::Builder do
6
+ subject(:builder) { described_class.new(options) }
7
+ let(:options) { {} }
8
+
9
+ it 'compiles opal' do
10
+ expect(builder.build('opal').to_s).to match('(Opal);')
11
+ end
12
+
13
+ it 'respect #require_tree calls' do
14
+ begin
15
+ Opal.append_path(File.expand_path('..', __FILE__))
16
+ expect(builder.build('fixtures/require_tree_test').to_s).to include('Opal.modules["fixtures/required_tree_test/required_file1"]')
17
+ ensure
18
+ Opal.instance_variable_set('@paths', nil)
19
+ end
20
+ end
21
+
22
+ describe ':stubs' do
23
+ let(:options) { {stubs: ['foo']} }
24
+
25
+ it 'compiles them as empty files' do
26
+ source = 'require "foo"'
27
+ expect(builder.default_processor).to receive('new').with(source, anything, anything).once.and_call_original
28
+ expect(builder.default_processor).to receive('new').with('', anything, anything).once.and_call_original
29
+
30
+ builder.build_str(source, 'bar.rb')
31
+ end
32
+ end
33
+
34
+ describe ':prerequired' do
35
+ let(:options) { {prerequired: ['foo']} }
36
+
37
+ it 'compiles them as empty files' do
38
+ source = 'require "foo"'
39
+ builder.build_str(source, 'bar.rb')
40
+ end
41
+ end
42
+
43
+ describe ':preload' do
44
+ let(:options) { {preload: ['base64']} }
45
+
46
+ it 'compiles them as empty files' do
47
+ source = 'puts 5'
48
+ expect(builder.default_processor).to receive('new').with(anything, 'base64', anything).once.and_call_original
49
+ expect(builder.default_processor).to receive('new').with(source, anything, anything).once.and_call_original
50
+
51
+ builder.build_str(source, 'bar.rb')
52
+ end
53
+ end
54
+
55
+ describe 'requiring a native .js file' do
56
+ it 'can be required without specifying extension' do
57
+ builder.build_str('require "corelib/runtime"', 'foo')
58
+ expect(builder.to_s).to start_with('(function(undefined)')
59
+ end
60
+
61
+ it 'can be required specifying extension' do
62
+ builder.build_str('require "corelib/runtime.js"', 'foo')
63
+ expect(builder.to_s).to start_with('(function(undefined)')
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,134 @@
1
+ require 'lib/spec_helper'
2
+ require 'opal/cli'
3
+ require 'stringio'
4
+
5
+ describe Opal::CLI do
6
+ let(:fake_stdout) { StringIO.new }
7
+ let(:file) { File.expand_path('../fixtures/opal_file.rb', __FILE__) }
8
+ let(:options) { nil }
9
+ subject(:cli) { described_class.new(options) }
10
+
11
+ context 'with a file' do
12
+ let(:options) { {:file => File.open(file)} }
13
+
14
+ it 'runs the file' do
15
+ expect_output_of{ subject.run }.to eq("hi from opal!\n")
16
+ end
17
+ end
18
+
19
+ describe ':evals option' do
20
+ context 'without evals and paths' do
21
+ it 'raises ArgumentError' do
22
+ expect { subject.run }.to raise_error(ArgumentError)
23
+ end
24
+ end
25
+
26
+ context 'with one eval' do
27
+ let(:options) { {:evals => ['puts "hello"']} }
28
+
29
+ it 'executes the code' do
30
+ expect_output_of{ subject.run }.to eq("hello\n")
31
+ end
32
+ end
33
+
34
+ context 'with many evals' do
35
+ let(:options) { {:evals => ['puts "hello"', 'puts "ciao"']} }
36
+
37
+ it 'executes the code' do
38
+ expect_output_of{ subject.run }.to eq("hello\nciao\n")
39
+ end
40
+ end
41
+ end
42
+
43
+ describe ':requires options' do
44
+ context 'with an absolute path' do
45
+ let(:options) { {:requires => [file], :evals => ['']} }
46
+ it 'requires the file' do
47
+ expect_output_of{ subject.run }.to eq("hi from opal!\n")
48
+ end
49
+ end
50
+
51
+ context 'with a path relative to a load path' do
52
+ let(:dir) { File.dirname(file) }
53
+ let(:filename) { File.basename(file) }
54
+ let(:options) { {:load_paths => [dir], :requires => [filename], :evals => ['']} }
55
+ it 'requires the file' do
56
+ expect_output_of{ subject.run }.to eq("hi from opal!\n")
57
+ end
58
+ end
59
+ end
60
+
61
+ describe ':gems options' do
62
+ context 'with a Gem name' do
63
+ let(:dir) { File.dirname(file) }
64
+ let(:filename) { File.basename(file) }
65
+ let(:gem_name) { 'mspec' }
66
+ let(:options) { {:gems => [gem_name], :evals => ['']} }
67
+
68
+ it "adds the gem's lib paths to Opal.path" do
69
+ cli.run
70
+
71
+ spec = Gem::Specification.find_by_name(gem_name)
72
+ spec.require_paths.each do |require_path|
73
+ require_path = File.join(spec.gem_dir, require_path)
74
+ expect(Opal.paths).to include(require_path)
75
+ end
76
+ end
77
+ end
78
+ end
79
+
80
+ describe ':stubs options' do
81
+ context 'with a stubbed file' do
82
+ let(:dir) { File.dirname(file) }
83
+ let(:filename) { File.basename(file) }
84
+ let(:stub_name) { 'an_unparsable_lib' }
85
+ let(:options) { {:stubs => [stub_name], :evals => ["require #{stub_name.inspect}"]} }
86
+
87
+ it "adds the gem's lib paths to Opal.path" do
88
+ expect_output_of{ subject.run }.to eq('')
89
+ end
90
+ end
91
+ end
92
+
93
+ describe ':verbose option' do
94
+ let(:options) { {:verbose => true, :evals => ['']} }
95
+
96
+ it 'sets the verbose flag (currently unused)' do
97
+ expect(cli.verbose).to eq(true)
98
+ end
99
+ end
100
+
101
+ describe ':compile option' do
102
+ let(:options) { {:compile => true, :evals => ['puts 5']} }
103
+
104
+ it 'outputs the compiled javascript' do
105
+ expect_output_of{ subject.run }.to include(".$puts(5)")
106
+ expect_output_of{ subject.run }.not_to include("5\n")
107
+ end
108
+ end
109
+
110
+
111
+ describe ':load_paths options' do
112
+ let(:dir) { File.dirname(file) }
113
+ let(:filename) { File.basename(file) }
114
+ let(:options) { {:load_paths => [dir], :requires => [filename], :evals => ['']} }
115
+ it 'requires files' do
116
+ expect_output_of{ subject.run }.to eq("hi from opal!\n")
117
+ end
118
+ end
119
+
120
+ def expect_output_of
121
+ @output, _result = output_and_result_of { yield }
122
+ expect(@output)
123
+ end
124
+
125
+ def output_and_result_of
126
+ stdout = described_class.stdout
127
+ described_class.stdout = fake_stdout
128
+ result = yield
129
+ output = fake_stdout.tap(&:rewind).read
130
+ return output, result
131
+ ensure
132
+ described_class.stdout = stdout
133
+ end
134
+ end