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,26 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
3
|
+
|
4
|
+
# Array#nitems was removed from Ruby 1.9.
|
5
|
+
ruby_version_is '' ... '1.9' do
|
6
|
+
describe "Array#nitems" do
|
7
|
+
it "returns the number of non-nil elements" do
|
8
|
+
[nil].nitems.should == 0
|
9
|
+
[].nitems.should == 0
|
10
|
+
[1, 2, 3, nil].nitems.should == 3
|
11
|
+
[1, 2, 3].nitems.should == 3
|
12
|
+
[1, nil, 2, 3, nil, nil, 4].nitems.should == 4
|
13
|
+
[1, nil, 2, false, 3, nil, nil, 4].nitems.should == 5
|
14
|
+
end
|
15
|
+
|
16
|
+
it "properly handles recursive arrays" do
|
17
|
+
empty = ArraySpecs.empty_recursive_array
|
18
|
+
empty.nitems.should == 1
|
19
|
+
|
20
|
+
array = ArraySpecs.recursive_array
|
21
|
+
array.nitems.should == 8
|
22
|
+
|
23
|
+
[nil, empty, array].nitems.should == 2
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -1,6 +1,9 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
3
|
+
|
1
4
|
describe "Array#+" do
|
2
5
|
it "concatenates two arrays" do
|
3
|
-
([ 1, 2, 3 ] + [ 3, 4, 5 ]
|
6
|
+
([ 1, 2, 3 ] + [ 3, 4, 5 ]).should == [1, 2, 3, 3, 4, 5]
|
4
7
|
([ 1, 2, 3 ] + []).should == [1, 2, 3]
|
5
8
|
([] + [ 1, 2, 3 ]).should == [1, 2, 3]
|
6
9
|
([] + []).should == []
|
@@ -10,4 +13,47 @@ describe "Array#+" do
|
|
10
13
|
ary = [1, 2, 3]
|
11
14
|
(ary + ary).should == [1, 2, 3, 1, 2, 3]
|
12
15
|
end
|
13
|
-
|
16
|
+
|
17
|
+
pending "tries to convert the passed argument to an Array using #to_ary" do
|
18
|
+
obj = mock('["x", "y"]')
|
19
|
+
obj.should_receive(:to_ary).and_return(["x", "y"])
|
20
|
+
([1, 2, 3] + obj).should == [1, 2, 3, "x", "y"]
|
21
|
+
end
|
22
|
+
|
23
|
+
pending "properly handles recursive arrays" do
|
24
|
+
empty = ArraySpecs.empty_recursive_array
|
25
|
+
(empty + empty).should == [empty, empty]
|
26
|
+
|
27
|
+
array = ArraySpecs.recursive_array
|
28
|
+
(empty + array).should == [empty, 1, 'two', 3.0, array, array, array, array, array]
|
29
|
+
(array + array).should == [
|
30
|
+
1, 'two', 3.0, array, array, array, array, array,
|
31
|
+
1, 'two', 3.0, array, array, array, array, array]
|
32
|
+
end
|
33
|
+
|
34
|
+
it "does return subclass instances with Array subclasses" do
|
35
|
+
(ArraySpecs::MyArray[1, 2, 3] + []).should be_kind_of(Array)
|
36
|
+
(ArraySpecs::MyArray[1, 2, 3] + ArraySpecs::MyArray[]).should be_kind_of(Array)
|
37
|
+
([1, 2, 3] + ArraySpecs::MyArray[]).should be_kind_of(Array)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "does not call to_ary on array subclasses" do
|
41
|
+
([5, 6] + ArraySpecs::ToAryArray[1, 2]).should == [5, 6, 1, 2]
|
42
|
+
end
|
43
|
+
|
44
|
+
pending "does not get infected even if an original array is tainted" do
|
45
|
+
([1, 2] + [3, 4]).tainted?.should be_false
|
46
|
+
([1, 2].taint + [3, 4]).tainted?.should be_false
|
47
|
+
([1, 2] + [3, 4].taint).tainted?.should be_false
|
48
|
+
([1, 2].taint + [3, 4].taint).tainted?.should be_false
|
49
|
+
end
|
50
|
+
|
51
|
+
ruby_version_is '1.9' do
|
52
|
+
pending "does not infected even if an original array is untrusted" do
|
53
|
+
([1, 2] + [3, 4]).untrusted?.should be_false
|
54
|
+
([1, 2].untrust + [3, 4]).untrusted?.should be_false
|
55
|
+
([1, 2] + [3, 4].untrust).untrusted?.should be_false
|
56
|
+
([1, 2].untrust + [3, 4].untrust).untrusted?.should be_false
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
data/spec/core/array/pop_spec.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
3
|
+
|
1
4
|
describe "Array#pop" do
|
2
5
|
it "removes and returns the last element of the array" do
|
3
6
|
a = ["a", 1, nil, true]
|
@@ -19,58 +22,175 @@ describe "Array#pop" do
|
|
19
22
|
[].pop.should == nil
|
20
23
|
end
|
21
24
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
a.pop(0).should == []
|
27
|
-
a.should == [1, 2, 3, 4, 5, 6]
|
25
|
+
pending "properly handles recursive arrays" do
|
26
|
+
empty = ArraySpecs.empty_recursive_array
|
27
|
+
empty.pop.should == []
|
28
28
|
|
29
|
-
|
30
|
-
|
29
|
+
array = ArraySpecs.recursive_array
|
30
|
+
array.pop.should == [1, 'two', 3.0, array, array, array, array]
|
31
|
+
end
|
31
32
|
|
32
|
-
|
33
|
-
|
33
|
+
pending "keeps taint status" do
|
34
|
+
a = [1, 2].taint
|
35
|
+
a.pop
|
36
|
+
a.tainted?.should be_true
|
37
|
+
a.pop
|
38
|
+
a.tainted?.should be_true
|
39
|
+
end
|
34
40
|
|
35
|
-
|
36
|
-
|
41
|
+
ruby_version_is '' ... '1.9' do
|
42
|
+
it "raises a TypeError on a frozen array" do
|
43
|
+
lambda { ArraySpecs.frozen_array.pop }.should raise_error(TypeError)
|
37
44
|
end
|
38
|
-
|
39
|
-
|
40
|
-
a = [1, 2, 3, 4]
|
41
|
-
a.shift
|
42
|
-
a.pop(3).should == [2, 3, 4]
|
45
|
+
it "raises a TypeError on an empty frozen array" do
|
46
|
+
lambda { ArraySpecs.empty_frozen_array.pop }.should raise_error(TypeError)
|
43
47
|
end
|
48
|
+
end
|
44
49
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
a.should == []
|
50
|
-
|
51
|
-
popped2 = a.pop(2)
|
52
|
-
popped2.should == []
|
53
|
-
a.should == []
|
50
|
+
ruby_version_is '1.9' do
|
51
|
+
it "raises a RuntimeError on a frozen array" do
|
52
|
+
lambda { ArraySpecs.frozen_array.pop }.should raise_error(RuntimeError)
|
53
|
+
end
|
54
54
|
|
55
|
-
|
55
|
+
it "raises a RuntimeError on an empty frozen array" do
|
56
|
+
lambda { ArraySpecs.empty_frozen_array.pop }.should raise_error(RuntimeError)
|
56
57
|
end
|
57
58
|
|
58
|
-
|
59
|
-
a = [1, 2
|
60
|
-
a.pop
|
61
|
-
a.should
|
59
|
+
pending "keeps untrusted status" do
|
60
|
+
a = [1, 2].untrust
|
61
|
+
a.pop
|
62
|
+
a.untrusted?.should be_true
|
63
|
+
a.pop
|
64
|
+
a.untrusted?.should be_true
|
62
65
|
end
|
66
|
+
end
|
63
67
|
|
64
|
-
|
65
|
-
|
66
|
-
|
68
|
+
ruby_version_is '' ... '1.8.7' do
|
69
|
+
it "raises an ArgumentError if passed an argument" do
|
70
|
+
lambda{ [1, 2].pop(1) }.should raise_error(ArgumentError)
|
71
|
+
end
|
72
|
+
end
|
67
73
|
|
68
|
-
|
69
|
-
|
74
|
+
describe "passed a number n as an argument" do
|
75
|
+
ruby_version_is '1.8.7' do
|
76
|
+
it "removes and returns an array with the last n elements of the array" do
|
77
|
+
a = [1, 2, 3, 4, 5, 6]
|
78
|
+
|
79
|
+
a.pop(0).should == []
|
80
|
+
a.should == [1, 2, 3, 4, 5, 6]
|
81
|
+
|
82
|
+
a.pop(1).should == [6]
|
83
|
+
a.should == [1, 2, 3, 4, 5]
|
84
|
+
|
85
|
+
a.pop(2).should == [4, 5]
|
86
|
+
a.should == [1, 2, 3]
|
87
|
+
|
88
|
+
a.pop(3).should == [1, 2, 3]
|
89
|
+
a.should == []
|
90
|
+
end
|
91
|
+
|
92
|
+
it "returns an array with the last n elements even if shift was invoked" do
|
93
|
+
a = [1, 2, 3, 4]
|
94
|
+
a.shift
|
95
|
+
a.pop(3).should == [2, 3, 4]
|
96
|
+
end
|
97
|
+
|
98
|
+
it "returns a new empty array if there are no more elements" do
|
99
|
+
a = []
|
100
|
+
popped1 = a.pop(1)
|
101
|
+
popped1.should == []
|
102
|
+
a.should == []
|
103
|
+
|
104
|
+
popped2 = a.pop(2)
|
105
|
+
popped2.should == []
|
106
|
+
a.should == []
|
107
|
+
|
108
|
+
popped1.should_not equal(popped2)
|
109
|
+
end
|
110
|
+
|
111
|
+
it "returns whole elements if n exceeds size of the array" do
|
112
|
+
a = [1, 2, 3, 4, 5]
|
113
|
+
a.pop(6).should == [1, 2, 3, 4, 5]
|
114
|
+
a.should == []
|
115
|
+
end
|
116
|
+
|
117
|
+
it "does not return self even when it returns whole elements" do
|
118
|
+
a = [1, 2, 3, 4, 5]
|
119
|
+
a.pop(5).should_not equal(a)
|
120
|
+
|
121
|
+
a = [1, 2, 3, 4, 5]
|
122
|
+
a.pop(6).should_not equal(a)
|
123
|
+
end
|
124
|
+
|
125
|
+
it "raises an ArgumentError if n is negative" do
|
126
|
+
lambda{ [1, 2, 3].pop(-1) }.should raise_error(ArgumentError)
|
127
|
+
end
|
128
|
+
|
129
|
+
it "tries to convert n to an Integer using #to_int" do
|
130
|
+
a = [1, 2, 3, 4]
|
131
|
+
a.pop(2.3).should == [3, 4]
|
132
|
+
|
133
|
+
obj = mock('to_int')
|
134
|
+
obj.should_receive(:to_int).and_return(2)
|
135
|
+
a.should == [1, 2]
|
136
|
+
a.pop(obj).should == [1, 2]
|
137
|
+
a.should == []
|
138
|
+
end
|
139
|
+
|
140
|
+
it "raises a TypeError when the passed n can be coerced to Integer" do
|
141
|
+
lambda{ [1, 2].pop("cat") }.should raise_error(TypeError)
|
142
|
+
lambda{ [1, 2].pop(nil) }.should raise_error(TypeError)
|
143
|
+
end
|
144
|
+
|
145
|
+
it "raises an ArgumentError if more arguments are passed" do
|
146
|
+
lambda{ [1, 2].pop(1, 2) }.should raise_error(ArgumentError)
|
147
|
+
end
|
148
|
+
|
149
|
+
it "does not return subclass instances with Array subclass" do
|
150
|
+
ArraySpecs::MyArray[1, 2, 3].pop(2).should be_kind_of(Array)
|
151
|
+
end
|
152
|
+
|
153
|
+
it "returns an untainted array even if the array is tainted" do
|
154
|
+
ary = [1, 2].taint
|
155
|
+
ary.pop(2).tainted?.should be_false
|
156
|
+
ary.pop(0).tainted?.should be_false
|
157
|
+
end
|
158
|
+
|
159
|
+
it "keeps taint status" do
|
160
|
+
a = [1, 2].taint
|
161
|
+
a.pop(2)
|
162
|
+
a.tainted?.should be_true
|
163
|
+
a.pop(2)
|
164
|
+
a.tainted?.should be_true
|
165
|
+
end
|
166
|
+
|
167
|
+
ruby_version_is '' ... '1.9' do
|
168
|
+
it "raises a TypeError on a frozen array" do
|
169
|
+
lambda { ArraySpecs.frozen_array.pop(2) }.should raise_error(TypeError)
|
170
|
+
lambda { ArraySpecs.frozen_array.pop(0) }.should raise_error(TypeError)
|
171
|
+
end
|
172
|
+
end
|
70
173
|
end
|
71
174
|
|
72
|
-
|
73
|
-
|
175
|
+
ruby_version_is '1.9' do
|
176
|
+
pending "returns a trusted array even if the array is untrusted" do
|
177
|
+
ary = [1, 2].untrust
|
178
|
+
ary.pop(2).untrusted?.should be_false
|
179
|
+
ary.pop(0).untrusted?.should be_false
|
180
|
+
end
|
181
|
+
|
182
|
+
it "raises a RuntimeError on a frozen array" do
|
183
|
+
lambda { ArraySpecs.frozen_array.pop(2) }.should raise_error(RuntimeError)
|
184
|
+
lambda { ArraySpecs.frozen_array.pop(0) }.should raise_error(RuntimeError)
|
185
|
+
end
|
186
|
+
|
187
|
+
pending "keeps untrusted status" do
|
188
|
+
a = [1, 2].untrust
|
189
|
+
a.pop(2)
|
190
|
+
a.untrusted?.should be_true
|
191
|
+
a.pop(2)
|
192
|
+
a.untrusted?.should be_true
|
193
|
+
end
|
74
194
|
end
|
75
195
|
end
|
76
|
-
end
|
196
|
+
end
|
@@ -1,3 +1,6 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
3
|
+
|
1
4
|
describe "Array#push" do
|
2
5
|
it "appends the arguments to the array" do
|
3
6
|
a = [ "a", "b", "c" ]
|
@@ -13,4 +16,29 @@ describe "Array#push" do
|
|
13
16
|
a.push("foo")
|
14
17
|
a.should == ["b", "c", "foo"]
|
15
18
|
end
|
16
|
-
|
19
|
+
|
20
|
+
pending "properly handles recursive arrays" do
|
21
|
+
empty = ArraySpecs.empty_recursive_array
|
22
|
+
empty.push(:last).should == [empty, :last]
|
23
|
+
|
24
|
+
array = ArraySpecs.recursive_array
|
25
|
+
array.push(:last).should == [1, 'two', 3.0, array, array, array, array, array, :last]
|
26
|
+
end
|
27
|
+
|
28
|
+
ruby_version_is "" ... "1.9" do
|
29
|
+
it "raises a TypeError on a frozen array if modification takes place" do
|
30
|
+
lambda { ArraySpecs.frozen_array.push(1) }.should raise_error(TypeError)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "does not raise on a frozen array if no modification is made" do
|
34
|
+
ArraySpecs.frozen_array.push.should == [1, 2, 3]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
ruby_version_is "1.9" do
|
39
|
+
it "raises a RuntimeError on a frozen array" do
|
40
|
+
lambda { ArraySpecs.frozen_array.push(1) }.should raise_error(RuntimeError)
|
41
|
+
lambda { ArraySpecs.frozen_array.push }.should raise_error(RuntimeError)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -1,9 +1,38 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
3
|
+
|
1
4
|
describe "Array#rassoc" do
|
2
|
-
it "returns the first contained array whose second element
|
5
|
+
it "returns the first contained array whose second element is == object" do
|
3
6
|
ary = [[1, "a", 0.5], [2, "b"], [3, "b"], [4, "c"], [], [5], [6, "d"]]
|
4
7
|
ary.rassoc("a").should == [1, "a", 0.5]
|
5
8
|
ary.rassoc("b").should == [2, "b"]
|
6
9
|
ary.rassoc("d").should == [6, "d"]
|
7
10
|
ary.rassoc("z").should == nil
|
8
11
|
end
|
9
|
-
|
12
|
+
|
13
|
+
pending "properly handles recursive arrays" do
|
14
|
+
empty = ArraySpecs.empty_recursive_array
|
15
|
+
empty.rassoc([]).should be_nil
|
16
|
+
[[empty, empty]].rassoc(empty).should == [empty, empty]
|
17
|
+
|
18
|
+
array = ArraySpecs.recursive_array
|
19
|
+
array.rassoc(array).should be_nil
|
20
|
+
[[empty, array]].rassoc(array).should == [empty, array]
|
21
|
+
end
|
22
|
+
|
23
|
+
pending "calls elem == obj on the second element of each contained array" do
|
24
|
+
key = 'foobar'
|
25
|
+
o = mock('foobar')
|
26
|
+
def o.==(other); other == 'foobar'; end
|
27
|
+
|
28
|
+
[[1, :foobar], [2, o], [3, mock('foo')]].rassoc(key).should == [2, o]
|
29
|
+
end
|
30
|
+
|
31
|
+
pending "does not check the last element in each contained but speficically the second" do
|
32
|
+
key = 'foobar'
|
33
|
+
o = mock('foobar')
|
34
|
+
def o.==(other); other == 'foobar'; end
|
35
|
+
|
36
|
+
[[1, :foobar, o], [2, o, 1], [3, mock('foo')]].rassoc(key).should == [2, o, 1]
|
37
|
+
end
|
38
|
+
end
|
@@ -1,3 +1,7 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
3
|
+
require File.expand_path('../shared/enumeratorize', __FILE__)
|
4
|
+
|
1
5
|
describe "Array#reject" do
|
2
6
|
it "returns a new array without elements for which block is true" do
|
3
7
|
ary = [1, 2, 3, 4, 5]
|
@@ -6,6 +10,7 @@ describe "Array#reject" do
|
|
6
10
|
ary.reject { false }.object_id.should_not == ary.object_id
|
7
11
|
ary.reject { nil }.should == ary
|
8
12
|
ary.reject { nil }.object_id.should_not == ary.object_id
|
13
|
+
ary.reject { 5 }.should == []
|
9
14
|
ary.reject { |i| i < 3 }.should == [3, 4, 5]
|
10
15
|
ary.reject { |i| i % 2 == 0 }.should == [1, 3, 5]
|
11
16
|
end
|
@@ -15,6 +20,46 @@ describe "Array#reject" do
|
|
15
20
|
array.shift
|
16
21
|
array.reject { |x| true }.should == []
|
17
22
|
end
|
23
|
+
|
24
|
+
pending "properly handles recursive arrays" do
|
25
|
+
empty = ArraySpecs.empty_recursive_array
|
26
|
+
empty.reject { false }.should == [empty]
|
27
|
+
empty.reject { true }.should == []
|
28
|
+
|
29
|
+
array = ArraySpecs.recursive_array
|
30
|
+
array.reject { false }.should == [1, 'two', 3.0, array, array, array, array, array]
|
31
|
+
array.reject { true }.should == []
|
32
|
+
end
|
33
|
+
|
34
|
+
ruby_version_is "" ... "1.9.3" do
|
35
|
+
not_compliant_on :ironruby do
|
36
|
+
it "returns subclass instance on Array subclasses" do
|
37
|
+
ArraySpecs::MyArray[1, 2, 3].reject { |x| x % 2 == 0 }.should be_kind_of(ArraySpecs::MyArray)
|
38
|
+
end
|
39
|
+
end if false
|
40
|
+
|
41
|
+
deviates_on :ironruby do
|
42
|
+
it "does not return subclass instance on Array subclasses" do
|
43
|
+
ArraySpecs::MyArray[1, 2, 3].reject { |x| x % 2 == 0 }.should be_kind_of(Array)
|
44
|
+
end
|
45
|
+
end if false
|
46
|
+
end
|
47
|
+
|
48
|
+
ruby_version_is "1.9.3" do
|
49
|
+
it "does not return subclass instance on Array subclasses" do
|
50
|
+
ArraySpecs::MyArray[1, 2, 3].reject { |x| x % 2 == 0 }.should be_kind_of(Array)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "does not retain instance variables" do
|
54
|
+
array = []
|
55
|
+
array.instance_variable_set("@variable", "value")
|
56
|
+
array.reject { false }.instance_variable_get("@variable").should == nil
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
pending do
|
61
|
+
it_behaves_like :enumeratorize, :reject
|
62
|
+
end
|
18
63
|
end
|
19
64
|
|
20
65
|
describe "Array#reject!" do
|
@@ -34,7 +79,27 @@ describe "Array#reject!" do
|
|
34
79
|
a.should == []
|
35
80
|
end
|
36
81
|
|
37
|
-
|
82
|
+
pending "properly handles recursive arrays" do
|
83
|
+
empty = ArraySpecs.empty_recursive_array
|
84
|
+
empty_dup = empty.dup
|
85
|
+
empty.reject! { false }.should == nil
|
86
|
+
empty.should == empty_dup
|
87
|
+
|
88
|
+
empty = ArraySpecs.empty_recursive_array
|
89
|
+
empty.reject! { true }.should == []
|
90
|
+
empty.should == []
|
91
|
+
|
92
|
+
array = ArraySpecs.recursive_array
|
93
|
+
array_dup = array.dup
|
94
|
+
array.reject! { false }.should == nil
|
95
|
+
array.should == array_dup
|
96
|
+
|
97
|
+
array = ArraySpecs.recursive_array
|
98
|
+
array.reject! { true }.should == []
|
99
|
+
array.should == []
|
100
|
+
end
|
101
|
+
|
102
|
+
it "returns nil when called on an Array emptied with #shift" do
|
38
103
|
array = [1]
|
39
104
|
array.shift
|
40
105
|
array.reject! { |x| true }.should == nil
|
@@ -48,4 +113,26 @@ describe "Array#reject!" do
|
|
48
113
|
a.reject! { true }
|
49
114
|
a.reject! { true }.should == nil
|
50
115
|
end
|
51
|
-
|
116
|
+
|
117
|
+
ruby_version_is "" ... "1.9" do
|
118
|
+
it "raises a TypeError on a frozen array" do
|
119
|
+
lambda { ArraySpecs.frozen_array.reject! {} }.should raise_error(TypeError)
|
120
|
+
end
|
121
|
+
it "raises a TypeError on an empty frozen array" do
|
122
|
+
lambda { ArraySpecs.empty_frozen_array.reject! {} }.should raise_error(TypeError)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
ruby_version_is "1.9" do
|
127
|
+
it "raises a RuntimeError on a frozen array" do
|
128
|
+
lambda { ArraySpecs.frozen_array.reject! {} }.should raise_error(RuntimeError)
|
129
|
+
end
|
130
|
+
it "raises a RuntimeError on an empty frozen array" do
|
131
|
+
lambda { ArraySpecs.empty_frozen_array.reject! {} }.should raise_error(RuntimeError)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
pending do
|
136
|
+
it_behaves_like :enumeratorize, :reject!
|
137
|
+
end
|
138
|
+
end
|