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.
- data/.gitignore +2 -0
- data/.travis.yml +3 -0
- data/CHANGELOG.md +14 -1
- data/Gemfile +2 -5
- data/Rakefile +41 -3
- data/bin/opal +33 -0
- data/lib/opal.rb +2 -12
- data/lib/opal/core_ext.rb +5 -0
- data/lib/opal/grammar.rb +2207 -2138
- data/lib/opal/grammar.y +21 -0
- data/lib/opal/grammar_helpers.rb +360 -0
- data/lib/opal/lexer.rb +55 -401
- data/lib/opal/lexer_scope.rb +28 -0
- data/lib/opal/parser.rb +155 -171
- data/lib/opal/target_scope.rb +257 -0
- data/lib/opal/version.rb +1 -1
- data/opal.gemspec +6 -2
- data/opal/opal-parser.js.erb +3 -2
- data/opal/opal.rb +20 -18
- data/opal/opal/array.rb +21 -12
- data/opal/opal/basic_object.rb +2 -1
- data/opal/opal/boolean.rb +3 -0
- data/opal/opal/browser_loader.js +57 -0
- data/opal/opal/class.rb +51 -13
- data/opal/opal/date.rb +1 -20
- data/opal/opal/enumerable.rb +66 -33
- data/opal/opal/error.rb +2 -0
- data/opal/opal/hash.rb +1 -1
- data/opal/opal/kernel.rb +14 -3
- data/opal/opal/nil_class.rb +4 -0
- data/opal/opal/proc.rb +9 -1
- data/opal/opal/racc.rb +2 -2
- data/opal/opal/regexp.rb +1 -1
- data/opal/opal/runtime.js +14 -4
- data/opal/opal/string.rb +21 -4
- data/opal/opal/time.rb +27 -0
- data/spec/core/array/allocate_spec.rb +7 -1
- data/spec/core/array/append_spec.rb +18 -3
- data/spec/core/array/array_spec.rb +7 -0
- data/spec/core/array/assoc_spec.rb +23 -8
- data/spec/core/array/at_spec.rb +23 -3
- data/spec/core/array/choice_spec.rb +20 -0
- data/spec/core/array/clear_spec.rb +45 -4
- data/spec/core/array/combination_spec.rb +55 -0
- data/spec/core/array/compact_spec.rb +72 -1
- data/spec/core/array/constructor_spec.rb +13 -2
- data/spec/core/array/count_spec.rb +15 -7
- data/spec/core/array/delete_at_spec.rb +44 -1
- data/spec/core/array/delete_if_spec.rb +52 -2
- data/spec/core/array/delete_spec.rb +83 -2
- data/spec/core/array/drop_spec.rb +24 -16
- data/spec/core/array/drop_while_spec.rb +17 -0
- data/spec/core/array/each_index_spec.rb +11 -1
- data/spec/core/array/each_spec.rb +20 -2
- data/spec/core/array/empty_spec.rb +4 -1
- data/spec/core/array/eql_spec.rb +14 -0
- data/spec/core/array/fetch_spec.rb +31 -2
- data/spec/core/array/find_index_spec.rb +8 -0
- data/spec/core/array/first_spec.rb +45 -8
- data/spec/core/array/fixtures/classes.rb +538 -0
- data/spec/core/array/flatten_spec.rb +200 -7
- data/spec/core/array/frozen_spec.rb +32 -0
- data/spec/core/array/include_spec.rb +16 -1
- data/spec/core/array/index_spec.rb +5 -25
- data/spec/core/array/insert_spec.rb +37 -3
- data/spec/core/array/inspect_spec.rb +6 -12
- data/spec/core/array/intersection_spec.rb +55 -4
- data/spec/core/array/join_spec.rb +29 -4
- data/spec/core/array/keep_if_spec.rb +13 -6
- data/spec/core/array/last_spec.rb +35 -1
- data/spec/core/array/length_spec.rb +7 -4
- data/spec/core/array/map_spec.rb +9 -47
- data/spec/core/array/minus_spec.rb +68 -4
- data/spec/core/array/multiply_spec.rb +138 -6
- data/spec/core/array/new_spec.rb +92 -3
- data/spec/core/array/ntimes_spec.rb +26 -0
- data/spec/core/array/plus_spec.rb +48 -2
- data/spec/core/array/pop_spec.rb +159 -39
- data/spec/core/array/push_spec.rb +29 -1
- data/spec/core/array/rassoc_spec.rb +31 -2
- data/spec/core/array/reject_spec.rb +89 -2
- data/spec/core/array/replace_spec.rb +7 -29
- data/spec/core/array/reverse_each_spec.rb +25 -1
- data/spec/core/array/reverse_spec.rb +53 -1
- data/spec/core/array/rindex_spec.rb +55 -5
- data/spec/core/array/select_spec.rb +35 -8
- data/spec/core/array/shared/collect.rb +0 -0
- data/spec/core/array/shared/enumeratorize.rb +12 -0
- data/spec/core/array/shared/eql.rb +95 -0
- data/spec/core/array/shared/index.rb +37 -0
- data/spec/core/array/shared/inspect.rb +3 -0
- data/spec/core/array/shared/join.rb +7 -0
- data/spec/core/array/shared/keep_if.rb +0 -0
- data/spec/core/array/shared/length.rb +0 -0
- data/spec/core/array/shared/replace.rb +0 -0
- data/spec/core/array/shared/slice.rb +0 -0
- data/spec/core/array/shift_spec.rb +132 -23
- data/spec/core/array/shuffle_spec.rb +82 -6
- data/spec/core/array/size_spec.rb +7 -4
- data/spec/core/array/slice_spec.rb +132 -1
- data/spec/core/array/sort_spec.rb +263 -14
- data/spec/core/array/take_spec.rb +24 -16
- data/spec/core/array/take_while_spec.rb +14 -10
- data/spec/core/array/to_a_spec.rb +18 -1
- data/spec/core/array/to_ary_spec.rb +15 -1
- data/spec/core/array/try_convert_spec.rb +39 -2
- data/spec/core/array/uniq_spec.rb +148 -3
- data/spec/core/array/unshift_spec.rb +36 -1
- data/spec/core/array/zip_spec.rb +36 -1
- data/spec/core/class/new_spec.rb +8 -6
- data/spec/core/enumerable/all_spec.rb +37 -9
- data/spec/core/enumerable/any_spec.rb +45 -7
- data/spec/core/enumerable/collect_spec.rb +4 -1
- data/spec/core/enumerable/count_spec.rb +4 -1
- data/spec/core/enumerable/detect_spec.rb +2 -2
- data/spec/core/enumerable/drop_spec.rb +4 -1
- data/spec/core/enumerable/drop_while_spec.rb +4 -1
- data/spec/core/enumerable/each_slice_spec.rb +2 -1
- data/spec/core/enumerable/each_with_index_spec.rb +4 -1
- data/spec/core/enumerable/each_with_object_spec.rb +4 -1
- data/spec/core/enumerable/entries_spec.rb +4 -1
- data/spec/core/enumerable/find_all_spec.rb +4 -1
- data/spec/core/enumerable/find_index_spec.rb +4 -1
- data/spec/core/enumerable/find_spec.rb +5 -2
- data/spec/core/enumerable/first_spec.rb +4 -1
- data/spec/core/enumerable/fixtures/classes.rb +198 -2
- data/spec/core/enumerable/grep_spec.rb +4 -1
- data/spec/core/enumerable/take_spec.rb +4 -1
- data/spec/core/enumerable/to_a_spec.rb +4 -1
- data/spec/core/false/and_spec.rb +11 -0
- data/spec/core/false/inspect_spec.rb +7 -0
- data/spec/core/false/or_spec.rb +11 -0
- data/spec/core/false/to_s_spec.rb +7 -0
- data/spec/core/false/xor_spec.rb +11 -0
- data/spec/core/kernel/rand_spec.rb +5 -5
- data/spec/core/module/const_get_spec.rb +4 -4
- data/spec/core/module/fixtures/classes.rb +434 -0
- data/spec/core/module/method_defined_spec.rb +49 -0
- data/spec/core/module/module_function_spec.rb +28 -0
- data/spec/core/nil/and_spec.rb +3 -1
- data/spec/core/nil/dup_spec.rb +7 -0
- data/spec/core/nil/inspect_spec.rb +3 -1
- data/spec/core/nil/nil_spec.rb +3 -1
- data/spec/core/nil/or_spec.rb +4 -2
- data/spec/core/nil/to_a_spec.rb +3 -1
- data/spec/core/nil/to_f_spec.rb +3 -1
- data/spec/core/nil/to_i_spec.rb +3 -1
- data/spec/core/nil/to_s_spec.rb +3 -1
- data/spec/core/nil/xor_spec.rb +4 -2
- data/spec/core/string/element_reference_spec.rb +14 -1
- data/spec/core/string/fixtures/classes.rb +0 -0
- data/spec/core/true/and_spec.rb +11 -0
- data/spec/core/true/inspect_spec.rb +7 -0
- data/spec/core/true/or_spec.rb +11 -0
- data/spec/core/true/to_s_spec.rb +7 -0
- data/spec/core/true/xor_spec.rb +11 -0
- data/spec/{core → core_ext}/array/element_reference_spec.rb +0 -0
- data/spec/{core → core_ext}/array/equal_value_spec.rb +0 -0
- data/spec/{core → core_ext}/array/fill_spec.rb +0 -0
- data/spec/{core → core_ext}/array/reduce_spec.rb +0 -0
- data/spec/core_ext/basic_object/send_spec.rb +3 -3
- data/spec/{core → core_ext}/boolean/singleton_class_spec.rb +0 -0
- data/spec/{core → core_ext}/boolean/to_json_spec.rb +0 -0
- data/spec/core_ext/class/_inherited_spec.rb +3 -3
- data/spec/core_ext/class/proc_methods_spec.rb +2 -2
- data/spec/core_ext/class/singleton_methods_spec.rb +8 -8
- data/spec/core_ext/method_missing_spec.rb +3 -3
- data/spec/core_ext/native/method_missing_spec.rb +3 -2
- data/spec/core_ext/native/to_native_spec.rb +3 -2
- data/spec/{core → core_ext}/nil/to_json_spec.rb +0 -0
- data/spec/date.rb +0 -0
- data/spec/fileutils.rb +0 -0
- data/spec/filters/ancestors.rb +4 -0
- data/spec/filters/array_delete.rb +3 -0
- data/spec/filters/array_fetch.rb +3 -0
- data/spec/filters/array_first.rb +3 -0
- data/spec/filters/array_flatten.rb +14 -0
- data/spec/filters/array_intersection.rb +5 -0
- data/spec/filters/array_join.rb +6 -0
- data/spec/filters/array_subclasses.rb +4 -0
- data/spec/filters/block_args.rb +3 -0
- data/spec/filters/coerce_integer.rb +9 -0
- data/spec/filters/frozen.rb +4 -0
- data/spec/filters/mocks.rb +3 -0
- data/spec/filters/should_receive.rb +4 -0
- data/spec/filters/tainted.rb +7 -0
- data/spec/fixtures/class.rb +124 -0
- data/spec/fixtures/class_variables.rb +0 -0
- data/spec/fixtures/constants.rb +0 -0
- data/spec/grammar/alias_spec.rb +1 -1
- data/spec/grammar/def_spec.rb +1 -0
- data/spec/grammar/lvar_spec.rb +1 -2
- data/spec/grammar/nth_ref_spec.rb +13 -0
- data/spec/grammar/sclass_spec.rb +6 -7
- data/spec/grammar/str_spec.rb +4 -4
- data/spec/grammar/string_spec.rb +8 -0
- data/spec/grammar/xstr_spec.rb +4 -4
- data/spec/iconv.rb +0 -0
- data/spec/language/alias_spec.rb +140 -3
- data/spec/language/and_spec.rb +14 -7
- data/spec/language/array_spec.rb +57 -5
- data/spec/language/block_spec.rb +466 -49
- data/spec/language/break_spec.rb +294 -44
- data/spec/language/case_spec.rb +151 -3
- data/spec/language/class_spec.rb +196 -0
- data/spec/language/class_variable_spec.rb +56 -0
- data/spec/language/def_spec.rb +507 -4
- data/spec/language/defined_spec.rb +19 -7
- data/spec/language/ensure_spec.rb +26 -39
- data/spec/language/execution_spec.rb +15 -0
- data/spec/language/fixtures/array.rb +11 -0
- data/spec/language/fixtures/block.rb +57 -0
- data/spec/language/fixtures/break.rb +240 -0
- data/spec/language/fixtures/ensure.rb +72 -0
- data/spec/language/fixtures/literal_lambda.rb +7 -0
- data/spec/language/fixtures/metaclass.rb +33 -0
- data/spec/language/fixtures/module.rb +24 -0
- data/spec/language/fixtures/next.rb +78 -12
- data/spec/language/fixtures/return.rb +118 -0
- data/spec/language/fixtures/send.rb +110 -0
- data/spec/language/fixtures/send_1.9.rb +22 -0
- data/spec/language/fixtures/super.rb +308 -0
- data/spec/language/fixtures/variables.rb +58 -0
- data/spec/language/fixtures/yield.rb +5 -0
- data/spec/language/for_spec.rb +192 -0
- data/spec/language/hash_spec.rb +29 -5
- data/spec/language/if_spec.rb +90 -9
- data/spec/language/literal_lambda_spec.rb +1 -47
- data/spec/language/loop_spec.rb +39 -2
- data/spec/language/metaclass_spec.rb +151 -5
- data/spec/language/module_spec.rb +56 -0
- data/spec/language/next_spec.rb +370 -12
- data/spec/language/not_spec.rb +55 -0
- data/spec/language/numbers_spec.rb +56 -0
- data/spec/language/or_spec.rb +31 -3
- data/spec/language/order_spec.rb +79 -0
- data/spec/language/precedence_spec.rb +483 -0
- data/spec/language/proc_spec.rb +249 -21
- data/spec/language/redo_spec.rb +67 -0
- data/spec/language/rescue_spec.rb +121 -0
- data/spec/language/retry_spec.rb +56 -0
- data/spec/language/return_spec.rb +281 -0
- data/spec/language/send_spec.rb +141 -48
- data/spec/language/singleton_class_spec.rb +1 -1
- data/spec/language/string_spec.rb +11 -0
- data/spec/language/super_spec.rb +213 -133
- data/spec/language/symbol_spec.rb +2 -1
- data/spec/language/undef_spec.rb +3 -1
- data/spec/language/unless_spec.rb +6 -2
- data/spec/language/until_spec.rb +102 -3
- data/spec/language/variables_spec.rb +1212 -16
- data/spec/language/versions/array_1.9.rb +39 -0
- data/spec/language/versions/case_1.9.rb +20 -0
- data/spec/language/versions/hash_1.9.rb +18 -0
- data/spec/language/versions/literal_lambda_1.9.rb +143 -0
- data/spec/language/versions/not_1.9.rb +22 -0
- data/spec/language/versions/send_1.9.rb +241 -0
- data/spec/language/versions/symbol_1.9.rb +15 -0
- data/spec/language/versions/variables_1.9.rb +8 -0
- data/spec/language/while_spec.rb +70 -5
- data/spec/language/yield_spec.rb +32 -6
- data/spec/mspec/guards/block_device.rb +0 -0
- data/spec/mspec/guards/endian.rb +0 -0
- data/spec/mspec/helpers/environment.rb +0 -0
- data/spec/mspec/helpers/language_version.rb +0 -0
- data/spec/mspec/helpers/tmp.rb +0 -0
- data/spec/ospec/filter.rb +32 -0
- data/spec/ospec/main.rb.erb +18 -0
- data/spec/ospec/phantom.rb +97 -0
- data/spec/ospec/runner.rb +95 -0
- data/spec/ospec/sprockets.js +40 -0
- data/spec/pp.rb +3 -0
- data/spec/rbconfig.rb +5 -0
- data/spec/spec_helper.rb +53 -26
- data/spec/yaml.rb +0 -0
- metadata +275 -31
- data/config.ru +0 -8
- data/lib/opal/processor.rb +0 -47
- data/lib/opal/scope.rb +0 -236
- data/lib/opal/server.rb +0 -94
- data/spec/core/boolean/and_spec.rb +0 -17
- data/spec/core/boolean/inspect_spec.rb +0 -9
- data/spec/core/boolean/or_spec.rb +0 -17
- data/spec/core/boolean/to_s_spec.rb +0 -9
- 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
|