opal 0.4.3 → 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (303) hide show
  1. data/.rspec +3 -0
  2. data/.travis.yml +0 -4
  3. data/README.md +6 -0
  4. data/Rakefile +30 -6
  5. data/bin/opal +6 -82
  6. data/corelib/{opal/array.rb → array.rb} +40 -56
  7. data/corelib/{opal/basic_object.rb → basic_object.rb} +2 -2
  8. data/corelib/{opal/boolean.rb → boolean.rb} +0 -8
  9. data/corelib/class.rb +47 -0
  10. data/corelib/{opal/comparable.rb → comparable.rb} +0 -0
  11. data/corelib/{opal/enumerable.rb → enumerable.rb} +208 -141
  12. data/corelib/{opal/enumerator.rb → enumerator.rb} +3 -3
  13. data/corelib/{opal/error.rb → error.rb} +1 -0
  14. data/corelib/{opal/hash.rb → hash.rb} +67 -56
  15. data/corelib/io.rb +39 -0
  16. data/corelib/{opal/kernel.rb → kernel.rb} +35 -31
  17. data/corelib/{opal/class.rb → module.rb} +29 -57
  18. data/corelib/native.rb +148 -0
  19. data/corelib/{opal/nil_class.rb → nil_class.rb} +2 -10
  20. data/corelib/{opal/numeric.rb → numeric.rb} +39 -14
  21. data/corelib/opal.rb +42 -25
  22. data/corelib/{opal/proc.rb → proc.rb} +3 -3
  23. data/corelib/{opal/range.rb → range.rb} +5 -1
  24. data/corelib/{opal/regexp.rb → regexp.rb} +0 -0
  25. data/corelib/{opal/runtime.js → runtime.js} +96 -188
  26. data/corelib/{opal/string.rb → string.rb} +20 -15
  27. data/corelib/struct.rb +139 -0
  28. data/corelib/{opal/time.rb → time.rb} +0 -0
  29. data/lib/opal.rb +4 -0
  30. data/lib/opal/cli.rb +79 -32
  31. data/lib/opal/cli_options.rb +91 -0
  32. data/lib/opal/erb.rb +41 -8
  33. data/lib/opal/grammar.rb +24 -10
  34. data/lib/opal/grammar.y +15 -4
  35. data/lib/opal/grammar_helpers.rb +4 -0
  36. data/lib/opal/lexer.rb +214 -143
  37. data/lib/opal/parser.rb +596 -562
  38. data/lib/opal/require_parser.rb +1 -1
  39. data/lib/opal/source_map.rb +15 -30
  40. data/lib/opal/target_scope.rb +24 -5
  41. data/lib/opal/version.rb +1 -1
  42. data/mri_spec/cli_spec.rb +18 -0
  43. data/mri_spec/fixtures/opal_file.rb +2 -0
  44. data/mri_spec/spec_helper.rb +17 -0
  45. data/opal.gemspec +5 -2
  46. data/spec/{rubyspec/filters → filters}/bugs/alias.rb +0 -0
  47. data/spec/{rubyspec/filters → filters}/bugs/ancestors.rb +0 -0
  48. data/spec/{rubyspec/filters → filters}/bugs/array.rb +0 -0
  49. data/spec/filters/bugs/array/combination.rb +11 -0
  50. data/spec/filters/bugs/array/count.rb +3 -0
  51. data/spec/filters/bugs/array/delete_if.rb +3 -0
  52. data/spec/filters/bugs/array/drop.rb +3 -0
  53. data/spec/filters/bugs/array/drop_while.rb +5 -0
  54. data/spec/filters/bugs/array/eql.rb +3 -0
  55. data/spec/filters/bugs/array/flatten.rb +9 -0
  56. data/spec/filters/bugs/array/minus.rb +5 -0
  57. data/spec/filters/bugs/array/multipliy.rb +9 -0
  58. data/spec/filters/bugs/array/new.rb +3 -0
  59. data/spec/filters/bugs/array/pop.rb +6 -0
  60. data/spec/filters/bugs/array/rassoc.rb +4 -0
  61. data/spec/filters/bugs/array/rindex.rb +6 -0
  62. data/spec/filters/bugs/array/select.rb +3 -0
  63. data/spec/filters/bugs/array/shift.rb +7 -0
  64. data/spec/filters/bugs/array/shuffle.rb +11 -0
  65. data/spec/filters/bugs/array/slice.rb +7 -0
  66. data/spec/filters/bugs/array/take.rb +3 -0
  67. data/spec/filters/bugs/array/to_a.rb +3 -0
  68. data/spec/filters/bugs/array/try_convert.rb +7 -0
  69. data/spec/filters/bugs/array/uniq.rb +10 -0
  70. data/spec/filters/bugs/array/zip.rb +4 -0
  71. data/spec/{rubyspec/filters → filters}/bugs/array_delete.rb +1 -0
  72. data/spec/{rubyspec/filters → filters}/bugs/array_fetch.rb +0 -0
  73. data/spec/{rubyspec/filters → filters}/bugs/array_first.rb +0 -0
  74. data/spec/{rubyspec/filters → filters}/bugs/array_flatten.rb +0 -0
  75. data/spec/{rubyspec/filters → filters}/bugs/array_intersection.rb +0 -0
  76. data/spec/{rubyspec/filters → filters}/bugs/array_join.rb +0 -0
  77. data/spec/{rubyspec/filters → filters}/bugs/break.rb +0 -0
  78. data/spec/filters/bugs/case.rb +4 -0
  79. data/spec/{rubyspec/filters → filters}/bugs/coerce_integer.rb +0 -0
  80. data/spec/filters/bugs/enumerable_sort_by.rb +3 -0
  81. data/spec/{rubyspec/filters → filters}/bugs/kernel/instance_variables.rb +0 -0
  82. data/spec/filters/bugs/kernel/rand.rb +4 -0
  83. data/spec/filters/bugs/language/array.rb +3 -0
  84. data/spec/filters/bugs/language/block.rb +6 -0
  85. data/spec/filters/bugs/language/break.rb +3 -0
  86. data/spec/{rubyspec/filters → filters}/bugs/language/class.rb +3 -0
  87. data/spec/{rubyspec/filters → filters}/bugs/language/class_variables.rb +0 -0
  88. data/spec/filters/bugs/language/def.rb +27 -0
  89. data/spec/filters/bugs/language/defined.rb +3 -0
  90. data/spec/filters/bugs/language/ensure.rb +4 -0
  91. data/spec/filters/bugs/language/execution.rb +4 -0
  92. data/spec/filters/bugs/language/for.rb +18 -0
  93. data/spec/filters/bugs/language/if.rb +13 -0
  94. data/spec/filters/bugs/language/loop.rb +4 -0
  95. data/spec/filters/bugs/language/metaclass.rb +14 -0
  96. data/spec/filters/bugs/language/module.rb +6 -0
  97. data/spec/filters/bugs/language/next.rb +3 -0
  98. data/spec/filters/bugs/language/or.rb +3 -0
  99. data/spec/filters/bugs/language/order.rb +4 -0
  100. data/spec/filters/bugs/language/precedence.rb +10 -0
  101. data/spec/filters/bugs/language/proc.rb +24 -0
  102. data/spec/filters/bugs/language/redo.rb +5 -0
  103. data/spec/filters/bugs/language/rescue.rb +9 -0
  104. data/spec/filters/bugs/language/retry.rb +5 -0
  105. data/spec/filters/bugs/language/send.rb +10 -0
  106. data/spec/filters/bugs/language/super.rb +9 -0
  107. data/spec/filters/bugs/language/until.rb +8 -0
  108. data/spec/filters/bugs/language/variables.rb +37 -0
  109. data/spec/filters/bugs/language/while.rb +6 -0
  110. data/spec/filters/bugs/language/yield.rb +5 -0
  111. data/spec/{rubyspec/filters → filters}/bugs/module/class_variables.rb +0 -0
  112. data/spec/filters/bugs/module/method_defined.rb +6 -0
  113. data/spec/filters/bugs/parser.rb +10 -0
  114. data/spec/{rubyspec/filters → filters}/bugs/public_methods.rb +1 -0
  115. data/spec/filters/bugs/return.rb +7 -0
  116. data/spec/filters/bugs/singleton/instance.rb +4 -0
  117. data/spec/filters/bugs/source_map.rb +3 -0
  118. data/spec/filters/bugs/string/center.rb +4 -0
  119. data/spec/filters/bugs/string/lines.rb +3 -0
  120. data/spec/{rubyspec/filters → filters}/mspec/mocks.rb +0 -0
  121. data/spec/{rubyspec/filters → filters}/mspec/ruby_exe.rb +0 -0
  122. data/spec/{rubyspec/filters → filters}/mspec/should_receive.rb +0 -0
  123. data/spec/{rubyspec/filters → filters}/parser/block_args.rb +0 -0
  124. data/spec/{rubyspec/filters → filters}/unsupported/array_subclasses.rb +1 -0
  125. data/spec/filters/unsupported/frozen.rb +32 -0
  126. data/spec/filters/unsupported/immutable_strings.rb +3 -0
  127. data/spec/filters/unsupported/tainted.rb +17 -0
  128. data/spec/filters/unsupported/trusted.rb +15 -0
  129. data/spec/opal/class/constants_spec.rb +7 -0
  130. data/spec/opal/erb/erb_spec.rb +7 -1
  131. data/spec/opal/erb/inline_block.opalerb +3 -0
  132. data/spec/opal/hash/allocate_spec.rb +16 -0
  133. data/spec/opal/hash/new_spec.rb +10 -0
  134. data/spec/opal/hash/to_s_spec.rb +9 -0
  135. data/spec/opal/kernel/instance_variable_defined_spec.rb +15 -0
  136. data/spec/opal/kernel/rand_spec.rb +5 -5
  137. data/spec/opal/kernel/respond_to_spec.rb +14 -1
  138. data/spec/opal/language/block_spec.rb +13 -0
  139. data/spec/opal/language/rescue_spec.rb +27 -0
  140. data/spec/opal/language/return_spec.rb +38 -0
  141. data/spec/opal/language/singleton_class_spec.rb +13 -0
  142. data/spec/opal/language/super_spec.rb +99 -0
  143. data/spec/opal/language/variables_spec.rb +20 -0
  144. data/spec/opal/module/attr_accessor_spec.rb +8 -0
  145. data/spec/opal/module/constants_spec.rb +2 -2
  146. data/spec/opal/native/alias_native_spec.rb +18 -0
  147. data/spec/opal/native/each_spec.rb +14 -0
  148. data/spec/opal/native/element_reference_spec.rb +14 -0
  149. data/spec/opal/native/method_missing_spec.rb +39 -0
  150. data/spec/opal/native/new_spec.rb +19 -0
  151. data/spec/opal/native/nil_spec.rb +14 -0
  152. data/spec/opal/runtime2/class_hierarchy_spec.rb +2 -2
  153. data/spec/opal/source_map_spec.rb +3 -7
  154. data/spec/ospec/main.rb.erb +2 -5
  155. data/spec/parser/alias_spec.rb +4 -4
  156. data/spec/parser/and_spec.rb +2 -2
  157. data/spec/parser/array_spec.rb +6 -6
  158. data/spec/parser/attrasgn_spec.rb +8 -8
  159. data/spec/parser/begin_spec.rb +11 -11
  160. data/spec/parser/block_spec.rb +3 -3
  161. data/spec/parser/break_spec.rb +4 -4
  162. data/spec/parser/call_spec.rb +50 -48
  163. data/spec/parser/class_spec.rb +2 -2
  164. data/spec/parser/const_spec.rb +1 -1
  165. data/spec/parser/cvar_spec.rb +1 -1
  166. data/spec/parser/def_spec.rb +5 -5
  167. data/spec/parser/gvar_spec.rb +2 -2
  168. data/spec/parser/hash_spec.rb +4 -4
  169. data/spec/parser/iasgn_spec.rb +3 -3
  170. data/spec/parser/if_spec.rb +6 -6
  171. data/spec/parser/iter_spec.rb +6 -6
  172. data/spec/parser/lambda_spec.rb +5 -5
  173. data/spec/parser/lasgn_spec.rb +2 -2
  174. data/spec/parser/line_spec.rb +2 -2
  175. data/spec/parser/lvar_spec.rb +5 -5
  176. data/spec/parser/masgn_spec.rb +1 -1
  177. data/spec/parser/module_spec.rb +2 -2
  178. data/spec/parser/not_spec.rb +4 -4
  179. data/spec/parser/op_asgn1_spec.rb +2 -2
  180. data/spec/parser/op_asgn2_spec.rb +2 -2
  181. data/spec/parser/or_spec.rb +2 -2
  182. data/spec/parser/parse_spec.rb +66 -0
  183. data/spec/parser/parser_spec.rb +32 -38
  184. data/spec/parser/regexp_spec.rb +4 -4
  185. data/spec/parser/return_spec.rb +4 -4
  186. data/spec/parser/sclass_spec.rb +4 -4
  187. data/spec/parser/str_spec.rb +3 -3
  188. data/spec/parser/super_spec.rb +6 -6
  189. data/spec/parser/undef_spec.rb +3 -3
  190. data/spec/parser/unless_spec.rb +4 -4
  191. data/spec/parser/while_spec.rb +3 -3
  192. data/spec/parser/xstr_spec.rb +3 -3
  193. data/spec/parser/yield_spec.rb +6 -6
  194. data/spec/rubyspec/core/array/drop_spec.rb +1 -1
  195. data/spec/rubyspec/core/array/keep_if_spec.rb +1 -3
  196. data/spec/rubyspec/core/array/length_spec.rb +1 -3
  197. data/spec/rubyspec/core/array/map_spec.rb +2 -6
  198. data/spec/rubyspec/core/array/minus_spec.rb +3 -3
  199. data/spec/rubyspec/core/array/multiply_spec.rb +14 -16
  200. data/spec/rubyspec/core/array/new_spec.rb +3 -5
  201. data/spec/rubyspec/core/array/plus_spec.rb +2 -2
  202. data/spec/rubyspec/core/array/pop_spec.rb +4 -4
  203. data/spec/rubyspec/core/array/rassoc_spec.rb +2 -2
  204. data/spec/rubyspec/core/array/reject_spec.rb +2 -6
  205. data/spec/rubyspec/core/array/replace_spec.rb +1 -3
  206. data/spec/rubyspec/core/array/reverse_each_spec.rb +1 -3
  207. data/spec/rubyspec/core/array/reverse_spec.rb +4 -4
  208. data/spec/rubyspec/core/array/rindex_spec.rb +1 -1
  209. data/spec/rubyspec/core/array/select_spec.rb +3 -7
  210. data/spec/rubyspec/core/array/shared/collect.rb +7 -0
  211. data/spec/rubyspec/core/array/shared/index.rb +1 -1
  212. data/spec/rubyspec/core/array/shared/keep_if.rb +3 -0
  213. data/spec/rubyspec/core/array/shared/length.rb +3 -0
  214. data/spec/rubyspec/core/array/shared/replace.rb +3 -0
  215. data/spec/rubyspec/core/array/shared/slice.rb +3 -0
  216. data/spec/rubyspec/core/array/shuffle_spec.rb +1 -1
  217. data/spec/rubyspec/core/array/size_spec.rb +1 -3
  218. data/spec/rubyspec/core/array/slice_spec.rb +4 -6
  219. data/spec/rubyspec/core/array/sort_spec.rb +2 -2
  220. data/spec/rubyspec/core/array/to_a_spec.rb +1 -1
  221. data/spec/rubyspec/core/array/try_convert_spec.rb +7 -7
  222. data/spec/rubyspec/core/array/uniq_spec.rb +7 -7
  223. data/spec/rubyspec/core/array/zip_spec.rb +1 -1
  224. data/spec/rubyspec/core/enumerable/collect_spec.rb +24 -0
  225. data/spec/rubyspec/core/enumerable/count_spec.rb +35 -19
  226. data/spec/rubyspec/core/enumerable/find_spec.rb +5 -0
  227. data/spec/rubyspec/core/hash/each_pair_spec.rb +7 -7
  228. data/spec/rubyspec/core/hash/each_spec.rb +13 -7
  229. data/spec/rubyspec/core/module/method_defined_spec.rb +4 -4
  230. data/spec/rubyspec/core/module/public_method_defined_spec.rb +19 -0
  231. data/spec/rubyspec/core/module/remove_const_spec.rb +23 -0
  232. data/spec/rubyspec/core/numeric/step_spec.rb +14 -0
  233. data/spec/rubyspec/core/string/center_spec.rb +43 -65
  234. data/spec/rubyspec/core/string/lines_spec.rb +1 -1
  235. data/spec/rubyspec/core/string/ljust_spec.rb +25 -9
  236. data/spec/rubyspec/core/string/rjust_spec.rb +26 -10
  237. data/spec/rubyspec/core/struct/fixtures/classes.rb +26 -0
  238. data/spec/rubyspec/core/struct/initialize_spec.rb +11 -0
  239. data/spec/rubyspec/core/struct/new_spec.rb +24 -0
  240. data/spec/rubyspec/fixtures/constants.rb +7 -0
  241. data/spec/rubyspec/language/break_spec.rb +1 -1
  242. data/spec/rubyspec/language/case_spec.rb +30 -30
  243. data/spec/rubyspec/language/def_spec.rb +34 -34
  244. data/spec/rubyspec/language/defined_spec.rb +2 -2
  245. data/spec/rubyspec/language/ensure_spec.rb +2 -2
  246. data/spec/rubyspec/language/execution_spec.rb +2 -2
  247. data/spec/rubyspec/language/for_spec.rb +17 -17
  248. data/spec/rubyspec/language/hash_spec.rb +3 -3
  249. data/spec/rubyspec/language/if_spec.rb +11 -11
  250. data/spec/rubyspec/language/loop_spec.rb +3 -3
  251. data/spec/rubyspec/language/metaclass_spec.rb +14 -14
  252. data/spec/rubyspec/language/module_spec.rb +6 -6
  253. data/spec/rubyspec/language/next_spec.rb +5 -5
  254. data/spec/rubyspec/language/not_spec.rb +1 -1
  255. data/spec/rubyspec/language/or_spec.rb +1 -1
  256. data/spec/rubyspec/language/order_spec.rb +3 -5
  257. data/spec/rubyspec/language/precedence_spec.rb +19 -19
  258. data/spec/rubyspec/language/proc_spec.rb +29 -29
  259. data/spec/rubyspec/language/redo_spec.rb +3 -5
  260. data/spec/rubyspec/language/rescue_spec.rb +7 -7
  261. data/spec/rubyspec/language/retry_spec.rb +2 -2
  262. data/spec/rubyspec/language/return_spec.rb +12 -12
  263. data/spec/rubyspec/language/send_spec.rb +9 -9
  264. data/spec/rubyspec/language/singleton_class_spec.rb +3 -4
  265. data/spec/rubyspec/language/super_spec.rb +7 -11
  266. data/spec/rubyspec/language/until_spec.rb +10 -10
  267. data/spec/rubyspec/language/variables_spec.rb +59 -67
  268. data/spec/rubyspec/language/versions/array_1.9.rb +1 -1
  269. data/spec/rubyspec/language/versions/block_1.9.rb +0 -0
  270. data/spec/rubyspec/language/versions/break_1.9.rb +0 -0
  271. data/spec/rubyspec/language/versions/literal_lambda_1.9.rb +12 -12
  272. data/spec/rubyspec/language/versions/send_1.9.rb +23 -23
  273. data/spec/rubyspec/language/versions/symbol_1.9.rb +2 -2
  274. data/spec/rubyspec/language/versions/variables_1.9.rb +1 -1
  275. data/spec/rubyspec/language/while_spec.rb +4 -4
  276. data/spec/rubyspec/language/yield_spec.rb +3 -3
  277. data/spec/rubyspec/library/erb/util/html_escape_spec.rb +10 -0
  278. data/spec/rubyspec/library/singleton/clone_spec.rb +8 -0
  279. data/spec/rubyspec/library/singleton/dup_spec.rb +8 -0
  280. data/spec/rubyspec/library/singleton/fixtures/classes.rb +18 -0
  281. data/spec/rubyspec/library/singleton/instance_spec.rb +30 -0
  282. data/spec/spec_helper.rb +214 -0
  283. data/stdlib/buffer.rb +40 -0
  284. data/stdlib/buffer/array.rb +66 -0
  285. data/stdlib/buffer/view.rb +70 -0
  286. data/stdlib/erb.rb +11 -20
  287. data/stdlib/forwardable.rb +71 -0
  288. data/stdlib/json.rb +78 -0
  289. data/stdlib/ostruct.rb +69 -0
  290. data/stdlib/rbconfig.rb +1 -0
  291. data/stdlib/singleton.rb +40 -0
  292. data/stdlib/stringio.rb +173 -0
  293. data/stdlib/template.rb +44 -0
  294. metadata +285 -79
  295. data/corelib/opal/native.rb +0 -31
  296. data/spec/opal/class/bridge_class_spec.rb +0 -39
  297. data/spec/opal/native_spec.rb +0 -209
  298. data/spec/ospec/runner.rb +0 -223
  299. data/spec/rubyspec/filters/bugs/block_args.rb +0 -3
  300. data/spec/rubyspec/filters/bugs/case.rb +0 -8
  301. data/spec/rubyspec/filters/bugs/language/module.rb +0 -3
  302. data/spec/rubyspec/filters/unsupported/frozen.rb +0 -4
  303. data/spec/rubyspec/filters/unsupported/tainted.rb +0 -7
@@ -14,7 +14,7 @@ describe "Array literals" do
14
14
  end
15
15
 
16
16
  describe "The unpacking splat operator (*)" do
17
- pending "when applied to a non-Array value attempts to coerce it to Array if the object respond_to?(:to_a)" do
17
+ it "when applied to a non-Array value attempts to coerce it to Array if the object respond_to?(:to_a)" do
18
18
  obj = mock("pseudo-array")
19
19
  obj.should_receive(:to_a).and_return([2, 3, 4])
20
20
  [1, *obj].should == [1, 2, 3, 4]
File without changes
File without changes
@@ -34,7 +34,7 @@ describe "->(){}" do
34
34
  "1+2=#{->{ 1 + 2}.call}".should == "1+2=3"
35
35
  end
36
36
 
37
- pending "can be be used as a Hash key" do
37
+ it "can be be used as a Hash key" do
38
38
  h = new_hash
39
39
  # h[->(one=1){ one + 2}.call] = :value
40
40
  h.key?(3).should be_true
@@ -71,51 +71,51 @@ describe "->(){}" do
71
71
  ->(a,b) {[a, b]}.call(:sym, :bol).should == [:sym, :bol]
72
72
  end
73
73
 
74
- pending "accepts parameters with default parameters between the parenthesis" do
74
+ it "accepts parameters with default parameters between the parenthesis" do
75
75
  # lambda { ->(a=1) {} }.should_not raise_error(SyntaxError)
76
76
  # lambda { ->(x=1, b=[]) {} }.should_not raise_error(SyntaxError)
77
77
  end
78
78
 
79
- pending "aliases each argument with a default value to the corresponding parameter" do
79
+ it "aliases each argument with a default value to the corresponding parameter" do
80
80
  # ->(a=:cymbal) {a}.call(:sym).should == :sym
81
81
  # ->(a,b=:cymbal) {[a, b]}.call(:sym, :bol).should == [:sym, :bol]
82
82
  end
83
83
 
84
- pending "sets arguments to their default value if one wasn't supplied" do
84
+ it "sets arguments to their default value if one wasn't supplied" do
85
85
  # ->(a=:cymbal) {a}.call.should == :cymbal
86
86
  # ->(a,b=:cymbal) {[a, b]}.call(:sym).should == [:sym, :cymbal]
87
87
  end
88
88
 
89
- pending "accepts a parameter prefixed with an asterisk between the parenthesis" do
89
+ it "accepts a parameter prefixed with an asterisk between the parenthesis" do
90
90
  # lambda { ->(*a) {} }.should_not raise_error(SyntaxError)
91
91
  # lambda { ->(x, *a) {} }.should_not raise_error(SyntaxError)
92
92
  end
93
93
 
94
- pending "assigns all remaining arguments to the variable in the parameter list prefixed with an asterisk, if one exists" do
94
+ it "assigns all remaining arguments to the variable in the parameter list prefixed with an asterisk, if one exists" do
95
95
  # ->(*a) {a}.call(:per, :cus, :si, :on).should == [:per, :cus, :si, :on]
96
96
  # ->(a,*b) {b}.call(:per, :cus, :si, :on).should == [:cus, :si, :on]
97
97
  end
98
98
 
99
- pending "accepts a parameter prefixed with an ampersand between the parenthesis" do
99
+ it "accepts a parameter prefixed with an ampersand between the parenthesis" do
100
100
  # lambda { ->(&a) {} }.should_not raise_error(SyntaxError)
101
101
  # lambda { ->(x, &a) {} }.should_not raise_error(SyntaxError)
102
102
  end
103
103
 
104
- pending "assigns the given block to the parameter prefixed with an ampersand if such a parameter exists" do
104
+ it "assigns the given block to the parameter prefixed with an ampersand if such a parameter exists" do
105
105
  # l = ->(&a) { a }.call { :foo }
106
106
  l.call.should == :foo
107
107
  end
108
108
 
109
- pending "assigns nil to the parameter prefixed with an ampersand unless a block was supplied" do
109
+ it "assigns nil to the parameter prefixed with an ampersand unless a block was supplied" do
110
110
  # ->(&a) { a }.call.should be_nil
111
111
  end
112
112
 
113
- pending "accepts a combination of argument types between the parenthesis" do
113
+ it "accepts a combination of argument types between the parenthesis" do
114
114
  # lambda { ->(x, y={}, z = Object.new, *a, &b) {} }.
115
115
  should_not raise_error(SyntaxError)
116
116
  end
117
117
 
118
- pending "sets parameters appropriately when a combination of parameter types is given between the parenthesis" do
118
+ it "sets parameters appropriately when a combination of parameter types is given between the parenthesis" do
119
119
  # l = ->(x, y={}, z = Object.new, *a, &b) { [x,y,z,a,b]}
120
120
  l.call(1, [], [], 30, 40).should == [1, [], [], [30, 40], nil]
121
121
  block = lambda { :lamb }
@@ -124,7 +124,7 @@ describe "->(){}" do
124
124
  l2.call(:x).should == [:x, {}, []]
125
125
  end
126
126
 
127
- pending "uses lambda's 'rigid' argument handling" do
127
+ it "uses lambda's 'rigid' argument handling" do
128
128
  ->(a, b){}.parameters.first.first.should == :req
129
129
  ->(a, b){}.parameters.last.first.should == :req
130
130
  lambda { ->(a, b){}.call 1 }.should raise_error(ArgumentError)
@@ -7,7 +7,7 @@ specs = LangSendSpecs
7
7
 
8
8
  describe "Invoking a method" do
9
9
  describe "with required args after the rest arguments" do
10
- pending "binds the required arguments first" do
10
+ it "binds the required arguments first" do
11
11
  specs.fooM0RQ1(1).should == [[], 1]
12
12
  specs.fooM0RQ1(1,2).should == [[1], 2]
13
13
  specs.fooM0RQ1(1,2,3).should == [[1,2], 3]
@@ -27,7 +27,7 @@ describe "Invoking a method" do
27
27
  end
28
28
 
29
29
  describe "with manditory arguments after optional arguments" do
30
- pending "binds the required arguments first" do
30
+ it "binds the required arguments first" do
31
31
  specs.fooO1Q1(0,1).should == [0,1]
32
32
  specs.fooO1Q1(2).should == [1,2]
33
33
 
@@ -54,7 +54,7 @@ describe "Invoking a method" do
54
54
  end
55
55
  end
56
56
 
57
- pending "with .() invokes #call" do
57
+ it "with .() invokes #call" do
58
58
  q = proc { |z| z }
59
59
  q.(1).should == 1
60
60
 
@@ -63,11 +63,11 @@ describe "Invoking a method" do
63
63
  obj.().should == :called
64
64
  end
65
65
 
66
- pending "allows a vestigial trailing ',' in the arguments" do
66
+ it "allows a vestigial trailing ',' in the arguments" do
67
67
  # specs.fooM1(1,).should == [1]
68
68
  end
69
69
 
70
- pending "with splat operator attempts to coerce it to an Array if the object respond_to?(:to_a)" do
70
+ it "with splat operator attempts to coerce it to an Array if the object respond_to?(:to_a)" do
71
71
  ary = [2,3,4]
72
72
  obj = mock("to_a")
73
73
  obj.should_receive(:to_a).and_return(ary).twice
@@ -75,7 +75,7 @@ describe "Invoking a method" do
75
75
  specs.fooM1R(1,*obj).should == [1, ary]
76
76
  end
77
77
 
78
- pending "with splat operator * and non-Array value uses value unchanged if it does not respond_to?(:to_ary)" do
78
+ it "with splat operator * and non-Array value uses value unchanged if it does not respond_to?(:to_ary)" do
79
79
  obj = Object.new
80
80
  obj.should_not respond_to(:to_a)
81
81
 
@@ -89,44 +89,44 @@ describe "Invoking a method" do
89
89
  specs.fooM4(0,*a,3).should == [0,1,2,3]
90
90
  end
91
91
 
92
- pending "accepts final explicit literal Hash arguments after the splat" do
92
+ it "accepts final explicit literal Hash arguments after the splat" do
93
93
  a = [1, 2]
94
94
  specs.fooM0RQ1(*a, { :a => 1 }).should == [[1, 2], { :a => 1 }]
95
95
  end
96
96
 
97
- pending "accepts final implicit literal Hash arguments after the splat" do
97
+ it "accepts final implicit literal Hash arguments after the splat" do
98
98
  a = [1, 2]
99
99
  specs.fooM0RQ1(*a, :a => 1).should == [[1, 2], { :a => 1 }]
100
100
  end
101
101
 
102
- pending "accepts final Hash arguments after the splat" do
102
+ it "accepts final Hash arguments after the splat" do
103
103
  a = [1, 2]
104
104
  b = { :a => 1 }
105
105
  specs.fooM0RQ1(*a, b).should == [[1, 2], { :a => 1 }]
106
106
  end
107
107
 
108
- pending "accepts mandatory and explicit literal Hash arguments after the splat" do
108
+ it "accepts mandatory and explicit literal Hash arguments after the splat" do
109
109
  a = [1, 2]
110
110
  specs.fooM0RQ2(*a, 3, { :a => 1 }).should == [[1, 2], 3, { :a => 1 }]
111
111
  end
112
112
 
113
- pending "accepts mandatory and implicit literal Hash arguments after the splat" do
113
+ it "accepts mandatory and implicit literal Hash arguments after the splat" do
114
114
  a = [1, 2]
115
115
  specs.fooM0RQ2(*a, 3, :a => 1).should == [[1, 2], 3, { :a => 1 }]
116
116
  end
117
117
 
118
- pending "accepts mandatory and Hash arguments after the splat" do
118
+ it "accepts mandatory and Hash arguments after the splat" do
119
119
  a = [1, 2]
120
120
  b = { :a => 1 }
121
121
  specs.fooM0RQ2(*a, 3, b).should == [[1, 2], 3, { :a => 1 }]
122
122
  end
123
123
 
124
- pending "converts a final splatted explicit Hash to an Array" do
124
+ it "converts a final splatted explicit Hash to an Array" do
125
125
  a = [1, 2]
126
126
  specs.fooR(*a, 3, *{ :a => 1 }).should == [1, 2, 3, [:a, 1]]
127
127
  end
128
128
 
129
- pending "calls #to_a to convert a final splatted Hash object to an Array" do
129
+ it "calls #to_a to convert a final splatted Hash object to an Array" do
130
130
  a = [1, 2]
131
131
  b = { :a => 1 }
132
132
  b.should_receive(:to_a).and_return([:a, 1])
@@ -134,7 +134,7 @@ describe "Invoking a method" do
134
134
  specs.fooR(*a, 3, *b).should == [1, 2, 3, :a, 1]
135
135
  end
136
136
 
137
- pending "accepts multiple splat expansions in the same argument list" do
137
+ it "accepts multiple splat expansions in the same argument list" do
138
138
  a = [1,2,3]
139
139
  b = 7
140
140
  c = mock("pseudo-array")
@@ -146,19 +146,19 @@ describe "Invoking a method" do
146
146
  specs.rest_len(0,*a,4,*5,6,7,*c,-1).should == 11
147
147
  end
148
148
 
149
- pending "expands an array to arguments grouped in parentheses" do
149
+ it "expands an array to arguments grouped in parentheses" do
150
150
  specs.destructure2([40,2]).should == 42
151
151
  end
152
152
 
153
- pending "expands an array to arguments grouped in parentheses and ignores any rest arguments in the array" do
153
+ it "expands an array to arguments grouped in parentheses and ignores any rest arguments in the array" do
154
154
  specs.destructure2([40,2,84]).should == 42
155
155
  end
156
156
 
157
- pending "expands an array to arguments grouped in parentheses and sets not specified arguments to nil" do
157
+ it "expands an array to arguments grouped in parentheses and sets not specified arguments to nil" do
158
158
  specs.destructure2b([42]).should == [42, nil]
159
159
  end
160
160
 
161
- pending "expands an array to arguments grouped in parentheses which in turn takes rest arguments" do
161
+ it "expands an array to arguments grouped in parentheses which in turn takes rest arguments" do
162
162
  specs.destructure4r([1, 2, 3]).should == [1, 2, [], 3, nil]
163
163
  specs.destructure4r([1, 2, 3, 4]).should == [1, 2, [], 3, 4]
164
164
  specs.destructure4r([1, 2, 3, 4, 5]).should == [1, 2, [3], 4, 5]
@@ -176,7 +176,7 @@ describe "Invoking a method" do
176
176
  [{ :rbx => 'cool', :specs => :fail_sometimes, :non_sym => 1234 }]
177
177
  end
178
178
 
179
- pending "handles a hanging comma without curly braces" do
179
+ it "handles a hanging comma without curly braces" do
180
180
  # specs.fooM1(abc: 123,).should == [{:abc => 123}]
181
181
  # specs.fooM1(rbx: 'cool', specs: :fail_sometimes, non_sym: 1234,).should ==
182
182
  # [{ :rbx => 'cool', :specs => :fail_sometimes, :non_sym => 1234 }]
@@ -194,7 +194,7 @@ describe "Invoking a method" do
194
194
  ['abc', 123, { :rbx => 'cool', :specs => :fail_sometimes, :non_sym => 1234 }]
195
195
  end
196
196
 
197
- pending "handles a hanging comma without curly braces" do
197
+ it "handles a hanging comma without curly braces" do
198
198
  # specs.fooM3('abc', 123, abc: 123,).should == ['abc', 123, {:abc => 123}]
199
199
  # specs.fooM3('abc', 123, rbx: 'cool', specs: :fail_sometimes, non_sym: 1234,).should ==
200
200
  # ['abc', 123, { :rbx => 'cool', :specs => :fail_sometimes, :non_sym => 1234 }]
@@ -214,7 +214,7 @@ describe "Invoking a method" do
214
214
  [{ :rbx => 'cool', :specs => :fail_sometimes, :non_sym => 1234 }]
215
215
  end
216
216
 
217
- pending "handles a hanging comma without curly braces" do
217
+ it "handles a hanging comma without curly braces" do
218
218
  # specs.fooM1(rbx: 'cool', specs: :fail_sometimes, :non_sym => 1234,).should ==
219
219
  # [{ :rbx => 'cool', :specs => :fail_sometimes, :non_sym => 1234 }]
220
220
  end
@@ -231,7 +231,7 @@ describe "Invoking a method" do
231
231
  ['abc', 123, { :rbx => 'cool', :specs => :fail_sometimes, :non_sym => 1234 }]
232
232
  end
233
233
 
234
- pending "handles a hanging comma without curly braces" do
234
+ it "handles a hanging comma without curly braces" do
235
235
  # specs.fooM3('abc', 123, rbx: 'cool', specs: :fail_sometimes, :non_sym => 1234,).should ==
236
236
  # ['abc', 123, { :rbx => 'cool', :specs => :fail_sometimes, :non_sym => 1234 }]
237
237
  end
@@ -1,12 +1,12 @@
1
1
  describe "A Symbol literal" do
2
- pending "can be an empty string" do
2
+ it "can be an empty string" do
3
3
  c = :''
4
4
  c.should be_kind_of(Symbol)
5
5
  c.inspect.should == ':""'
6
6
  end
7
7
 
8
8
  # These weren't allowed on 1.8
9
- pending "can be :!, :!=, or :!~" do
9
+ it "can be :!, :!=, or :!~" do
10
10
  %w{'!', '!=', '!~'}.each do |sym|
11
11
  lambda { sym.to_sym }.should_not raise_error(SyntaxError)
12
12
  sym.to_sym.to_s.should == sym
@@ -1,5 +1,5 @@
1
1
  describe "Multiple assignments with splats" do
2
- pending "* on the LHS has to be applied to any parameter" do
2
+ it "* on the LHS has to be applied to any parameter" do
3
3
  # a, *b, c = 1, 2, 3
4
4
  a.should == 1
5
5
  b.should == [2]
@@ -196,7 +196,7 @@ describe "The while modifier with begin .. end block" do
196
196
  (begin; break; end while true).should == nil
197
197
  end
198
198
 
199
- pending "runs block at least once (even if the expression is false)" do
199
+ it "runs block at least once (even if the expression is false)" do
200
200
  i = 0
201
201
  begin
202
202
  i += 1
@@ -205,7 +205,7 @@ describe "The while modifier with begin .. end block" do
205
205
  i.should == 1
206
206
  end
207
207
 
208
- pending "evaluates condition after block execution" do
208
+ it "evaluates condition after block execution" do
209
209
  a = []
210
210
  i = 0
211
211
  begin
@@ -214,7 +214,7 @@ describe "The while modifier with begin .. end block" do
214
214
  a.should == [0, 1, 2, 3, 4]
215
215
  end
216
216
 
217
- pending "skips to end of body with next" do
217
+ it "skips to end of body with next" do
218
218
  a = []
219
219
  i = 0
220
220
  begin
@@ -224,7 +224,7 @@ describe "The while modifier with begin .. end block" do
224
224
  a.should == [0, 1, 2, 4]
225
225
  end
226
226
 
227
- pending "restarts the current iteration without reevaluting condition with redo" do
227
+ it "restarts the current iteration without reevaluting condition with redo" do
228
228
  a = []
229
229
  i = 0
230
230
  j = 0
@@ -16,7 +16,7 @@ describe "The yield call" do
16
16
  lambda { @y.z }.should raise_error(LocalJumpError)
17
17
  end
18
18
 
19
- pending "ignores assignment to the explicit block argument and calls the passed block" do
19
+ it "ignores assignment to the explicit block argument and calls the passed block" do
20
20
  @y.ze { 42 }.should == 42
21
21
  end
22
22
  end
@@ -87,7 +87,7 @@ describe "The yield call" do
87
87
  end
88
88
 
89
89
  ruby_version_is "1.9" do
90
- pending "passes no values when give nil as an argument" do
90
+ it "passes no values when give nil as an argument" do
91
91
  @y.r(nil) { |*a| a }.should == []
92
92
  end
93
93
  end
@@ -120,7 +120,7 @@ describe "The yield call" do
120
120
  end
121
121
 
122
122
  ruby_version_is "1.9" do
123
- pending "does not pass an argument value if the splatted argument is nil" do
123
+ it "does not pass an argument value if the splatted argument is nil" do
124
124
  @y.rs(1, 2, nil) { |*a| a }.should == [1, 2]
125
125
  end
126
126
  end
@@ -0,0 +1,10 @@
1
+ require 'erb'
2
+ require File.expand_path('../../../../spec_helper', __FILE__)
3
+
4
+ describe "ERB::Util.html_escape" do
5
+ it "escape (& < > \" ') to (&amp; &lt; &gt; &quot; &#39;)" do
6
+ input = '& < > " \''
7
+ expected = '&amp; &lt; &gt; &quot; &#39;'
8
+ ERB::Util.html_escape(input).should == expected
9
+ end
10
+ end
@@ -0,0 +1,8 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+ require File.expand_path('../fixtures/classes', __FILE__)
3
+
4
+ describe "Singleton#clone" do
5
+ it "is prevented" do
6
+ lambda { SingletonSpecs::MyClass.instance.clone }.should raise_error(TypeError)
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+ require File.expand_path('../fixtures/classes', __FILE__)
3
+
4
+ describe "Singleton#dup" do
5
+ it "is prevented" do
6
+ lambda { SingletonSpecs::MyClass.instance.dup }.should raise_error(TypeError)
7
+ end
8
+ end
@@ -0,0 +1,18 @@
1
+ require 'singleton'
2
+
3
+ module SingletonSpecs
4
+ class MyClass
5
+ attr_accessor :data
6
+ include Singleton
7
+ end
8
+
9
+ class NewSpec
10
+ include Singleton
11
+ end
12
+
13
+ class MyClassChild < MyClass
14
+ end
15
+
16
+ class NotInstantiated < MyClass
17
+ end
18
+ end
@@ -0,0 +1,30 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+ require File.expand_path('../fixtures/classes', __FILE__)
3
+
4
+ describe "Singleton.instance" do
5
+ it "returns an instance of the singleton class" do
6
+ SingletonSpecs::MyClass.instance.should be_kind_of(SingletonSpecs::MyClass)
7
+ end
8
+
9
+ it "returns the same instance for multiple calls to instance" do
10
+ SingletonSpecs::MyClass.instance.should equal(SingletonSpecs::MyClass.instance)
11
+ end
12
+
13
+ it "returns an instance of the singleton's subclasses" do
14
+ SingletonSpecs::MyClassChild.instance.should be_kind_of(SingletonSpecs::MyClassChild)
15
+ end
16
+
17
+ it "returns the same instance for multiple class to instance on subclasses" do
18
+ SingletonSpecs::MyClassChild.instance.should equal(SingletonSpecs::MyClassChild.instance)
19
+ end
20
+
21
+ it "returns an instance of the singleton's clone" do
22
+ klone = SingletonSpecs::MyClassChild.clone
23
+ klone.instance.should be_kind_of(klone)
24
+ end
25
+
26
+ it "returns the same instance for multiple class to instance on clones" do
27
+ klone = SingletonSpecs::MyClassChild.clone
28
+ klone.instance.should equal(klone.instance)
29
+ end
30
+ end
data/spec/spec_helper.rb CHANGED
@@ -0,0 +1,214 @@
1
+ require 'opal'
2
+ require 'opal-parser'
3
+ require 'mspec'
4
+
5
+ ENV['MSPEC_RUNNER'] = true
6
+
7
+ class OSpecFilter
8
+ def self.main
9
+ @main ||= self.new
10
+ end
11
+
12
+ def initialize
13
+ @filters = {}
14
+ end
15
+
16
+ def register
17
+ MSpec.register :exclude, self
18
+ end
19
+
20
+ def ===(description)
21
+ @filters.has_key? description
22
+ end
23
+
24
+ def register_filters(description, block)
25
+ instance_eval(&block)
26
+ end
27
+
28
+ def fails(description)
29
+ @filters[description] = true
30
+ end
31
+ end
32
+
33
+ class Object
34
+ def opal_filter(description, &block)
35
+ OSpecFilter.main.register_filters(description, block)
36
+ end
37
+ end
38
+
39
+ class PhantomFormatter
40
+ def initialize(out=nil)
41
+ @exception = @failure = false
42
+ @exceptions = []
43
+ @count = 0
44
+ @examples = 0
45
+
46
+ @current_state = nil
47
+ end
48
+
49
+ def register
50
+ MSpec.register :exception, self
51
+ MSpec.register :before, self
52
+ MSpec.register :after, self
53
+ MSpec.register :start, self
54
+ MSpec.register :finish, self
55
+ MSpec.register :abort, self
56
+ MSpec.register :enter, self
57
+ end
58
+
59
+ def green(str)
60
+ `console.log('\\033[32m' + str + '\\033[0m')`
61
+ end
62
+
63
+ def red(str)
64
+ `console.log('\\033[31m' + str + '\\033[0m')`
65
+ end
66
+
67
+ def log(str)
68
+ `console.log(str)`
69
+ end
70
+
71
+ def exception?
72
+ @exception
73
+ end
74
+
75
+ def failure?
76
+ @failure
77
+ end
78
+
79
+ def enter(describe); end
80
+
81
+ def before(state=nil)
82
+ @current_state = nil
83
+ @failure = @exception = false
84
+ end
85
+
86
+ def exception(exception)
87
+ @count += 1
88
+ @failure = @exception ? @failure && exception.failure? : exception.failure?
89
+ @exception = true
90
+ @exceptions << exception
91
+ end
92
+
93
+ def after(state = nil)
94
+ @current_state = nil
95
+ @examples += 1
96
+ end
97
+
98
+ def start
99
+ @start_time = Time.now.to_f
100
+ end
101
+
102
+ def finish
103
+ time = Time.now.to_f - @start_time
104
+
105
+ if @exceptions.empty?
106
+ log "\nFinished"
107
+ green "#{@examples} examples, #{@count} failures (time taken: #{time})"
108
+
109
+ finish_with_code 0
110
+ else
111
+ log "\nFailures:"
112
+
113
+ @exceptions.each_with_index do |exception, idx|
114
+ log "\n #{idx + 1}. #{exception.description}"
115
+ red "\n #{exception.message}"
116
+ end
117
+
118
+ log "\nFinished"
119
+ red "#{@examples} examples, #{@count} failures (time taken: #{time})"
120
+
121
+ finish_with_code(1)
122
+ end
123
+ end
124
+
125
+ def finish_with_code(code)
126
+ %x{
127
+ if (typeof(phantom) !== 'undefined') {
128
+ return phantom.exit(code);
129
+ }
130
+ else {
131
+ window.OPAL_SPEC_CODE = code;
132
+ }
133
+ }
134
+ end
135
+ end
136
+
137
+ class File
138
+ def self.expand_path(*a); nil; end
139
+ end
140
+
141
+ class ExceptionState
142
+ def initialize(state, location, exception)
143
+ @exception = exception
144
+
145
+ @description = location ? ["An exception occurred during: #{location}"] : []
146
+ if state
147
+ @description << "\n" unless @description.empty?
148
+ @description << state.description
149
+ @describe = state.describe
150
+ @it = state.it
151
+ @description = @description.join ""
152
+ else
153
+ @describe = @it = ""
154
+ end
155
+ end
156
+ end
157
+
158
+ module Kernel
159
+ def opal_parse(str, file='(string)')
160
+ Opal::Grammar.new.parse str, file
161
+ end
162
+
163
+ def opal_eval_compiled(javascript)
164
+ `eval(javascript)`
165
+ end
166
+
167
+ def eval(str)
168
+ code = Opal::Parser.new.parse str
169
+ `eval(#{code})`
170
+ end
171
+
172
+ alias_method :opal_eval, :eval
173
+ end
174
+
175
+ module MSpec
176
+ def self.opal_runner
177
+ @env = Object.new
178
+ @env.extend MSpec
179
+ end
180
+ end
181
+
182
+ class OSpecRunner
183
+ def self.main
184
+ @main ||= self.new
185
+ end
186
+
187
+ def initialize
188
+ register
189
+ run
190
+ end
191
+
192
+ def register
193
+ formatter = PhantomFormatter.new
194
+ formatter.register
195
+
196
+ OSpecFilter.main.register
197
+ end
198
+
199
+ def run
200
+ MSpec.opal_runner
201
+ end
202
+
203
+ def will_start
204
+ MSpec.actions :start
205
+ end
206
+
207
+ def did_finish
208
+ MSpec.actions :finish
209
+ end
210
+ end
211
+
212
+ # As soon as this file loads, tell the runner the specs are starting
213
+ OSpecRunner.main.will_start
214
+