opal 0.3.41 → 0.3.42

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 (285) hide show
  1. data/.gitignore +2 -0
  2. data/.travis.yml +3 -0
  3. data/CHANGELOG.md +14 -1
  4. data/Gemfile +2 -5
  5. data/Rakefile +41 -3
  6. data/bin/opal +33 -0
  7. data/lib/opal.rb +2 -12
  8. data/lib/opal/core_ext.rb +5 -0
  9. data/lib/opal/grammar.rb +2207 -2138
  10. data/lib/opal/grammar.y +21 -0
  11. data/lib/opal/grammar_helpers.rb +360 -0
  12. data/lib/opal/lexer.rb +55 -401
  13. data/lib/opal/lexer_scope.rb +28 -0
  14. data/lib/opal/parser.rb +155 -171
  15. data/lib/opal/target_scope.rb +257 -0
  16. data/lib/opal/version.rb +1 -1
  17. data/opal.gemspec +6 -2
  18. data/opal/opal-parser.js.erb +3 -2
  19. data/opal/opal.rb +20 -18
  20. data/opal/opal/array.rb +21 -12
  21. data/opal/opal/basic_object.rb +2 -1
  22. data/opal/opal/boolean.rb +3 -0
  23. data/opal/opal/browser_loader.js +57 -0
  24. data/opal/opal/class.rb +51 -13
  25. data/opal/opal/date.rb +1 -20
  26. data/opal/opal/enumerable.rb +66 -33
  27. data/opal/opal/error.rb +2 -0
  28. data/opal/opal/hash.rb +1 -1
  29. data/opal/opal/kernel.rb +14 -3
  30. data/opal/opal/nil_class.rb +4 -0
  31. data/opal/opal/proc.rb +9 -1
  32. data/opal/opal/racc.rb +2 -2
  33. data/opal/opal/regexp.rb +1 -1
  34. data/opal/opal/runtime.js +14 -4
  35. data/opal/opal/string.rb +21 -4
  36. data/opal/opal/time.rb +27 -0
  37. data/spec/core/array/allocate_spec.rb +7 -1
  38. data/spec/core/array/append_spec.rb +18 -3
  39. data/spec/core/array/array_spec.rb +7 -0
  40. data/spec/core/array/assoc_spec.rb +23 -8
  41. data/spec/core/array/at_spec.rb +23 -3
  42. data/spec/core/array/choice_spec.rb +20 -0
  43. data/spec/core/array/clear_spec.rb +45 -4
  44. data/spec/core/array/combination_spec.rb +55 -0
  45. data/spec/core/array/compact_spec.rb +72 -1
  46. data/spec/core/array/constructor_spec.rb +13 -2
  47. data/spec/core/array/count_spec.rb +15 -7
  48. data/spec/core/array/delete_at_spec.rb +44 -1
  49. data/spec/core/array/delete_if_spec.rb +52 -2
  50. data/spec/core/array/delete_spec.rb +83 -2
  51. data/spec/core/array/drop_spec.rb +24 -16
  52. data/spec/core/array/drop_while_spec.rb +17 -0
  53. data/spec/core/array/each_index_spec.rb +11 -1
  54. data/spec/core/array/each_spec.rb +20 -2
  55. data/spec/core/array/empty_spec.rb +4 -1
  56. data/spec/core/array/eql_spec.rb +14 -0
  57. data/spec/core/array/fetch_spec.rb +31 -2
  58. data/spec/core/array/find_index_spec.rb +8 -0
  59. data/spec/core/array/first_spec.rb +45 -8
  60. data/spec/core/array/fixtures/classes.rb +538 -0
  61. data/spec/core/array/flatten_spec.rb +200 -7
  62. data/spec/core/array/frozen_spec.rb +32 -0
  63. data/spec/core/array/include_spec.rb +16 -1
  64. data/spec/core/array/index_spec.rb +5 -25
  65. data/spec/core/array/insert_spec.rb +37 -3
  66. data/spec/core/array/inspect_spec.rb +6 -12
  67. data/spec/core/array/intersection_spec.rb +55 -4
  68. data/spec/core/array/join_spec.rb +29 -4
  69. data/spec/core/array/keep_if_spec.rb +13 -6
  70. data/spec/core/array/last_spec.rb +35 -1
  71. data/spec/core/array/length_spec.rb +7 -4
  72. data/spec/core/array/map_spec.rb +9 -47
  73. data/spec/core/array/minus_spec.rb +68 -4
  74. data/spec/core/array/multiply_spec.rb +138 -6
  75. data/spec/core/array/new_spec.rb +92 -3
  76. data/spec/core/array/ntimes_spec.rb +26 -0
  77. data/spec/core/array/plus_spec.rb +48 -2
  78. data/spec/core/array/pop_spec.rb +159 -39
  79. data/spec/core/array/push_spec.rb +29 -1
  80. data/spec/core/array/rassoc_spec.rb +31 -2
  81. data/spec/core/array/reject_spec.rb +89 -2
  82. data/spec/core/array/replace_spec.rb +7 -29
  83. data/spec/core/array/reverse_each_spec.rb +25 -1
  84. data/spec/core/array/reverse_spec.rb +53 -1
  85. data/spec/core/array/rindex_spec.rb +55 -5
  86. data/spec/core/array/select_spec.rb +35 -8
  87. data/spec/core/array/shared/collect.rb +0 -0
  88. data/spec/core/array/shared/enumeratorize.rb +12 -0
  89. data/spec/core/array/shared/eql.rb +95 -0
  90. data/spec/core/array/shared/index.rb +37 -0
  91. data/spec/core/array/shared/inspect.rb +3 -0
  92. data/spec/core/array/shared/join.rb +7 -0
  93. data/spec/core/array/shared/keep_if.rb +0 -0
  94. data/spec/core/array/shared/length.rb +0 -0
  95. data/spec/core/array/shared/replace.rb +0 -0
  96. data/spec/core/array/shared/slice.rb +0 -0
  97. data/spec/core/array/shift_spec.rb +132 -23
  98. data/spec/core/array/shuffle_spec.rb +82 -6
  99. data/spec/core/array/size_spec.rb +7 -4
  100. data/spec/core/array/slice_spec.rb +132 -1
  101. data/spec/core/array/sort_spec.rb +263 -14
  102. data/spec/core/array/take_spec.rb +24 -16
  103. data/spec/core/array/take_while_spec.rb +14 -10
  104. data/spec/core/array/to_a_spec.rb +18 -1
  105. data/spec/core/array/to_ary_spec.rb +15 -1
  106. data/spec/core/array/try_convert_spec.rb +39 -2
  107. data/spec/core/array/uniq_spec.rb +148 -3
  108. data/spec/core/array/unshift_spec.rb +36 -1
  109. data/spec/core/array/zip_spec.rb +36 -1
  110. data/spec/core/class/new_spec.rb +8 -6
  111. data/spec/core/enumerable/all_spec.rb +37 -9
  112. data/spec/core/enumerable/any_spec.rb +45 -7
  113. data/spec/core/enumerable/collect_spec.rb +4 -1
  114. data/spec/core/enumerable/count_spec.rb +4 -1
  115. data/spec/core/enumerable/detect_spec.rb +2 -2
  116. data/spec/core/enumerable/drop_spec.rb +4 -1
  117. data/spec/core/enumerable/drop_while_spec.rb +4 -1
  118. data/spec/core/enumerable/each_slice_spec.rb +2 -1
  119. data/spec/core/enumerable/each_with_index_spec.rb +4 -1
  120. data/spec/core/enumerable/each_with_object_spec.rb +4 -1
  121. data/spec/core/enumerable/entries_spec.rb +4 -1
  122. data/spec/core/enumerable/find_all_spec.rb +4 -1
  123. data/spec/core/enumerable/find_index_spec.rb +4 -1
  124. data/spec/core/enumerable/find_spec.rb +5 -2
  125. data/spec/core/enumerable/first_spec.rb +4 -1
  126. data/spec/core/enumerable/fixtures/classes.rb +198 -2
  127. data/spec/core/enumerable/grep_spec.rb +4 -1
  128. data/spec/core/enumerable/take_spec.rb +4 -1
  129. data/spec/core/enumerable/to_a_spec.rb +4 -1
  130. data/spec/core/false/and_spec.rb +11 -0
  131. data/spec/core/false/inspect_spec.rb +7 -0
  132. data/spec/core/false/or_spec.rb +11 -0
  133. data/spec/core/false/to_s_spec.rb +7 -0
  134. data/spec/core/false/xor_spec.rb +11 -0
  135. data/spec/core/kernel/rand_spec.rb +5 -5
  136. data/spec/core/module/const_get_spec.rb +4 -4
  137. data/spec/core/module/fixtures/classes.rb +434 -0
  138. data/spec/core/module/method_defined_spec.rb +49 -0
  139. data/spec/core/module/module_function_spec.rb +28 -0
  140. data/spec/core/nil/and_spec.rb +3 -1
  141. data/spec/core/nil/dup_spec.rb +7 -0
  142. data/spec/core/nil/inspect_spec.rb +3 -1
  143. data/spec/core/nil/nil_spec.rb +3 -1
  144. data/spec/core/nil/or_spec.rb +4 -2
  145. data/spec/core/nil/to_a_spec.rb +3 -1
  146. data/spec/core/nil/to_f_spec.rb +3 -1
  147. data/spec/core/nil/to_i_spec.rb +3 -1
  148. data/spec/core/nil/to_s_spec.rb +3 -1
  149. data/spec/core/nil/xor_spec.rb +4 -2
  150. data/spec/core/string/element_reference_spec.rb +14 -1
  151. data/spec/core/string/fixtures/classes.rb +0 -0
  152. data/spec/core/true/and_spec.rb +11 -0
  153. data/spec/core/true/inspect_spec.rb +7 -0
  154. data/spec/core/true/or_spec.rb +11 -0
  155. data/spec/core/true/to_s_spec.rb +7 -0
  156. data/spec/core/true/xor_spec.rb +11 -0
  157. data/spec/{core → core_ext}/array/element_reference_spec.rb +0 -0
  158. data/spec/{core → core_ext}/array/equal_value_spec.rb +0 -0
  159. data/spec/{core → core_ext}/array/fill_spec.rb +0 -0
  160. data/spec/{core → core_ext}/array/reduce_spec.rb +0 -0
  161. data/spec/core_ext/basic_object/send_spec.rb +3 -3
  162. data/spec/{core → core_ext}/boolean/singleton_class_spec.rb +0 -0
  163. data/spec/{core → core_ext}/boolean/to_json_spec.rb +0 -0
  164. data/spec/core_ext/class/_inherited_spec.rb +3 -3
  165. data/spec/core_ext/class/proc_methods_spec.rb +2 -2
  166. data/spec/core_ext/class/singleton_methods_spec.rb +8 -8
  167. data/spec/core_ext/method_missing_spec.rb +3 -3
  168. data/spec/core_ext/native/method_missing_spec.rb +3 -2
  169. data/spec/core_ext/native/to_native_spec.rb +3 -2
  170. data/spec/{core → core_ext}/nil/to_json_spec.rb +0 -0
  171. data/spec/date.rb +0 -0
  172. data/spec/fileutils.rb +0 -0
  173. data/spec/filters/ancestors.rb +4 -0
  174. data/spec/filters/array_delete.rb +3 -0
  175. data/spec/filters/array_fetch.rb +3 -0
  176. data/spec/filters/array_first.rb +3 -0
  177. data/spec/filters/array_flatten.rb +14 -0
  178. data/spec/filters/array_intersection.rb +5 -0
  179. data/spec/filters/array_join.rb +6 -0
  180. data/spec/filters/array_subclasses.rb +4 -0
  181. data/spec/filters/block_args.rb +3 -0
  182. data/spec/filters/coerce_integer.rb +9 -0
  183. data/spec/filters/frozen.rb +4 -0
  184. data/spec/filters/mocks.rb +3 -0
  185. data/spec/filters/should_receive.rb +4 -0
  186. data/spec/filters/tainted.rb +7 -0
  187. data/spec/fixtures/class.rb +124 -0
  188. data/spec/fixtures/class_variables.rb +0 -0
  189. data/spec/fixtures/constants.rb +0 -0
  190. data/spec/grammar/alias_spec.rb +1 -1
  191. data/spec/grammar/def_spec.rb +1 -0
  192. data/spec/grammar/lvar_spec.rb +1 -2
  193. data/spec/grammar/nth_ref_spec.rb +13 -0
  194. data/spec/grammar/sclass_spec.rb +6 -7
  195. data/spec/grammar/str_spec.rb +4 -4
  196. data/spec/grammar/string_spec.rb +8 -0
  197. data/spec/grammar/xstr_spec.rb +4 -4
  198. data/spec/iconv.rb +0 -0
  199. data/spec/language/alias_spec.rb +140 -3
  200. data/spec/language/and_spec.rb +14 -7
  201. data/spec/language/array_spec.rb +57 -5
  202. data/spec/language/block_spec.rb +466 -49
  203. data/spec/language/break_spec.rb +294 -44
  204. data/spec/language/case_spec.rb +151 -3
  205. data/spec/language/class_spec.rb +196 -0
  206. data/spec/language/class_variable_spec.rb +56 -0
  207. data/spec/language/def_spec.rb +507 -4
  208. data/spec/language/defined_spec.rb +19 -7
  209. data/spec/language/ensure_spec.rb +26 -39
  210. data/spec/language/execution_spec.rb +15 -0
  211. data/spec/language/fixtures/array.rb +11 -0
  212. data/spec/language/fixtures/block.rb +57 -0
  213. data/spec/language/fixtures/break.rb +240 -0
  214. data/spec/language/fixtures/ensure.rb +72 -0
  215. data/spec/language/fixtures/literal_lambda.rb +7 -0
  216. data/spec/language/fixtures/metaclass.rb +33 -0
  217. data/spec/language/fixtures/module.rb +24 -0
  218. data/spec/language/fixtures/next.rb +78 -12
  219. data/spec/language/fixtures/return.rb +118 -0
  220. data/spec/language/fixtures/send.rb +110 -0
  221. data/spec/language/fixtures/send_1.9.rb +22 -0
  222. data/spec/language/fixtures/super.rb +308 -0
  223. data/spec/language/fixtures/variables.rb +58 -0
  224. data/spec/language/fixtures/yield.rb +5 -0
  225. data/spec/language/for_spec.rb +192 -0
  226. data/spec/language/hash_spec.rb +29 -5
  227. data/spec/language/if_spec.rb +90 -9
  228. data/spec/language/literal_lambda_spec.rb +1 -47
  229. data/spec/language/loop_spec.rb +39 -2
  230. data/spec/language/metaclass_spec.rb +151 -5
  231. data/spec/language/module_spec.rb +56 -0
  232. data/spec/language/next_spec.rb +370 -12
  233. data/spec/language/not_spec.rb +55 -0
  234. data/spec/language/numbers_spec.rb +56 -0
  235. data/spec/language/or_spec.rb +31 -3
  236. data/spec/language/order_spec.rb +79 -0
  237. data/spec/language/precedence_spec.rb +483 -0
  238. data/spec/language/proc_spec.rb +249 -21
  239. data/spec/language/redo_spec.rb +67 -0
  240. data/spec/language/rescue_spec.rb +121 -0
  241. data/spec/language/retry_spec.rb +56 -0
  242. data/spec/language/return_spec.rb +281 -0
  243. data/spec/language/send_spec.rb +141 -48
  244. data/spec/language/singleton_class_spec.rb +1 -1
  245. data/spec/language/string_spec.rb +11 -0
  246. data/spec/language/super_spec.rb +213 -133
  247. data/spec/language/symbol_spec.rb +2 -1
  248. data/spec/language/undef_spec.rb +3 -1
  249. data/spec/language/unless_spec.rb +6 -2
  250. data/spec/language/until_spec.rb +102 -3
  251. data/spec/language/variables_spec.rb +1212 -16
  252. data/spec/language/versions/array_1.9.rb +39 -0
  253. data/spec/language/versions/case_1.9.rb +20 -0
  254. data/spec/language/versions/hash_1.9.rb +18 -0
  255. data/spec/language/versions/literal_lambda_1.9.rb +143 -0
  256. data/spec/language/versions/not_1.9.rb +22 -0
  257. data/spec/language/versions/send_1.9.rb +241 -0
  258. data/spec/language/versions/symbol_1.9.rb +15 -0
  259. data/spec/language/versions/variables_1.9.rb +8 -0
  260. data/spec/language/while_spec.rb +70 -5
  261. data/spec/language/yield_spec.rb +32 -6
  262. data/spec/mspec/guards/block_device.rb +0 -0
  263. data/spec/mspec/guards/endian.rb +0 -0
  264. data/spec/mspec/helpers/environment.rb +0 -0
  265. data/spec/mspec/helpers/language_version.rb +0 -0
  266. data/spec/mspec/helpers/tmp.rb +0 -0
  267. data/spec/ospec/filter.rb +32 -0
  268. data/spec/ospec/main.rb.erb +18 -0
  269. data/spec/ospec/phantom.rb +97 -0
  270. data/spec/ospec/runner.rb +95 -0
  271. data/spec/ospec/sprockets.js +40 -0
  272. data/spec/pp.rb +3 -0
  273. data/spec/rbconfig.rb +5 -0
  274. data/spec/spec_helper.rb +53 -26
  275. data/spec/yaml.rb +0 -0
  276. metadata +275 -31
  277. data/config.ru +0 -8
  278. data/lib/opal/processor.rb +0 -47
  279. data/lib/opal/scope.rb +0 -236
  280. data/lib/opal/server.rb +0 -94
  281. data/spec/core/boolean/and_spec.rb +0 -17
  282. data/spec/core/boolean/inspect_spec.rb +0 -9
  283. data/spec/core/boolean/or_spec.rb +0 -17
  284. data/spec/core/boolean/to_s_spec.rb +0 -9
  285. data/spec/core/boolean/xor_spec.rb +0 -17
@@ -0,0 +1,39 @@
1
+ describe "Array literals" do
2
+ it "[] accepts a literal hash without curly braces as its last parameter" do
3
+ ["foo", "bar" => :baz].should == ["foo", {"bar" => :baz}]
4
+ [1, 2, 3 => 6, 4 => 24].should == [1, 2, {3 => 6, 4 => 24}]
5
+ end
6
+
7
+ it "[] treats splatted nil as no element" do
8
+ [*nil].should == []
9
+ [1, *nil].should == [1]
10
+ [1, 2, *nil].should == [1, 2]
11
+ [1, *nil, 3].should == [1, 3]
12
+ [*nil, *nil, *nil].should == []
13
+ end
14
+ end
15
+
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
18
+ obj = mock("pseudo-array")
19
+ obj.should_receive(:to_a).and_return([2, 3, 4])
20
+ [1, *obj].should == [1, 2, 3, 4]
21
+ end
22
+
23
+ it "when applied to a non-Array value uses it unchanged if it does not respond_to?(:to_a)" do
24
+ obj = Object.new
25
+ obj.should_not respond_to(:to_a)
26
+ [1, *obj].should == [1, obj]
27
+ end
28
+
29
+ it "can be used before other non-splat elements" do
30
+ a = [1, 2]
31
+ [0, *a, 3].should == [0, 1, 2, 3]
32
+ end
33
+
34
+ it "can be used multiple times in the same containing array" do
35
+ a = [1, 2]
36
+ b = [1, 0]
37
+ [*a, 3, *a, *b].should == [1, 2, 3, 1, 2, 1, 0]
38
+ end
39
+ end
@@ -0,0 +1,20 @@
1
+ describe "The 'case'-construct" do
2
+ it "takes multiple expanded arrays" do
3
+ a1 = ['f', 'o', 'o']
4
+ a2 = ['b', 'a', 'r']
5
+
6
+ case 'f'
7
+ when *a1, *['x', 'y', 'z']
8
+ "foo"
9
+ when *a2, *['x', 'y', 'z']
10
+ "bar"
11
+ end.should == "foo"
12
+
13
+ case 'b'
14
+ when *a1, *['x', 'y', 'z']
15
+ "foo"
16
+ when *a2, *['x', 'y', 'z']
17
+ "bar"
18
+ end.should == "bar"
19
+ end
20
+ end
@@ -0,0 +1,18 @@
1
+ describe "Hash literal" do
2
+ describe "new-style hash syntax" do
3
+ it "constructs a new hash with the given elements" do
4
+ {foo: 123}.should == {:foo => 123}
5
+ {rbx: :cool, specs: 'fail_sometimes'}.should == {:rbx => :cool, :specs => 'fail_sometimes'}
6
+ end
7
+
8
+ it "ignores a hanging comma" do
9
+ {foo: 123,}.should == {:foo => 123}
10
+ {rbx: :cool, specs: 'fail_sometimes',}.should == {:rbx => :cool, :specs => 'fail_sometimes'}
11
+ end
12
+
13
+ it "can mix and match syntax styles" do
14
+ {rbx: :cool, :specs => 'fail_sometimes'}.should == {:rbx => :cool, :specs => 'fail_sometimes'}
15
+ {'rbx' => :cool, specs: 'fail_sometimes'}.should == {'rbx' => :cool, :specs => 'fail_sometimes'}
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,143 @@
1
+ require File.join(File.dirname(__FILE__), '../fixtures/literal_lambda')
2
+
3
+ describe "->(){}" do
4
+ it "can be specified as a literal" do
5
+ lambda { ->(){} }.should_not raise_error
6
+ end
7
+
8
+ it "returns a Proc object" do
9
+ ->(){}.should be_an_instance_of(Proc)
10
+ end
11
+
12
+ it "returns a lambda" do
13
+ ->(){}.lambda?.should be_true
14
+ end
15
+
16
+ it "can be assigned to a variable" do
17
+ var = ->(){}
18
+ var.lambda?.should be_true
19
+ end
20
+
21
+ it "understands a do/end block in place of {}" do
22
+ lambda do
23
+ ->() do
24
+ end
25
+ end.should_not raise_error(SyntaxError)
26
+ end
27
+
28
+ it "requires an associated block" do
29
+ lambda { eval "->()" }.should raise_error(SyntaxError)
30
+ lambda { eval "->" }.should raise_error(SyntaxError)
31
+ end
32
+
33
+ it "can be interpolated into a String" do
34
+ "1+2=#{->{ 1 + 2}.call}".should == "1+2=3"
35
+ end
36
+
37
+ pending "can be be used as a Hash key" do
38
+ h = new_hash
39
+ # h[->(one=1){ one + 2}.call] = :value
40
+ h.key?(3).should be_true
41
+ end
42
+
43
+ it "can be used in method parameter lists" do
44
+ def glark7654(a=-> { :foo })
45
+ a.call
46
+ end
47
+ glark7654.should == :foo
48
+ end
49
+
50
+ it "accepts an parameter list between the parenthesis" do
51
+ lambda { ->(a) {} }.should_not raise_error(SyntaxError)
52
+ lambda { ->(a,b) {} }.should_not raise_error(SyntaxError)
53
+ end
54
+
55
+ it "accepts an empty parameter list" do
56
+ lambda { ->() {} }.should_not raise_error(SyntaxError)
57
+ end
58
+
59
+ it "allows the parenthesis to be omitted entirely" do
60
+ lambda { -> {} }.should_not raise_error(SyntaxError)
61
+ lambda { ->{} }.should_not raise_error(SyntaxError)
62
+ lambda do
63
+ -> do
64
+ end
65
+ end.should_not raise_error(SyntaxError)
66
+ ->{}.should be_an_instance_of(Proc)
67
+ end
68
+
69
+ it "aliases each argument to the corresponding parameter" do
70
+ ->(a) {a}.call(:sym).should == :sym
71
+ ->(a,b) {[a, b]}.call(:sym, :bol).should == [:sym, :bol]
72
+ end
73
+
74
+ pending "accepts parameters with default parameters between the parenthesis" do
75
+ # lambda { ->(a=1) {} }.should_not raise_error(SyntaxError)
76
+ # lambda { ->(x=1, b=[]) {} }.should_not raise_error(SyntaxError)
77
+ end
78
+
79
+ pending "aliases each argument with a default value to the corresponding parameter" do
80
+ # ->(a=:cymbal) {a}.call(:sym).should == :sym
81
+ # ->(a,b=:cymbal) {[a, b]}.call(:sym, :bol).should == [:sym, :bol]
82
+ end
83
+
84
+ pending "sets arguments to their default value if one wasn't supplied" do
85
+ # ->(a=:cymbal) {a}.call.should == :cymbal
86
+ # ->(a,b=:cymbal) {[a, b]}.call(:sym).should == [:sym, :cymbal]
87
+ end
88
+
89
+ pending "accepts a parameter prefixed with an asterisk between the parenthesis" do
90
+ # lambda { ->(*a) {} }.should_not raise_error(SyntaxError)
91
+ # lambda { ->(x, *a) {} }.should_not raise_error(SyntaxError)
92
+ end
93
+
94
+ pending "assigns all remaining arguments to the variable in the parameter list prefixed with an asterisk, if one exists" do
95
+ # ->(*a) {a}.call(:per, :cus, :si, :on).should == [:per, :cus, :si, :on]
96
+ # ->(a,*b) {b}.call(:per, :cus, :si, :on).should == [:cus, :si, :on]
97
+ end
98
+
99
+ pending "accepts a parameter prefixed with an ampersand between the parenthesis" do
100
+ # lambda { ->(&a) {} }.should_not raise_error(SyntaxError)
101
+ # lambda { ->(x, &a) {} }.should_not raise_error(SyntaxError)
102
+ end
103
+
104
+ pending "assigns the given block to the parameter prefixed with an ampersand if such a parameter exists" do
105
+ # l = ->(&a) { a }.call { :foo }
106
+ l.call.should == :foo
107
+ end
108
+
109
+ pending "assigns nil to the parameter prefixed with an ampersand unless a block was supplied" do
110
+ # ->(&a) { a }.call.should be_nil
111
+ end
112
+
113
+ pending "accepts a combination of argument types between the parenthesis" do
114
+ # lambda { ->(x, y={}, z = Object.new, *a, &b) {} }.
115
+ should_not raise_error(SyntaxError)
116
+ end
117
+
118
+ pending "sets parameters appropriately when a combination of parameter types is given between the parenthesis" do
119
+ # l = ->(x, y={}, z = Object.new, *a, &b) { [x,y,z,a,b]}
120
+ l.call(1, [], [], 30, 40).should == [1, [], [], [30, 40], nil]
121
+ block = lambda { :lamb }
122
+ l.call(1, [], [], 30, 40, &block).last.should be_an_instance_of(Proc)
123
+ # l2 = ->(x, y={}, *a) { [x, y, a]}
124
+ l2.call(:x).should == [:x, {}, []]
125
+ end
126
+
127
+ pending "uses lambda's 'rigid' argument handling" do
128
+ ->(a, b){}.parameters.first.first.should == :req
129
+ ->(a, b){}.parameters.last.first.should == :req
130
+ lambda { ->(a, b){}.call 1 }.should raise_error(ArgumentError)
131
+ end
132
+
133
+ it "does not call the associated block" do
134
+ @called = false
135
+ ->() { @called = true }
136
+ @called.should be_false
137
+ end
138
+
139
+ it "evaluates constants as normal blocks do" do
140
+ l = LiteralLambdaMethods.literal_lambda_with_constant
141
+ l.().should == "some value"
142
+ end
143
+ end
@@ -0,0 +1,22 @@
1
+ describe "not()" do
2
+ # not(arg).method and method(not(arg)) raise SyntaxErrors on 1.8. Here we
3
+ # use #inspect to test that the syntax works on 1.9
4
+
5
+ it "can be used as a function" do
6
+ lambda do
7
+ not(true).inspect
8
+ end.should_not raise_error(SyntaxError)
9
+ end
10
+
11
+ it "returns false if the argument is true" do
12
+ not(true).inspect.should == "false"
13
+ end
14
+
15
+ it "returns true if the argument is false" do
16
+ not(false).inspect.should == "true"
17
+ end
18
+
19
+ it "returns true if the argument is nil" do
20
+ not(nil).inspect.should == "true"
21
+ end
22
+ end
@@ -0,0 +1,241 @@
1
+ # FIXME: Add error case
2
+ #
3
+ require File.expand_path("../../fixtures/send_1.9.rb", __FILE__)
4
+ require 'language/fixtures/send_1.9'
5
+
6
+ specs = LangSendSpecs
7
+
8
+ describe "Invoking a method" do
9
+ describe "with required args after the rest arguments" do
10
+ pending "binds the required arguments first" do
11
+ specs.fooM0RQ1(1).should == [[], 1]
12
+ specs.fooM0RQ1(1,2).should == [[1], 2]
13
+ specs.fooM0RQ1(1,2,3).should == [[1,2], 3]
14
+
15
+ specs.fooM1RQ1(1,2).should == [1, [], 2]
16
+ specs.fooM1RQ1(1,2,3).should == [1, [2], 3]
17
+ specs.fooM1RQ1(1,2,3,4).should == [1, [2, 3], 4]
18
+
19
+ specs.fooM1O1RQ1(1,2).should == [1, 9, [], 2]
20
+ specs.fooM1O1RQ1(1,2,3).should == [1, 2, [], 3]
21
+ specs.fooM1O1RQ1(1,2,3,4).should == [1, 2, [3], 4]
22
+
23
+ specs.fooM1O1RQ2(1,2,3).should == [1, 9, [], 2, 3]
24
+ specs.fooM1O1RQ2(1,2,3,4).should == [1, 2, [], 3, 4]
25
+ specs.fooM1O1RQ2(1,2,3,4,5).should == [1, 2, [3], 4, 5]
26
+ end
27
+ end
28
+
29
+ describe "with manditory arguments after optional arguments" do
30
+ pending "binds the required arguments first" do
31
+ specs.fooO1Q1(0,1).should == [0,1]
32
+ specs.fooO1Q1(2).should == [1,2]
33
+
34
+ specs.fooM1O1Q1(2,3,4).should == [2,3,4]
35
+ specs.fooM1O1Q1(1,3).should == [1,2,3]
36
+
37
+ specs.fooM2O1Q1(1,2,4).should == [1,2,3,4]
38
+
39
+ specs.fooM2O2Q1(1,2,3,4,5).should == [1,2,3,4,5]
40
+ specs.fooM2O2Q1(1,2,3,5).should == [1,2,3,4,5]
41
+ specs.fooM2O2Q1(1,2,5).should == [1,2,3,4,5]
42
+
43
+ specs.fooO4Q1(1,2,3,4,5).should == [1,2,3,4,5]
44
+ specs.fooO4Q1(1,2,3,5).should == [1,2,3,4,5]
45
+ specs.fooO4Q1(1,2,5).should == [1,2,3,4,5]
46
+ specs.fooO4Q1(1,5).should == [1,2,3,4,5]
47
+ specs.fooO4Q1(5).should == [1,2,3,4,5]
48
+
49
+ specs.fooO4Q2(1,2,3,4,5,6).should == [1,2,3,4,5,6]
50
+ specs.fooO4Q2(1,2,3,5,6).should == [1,2,3,4,5,6]
51
+ specs.fooO4Q2(1,2,5,6).should == [1,2,3,4,5,6]
52
+ specs.fooO4Q2(1,5,6).should == [1,2,3,4,5,6]
53
+ specs.fooO4Q2(5,6).should == [1,2,3,4,5,6]
54
+ end
55
+ end
56
+
57
+ pending "with .() invokes #call" do
58
+ q = proc { |z| z }
59
+ q.(1).should == 1
60
+
61
+ obj = mock("paren call")
62
+ obj.should_receive(:call).and_return(:called)
63
+ obj.().should == :called
64
+ end
65
+
66
+ pending "allows a vestigial trailing ',' in the arguments" do
67
+ # specs.fooM1(1,).should == [1]
68
+ end
69
+
70
+ pending "with splat operator attempts to coerce it to an Array if the object respond_to?(:to_a)" do
71
+ ary = [2,3,4]
72
+ obj = mock("to_a")
73
+ obj.should_receive(:to_a).and_return(ary).twice
74
+ specs.fooM0R(*obj).should == ary
75
+ specs.fooM1R(1,*obj).should == [1, ary]
76
+ end
77
+
78
+ pending "with splat operator * and non-Array value uses value unchanged if it does not respond_to?(:to_ary)" do
79
+ obj = Object.new
80
+ obj.should_not respond_to(:to_a)
81
+
82
+ specs.fooM0R(*obj).should == [obj]
83
+ specs.fooM1R(1,*obj).should == [1, [obj]]
84
+ end
85
+
86
+ it "accepts additional arguments after splat expansion" do
87
+ a = [1,2]
88
+ specs.fooM4(*a,3,4).should == [1,2,3,4]
89
+ specs.fooM4(0,*a,3).should == [0,1,2,3]
90
+ end
91
+
92
+ pending "accepts final explicit literal Hash arguments after the splat" do
93
+ a = [1, 2]
94
+ specs.fooM0RQ1(*a, { :a => 1 }).should == [[1, 2], { :a => 1 }]
95
+ end
96
+
97
+ pending "accepts final implicit literal Hash arguments after the splat" do
98
+ a = [1, 2]
99
+ specs.fooM0RQ1(*a, :a => 1).should == [[1, 2], { :a => 1 }]
100
+ end
101
+
102
+ pending "accepts final Hash arguments after the splat" do
103
+ a = [1, 2]
104
+ b = { :a => 1 }
105
+ specs.fooM0RQ1(*a, b).should == [[1, 2], { :a => 1 }]
106
+ end
107
+
108
+ pending "accepts mandatory and explicit literal Hash arguments after the splat" do
109
+ a = [1, 2]
110
+ specs.fooM0RQ2(*a, 3, { :a => 1 }).should == [[1, 2], 3, { :a => 1 }]
111
+ end
112
+
113
+ pending "accepts mandatory and implicit literal Hash arguments after the splat" do
114
+ a = [1, 2]
115
+ specs.fooM0RQ2(*a, 3, :a => 1).should == [[1, 2], 3, { :a => 1 }]
116
+ end
117
+
118
+ pending "accepts mandatory and Hash arguments after the splat" do
119
+ a = [1, 2]
120
+ b = { :a => 1 }
121
+ specs.fooM0RQ2(*a, 3, b).should == [[1, 2], 3, { :a => 1 }]
122
+ end
123
+
124
+ pending "converts a final splatted explicit Hash to an Array" do
125
+ a = [1, 2]
126
+ specs.fooR(*a, 3, *{ :a => 1 }).should == [1, 2, 3, [:a, 1]]
127
+ end
128
+
129
+ pending "calls #to_a to convert a final splatted Hash object to an Array" do
130
+ a = [1, 2]
131
+ b = { :a => 1 }
132
+ b.should_receive(:to_a).and_return([:a, 1])
133
+
134
+ specs.fooR(*a, 3, *b).should == [1, 2, 3, :a, 1]
135
+ end
136
+
137
+ pending "accepts multiple splat expansions in the same argument list" do
138
+ a = [1,2,3]
139
+ b = 7
140
+ c = mock("pseudo-array")
141
+ c.should_receive(:to_a).and_return([0,0])
142
+
143
+ d = [4,5]
144
+ specs.rest_len(*a,*d,6,*b).should == 7
145
+ specs.rest_len(*a,*a,*a).should == 9
146
+ specs.rest_len(0,*a,4,*5,6,7,*c,-1).should == 11
147
+ end
148
+
149
+ pending "expands an array to arguments grouped in parentheses" do
150
+ specs.destructure2([40,2]).should == 42
151
+ end
152
+
153
+ pending "expands an array to arguments grouped in parentheses and ignores any rest arguments in the array" do
154
+ specs.destructure2([40,2,84]).should == 42
155
+ end
156
+
157
+ pending "expands an array to arguments grouped in parentheses and sets not specified arguments to nil" do
158
+ specs.destructure2b([42]).should == [42, nil]
159
+ end
160
+
161
+ pending "expands an array to arguments grouped in parentheses which in turn takes rest arguments" do
162
+ specs.destructure4r([1, 2, 3]).should == [1, 2, [], 3, nil]
163
+ specs.destructure4r([1, 2, 3, 4]).should == [1, 2, [], 3, 4]
164
+ specs.destructure4r([1, 2, 3, 4, 5]).should == [1, 2, [3], 4, 5]
165
+ end
166
+
167
+ describe "new-style hash arguments" do
168
+ describe "as the only parameter" do
169
+ it "passes without curly braces" do
170
+ specs.fooM1(rbx: 'cool', specs: :fail_sometimes, non_sym: 1234).should ==
171
+ [{ :rbx => 'cool', :specs => :fail_sometimes, :non_sym => 1234 }]
172
+ end
173
+
174
+ it "passes without curly braces or parens" do
175
+ (specs.fooM1 rbx: 'cool', specs: :fail_sometimes, non_sym: 1234).should ==
176
+ [{ :rbx => 'cool', :specs => :fail_sometimes, :non_sym => 1234 }]
177
+ end
178
+
179
+ pending "handles a hanging comma without curly braces" do
180
+ # specs.fooM1(abc: 123,).should == [{:abc => 123}]
181
+ # specs.fooM1(rbx: 'cool', specs: :fail_sometimes, non_sym: 1234,).should ==
182
+ # [{ :rbx => 'cool', :specs => :fail_sometimes, :non_sym => 1234 }]
183
+ end
184
+ end
185
+
186
+ describe "as the last parameter" do
187
+ it "passes without curly braces" do
188
+ specs.fooM3('abc', 123, rbx: 'cool', specs: :fail_sometimes, non_sym: 1234).should ==
189
+ ['abc', 123, { :rbx => 'cool', :specs => :fail_sometimes, :non_sym => 1234 }]
190
+ end
191
+
192
+ it "passes without curly braces or parens" do
193
+ (specs.fooM3 'abc', 123, rbx: 'cool', specs: :fail_sometimes, non_sym: 1234).should ==
194
+ ['abc', 123, { :rbx => 'cool', :specs => :fail_sometimes, :non_sym => 1234 }]
195
+ end
196
+
197
+ pending "handles a hanging comma without curly braces" do
198
+ # specs.fooM3('abc', 123, abc: 123,).should == ['abc', 123, {:abc => 123}]
199
+ # specs.fooM3('abc', 123, rbx: 'cool', specs: :fail_sometimes, non_sym: 1234,).should ==
200
+ # ['abc', 123, { :rbx => 'cool', :specs => :fail_sometimes, :non_sym => 1234 }]
201
+ end
202
+ end
203
+ end
204
+
205
+ describe "mixed new- and old-style hash arguments" do
206
+ describe "as the only parameter" do
207
+ it "passes without curly braces" do
208
+ specs.fooM1(rbx: 'cool', :specs => :fail_sometimes, non_sym: 1234).should ==
209
+ [{ :rbx => 'cool', :specs => :fail_sometimes, :non_sym => 1234 }]
210
+ end
211
+
212
+ it "passes without curly braces or parens" do
213
+ (specs.fooM1 :rbx => 'cool', specs: :fail_sometimes, non_sym: 1234).should ==
214
+ [{ :rbx => 'cool', :specs => :fail_sometimes, :non_sym => 1234 }]
215
+ end
216
+
217
+ pending "handles a hanging comma without curly braces" do
218
+ # specs.fooM1(rbx: 'cool', specs: :fail_sometimes, :non_sym => 1234,).should ==
219
+ # [{ :rbx => 'cool', :specs => :fail_sometimes, :non_sym => 1234 }]
220
+ end
221
+ end
222
+
223
+ describe "as the last parameter" do
224
+ it "passes without curly braces" do
225
+ specs.fooM3('abc', 123, rbx: 'cool', :specs => :fail_sometimes, non_sym: 1234).should ==
226
+ ['abc', 123, { :rbx => 'cool', :specs => :fail_sometimes, :non_sym => 1234 }]
227
+ end
228
+
229
+ it "passes without curly braces or parens" do
230
+ (specs.fooM3 'abc', 123, :rbx => 'cool', specs: :fail_sometimes, non_sym: 1234).should ==
231
+ ['abc', 123, { :rbx => 'cool', :specs => :fail_sometimes, :non_sym => 1234 }]
232
+ end
233
+
234
+ pending "handles a hanging comma without curly braces" do
235
+ # specs.fooM3('abc', 123, rbx: 'cool', specs: :fail_sometimes, :non_sym => 1234,).should ==
236
+ # ['abc', 123, { :rbx => 'cool', :specs => :fail_sometimes, :non_sym => 1234 }]
237
+ end
238
+ end
239
+ end
240
+
241
+ end