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
@@ -1,10 +1,90 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
3
|
+
|
1
4
|
describe "Array#flatten" do
|
2
5
|
it "returns a one-dimensional flattening recursively" do
|
3
|
-
[[[1, [2, 3]],
|
6
|
+
[[[1, [2, 3]],[2, 3, [4, [4, [5, 5]], [1, 2, 3]]], [4]], []].flatten.should == [1, 2, 3, 2, 3, 4, 4, 5, 5, 1, 2, 3, 4]
|
7
|
+
end
|
8
|
+
|
9
|
+
ruby_version_is "1.8.7" do
|
10
|
+
it "takes an optional argument that determines the level of recursion" do
|
11
|
+
[ 1, 2, [3, [4, 5] ] ].flatten(1).should == [1, 2, 3, [4, 5]]
|
12
|
+
end
|
13
|
+
|
14
|
+
ruby_version_is ""..."1.9" do
|
15
|
+
it "returns self when the level of recursion is 0" do
|
16
|
+
a = [ 1, 2, [3, [4, 5] ] ]
|
17
|
+
a.flatten(0).should equal(a)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
ruby_version_is "1.9" do
|
22
|
+
it "returns dup when the level of recursion is 0" do
|
23
|
+
a = [ 1, 2, [3, [4, 5] ] ]
|
24
|
+
a.flatten(0).should == a
|
25
|
+
a.flatten(0).should_not equal(a)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
it "ignores negative levels" do
|
30
|
+
[ 1, 2, [ 3, 4, [5, 6] ] ].flatten(-1).should == [1, 2, 3, 4, 5, 6]
|
31
|
+
[ 1, 2, [ 3, 4, [5, 6] ] ].flatten(-10).should == [1, 2, 3, 4, 5, 6]
|
32
|
+
end
|
33
|
+
|
34
|
+
it "tries to convert passed Objects to Integers using #to_int" do
|
35
|
+
obj = mock("Converted to Integer")
|
36
|
+
obj.should_receive(:to_int).and_return(1)
|
37
|
+
|
38
|
+
[ 1, 2, [3, [4, 5] ] ].flatten(obj).should == [1, 2, 3, [4, 5]]
|
39
|
+
end
|
40
|
+
|
41
|
+
it "raises a TypeError when the passed Object can't be converted to an Integer" do
|
42
|
+
obj = mock("Not converted")
|
43
|
+
lambda { [ 1, 2, [3, [4, 5] ] ].flatten(obj) }.should raise_error(TypeError)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
it "does not call flatten on elements" do
|
48
|
+
obj = mock('[1,2]')
|
49
|
+
obj.should_not_receive(:flatten)
|
50
|
+
[obj, obj].flatten.should == [obj, obj]
|
51
|
+
|
52
|
+
obj = [5, 4]
|
53
|
+
obj.should_not_receive(:flatten)
|
54
|
+
[obj, obj].flatten.should == [5, 4, 5, 4]
|
4
55
|
end
|
5
56
|
|
6
|
-
it "
|
7
|
-
|
57
|
+
it "raises an ArgumentError on recursive arrays" do
|
58
|
+
x = []
|
59
|
+
x << x
|
60
|
+
lambda { x.flatten }.should raise_error(ArgumentError)
|
61
|
+
|
62
|
+
x = []
|
63
|
+
y = []
|
64
|
+
x << y
|
65
|
+
y << x
|
66
|
+
lambda { x.flatten }.should raise_error(ArgumentError)
|
67
|
+
end
|
68
|
+
|
69
|
+
it "flattens any element which responds to #to_ary, using the return value of said method" do
|
70
|
+
x = mock("[3,4]")
|
71
|
+
x.should_receive(:to_ary).at_least(:once).and_return([3, 4])
|
72
|
+
[1, 2, x, 5].flatten.should == [1, 2, 3, 4, 5]
|
73
|
+
|
74
|
+
y = mock("MyArray[]")
|
75
|
+
y.should_receive(:to_ary).at_least(:once).and_return(ArraySpecs::MyArray[])
|
76
|
+
[y].flatten.should == []
|
77
|
+
|
78
|
+
z = mock("[2,x,y,5]")
|
79
|
+
z.should_receive(:to_ary).and_return([2, x, y, 5])
|
80
|
+
[1, z, 6].flatten.should == [1, 2, 3, 4, 5, 6]
|
81
|
+
end
|
82
|
+
|
83
|
+
it "returns subclass instance for Array subclasses" do
|
84
|
+
ArraySpecs::MyArray[].flatten.should be_kind_of(ArraySpecs::MyArray)
|
85
|
+
ArraySpecs::MyArray[1, 2, 3].flatten.should be_kind_of(ArraySpecs::MyArray)
|
86
|
+
ArraySpecs::MyArray[1, [2], 3].flatten.should be_kind_of(ArraySpecs::MyArray)
|
87
|
+
[ArraySpecs::MyArray[1, 2, 3]].flatten.should be_kind_of(Array)
|
8
88
|
end
|
9
89
|
|
10
90
|
it "is not destructive" do
|
@@ -12,10 +92,30 @@ describe "Array#flatten" do
|
|
12
92
|
ary.flatten
|
13
93
|
ary.should == [1, [2, 3]]
|
14
94
|
end
|
95
|
+
|
96
|
+
describe "with a non-Array object in the Array" do
|
97
|
+
before :each do
|
98
|
+
@obj = mock("Array#flatten")
|
99
|
+
end
|
100
|
+
|
101
|
+
it "does not call #to_ary if the method does not exist" do
|
102
|
+
[@obj].flatten.should == [@obj]
|
103
|
+
end
|
104
|
+
|
105
|
+
it "ignores the return value of #to_ary if it is nil" do
|
106
|
+
@obj.should_receive(:to_ary).and_return(nil)
|
107
|
+
[@obj].flatten.should == [@obj]
|
108
|
+
end
|
109
|
+
|
110
|
+
it "raises a TypeError if the return value of #to_ary is not an Array" do
|
111
|
+
@obj.should_receive(:to_ary).and_return(1)
|
112
|
+
lambda { [@obj].flatten }.should raise_error(TypeError)
|
113
|
+
end
|
114
|
+
end
|
15
115
|
end
|
16
116
|
|
17
117
|
describe "Array#flatten!" do
|
18
|
-
it "
|
118
|
+
it "modifies array to produce a one-dimensional flattening recursively" do
|
19
119
|
a = [[[1, [2, 3]],[2, 3, [4, [4, [5, 5]], [1, 2, 3]]], [4]], []]
|
20
120
|
a.flatten!
|
21
121
|
a.should == [1, 2, 3, 2, 3, 4, 4, 5, 5, 1, 2, 3, 4]
|
@@ -33,7 +133,100 @@ describe "Array#flatten!" do
|
|
33
133
|
a.flatten!.should_not == nil
|
34
134
|
end
|
35
135
|
|
36
|
-
|
37
|
-
|
136
|
+
ruby_version_is "1.8.7" do
|
137
|
+
it "takes an optional argument that determines the level of recursion" do
|
138
|
+
[ 1, 2, [3, [4, 5] ] ].flatten!(1).should == [1, 2, 3, [4, 5]]
|
139
|
+
end
|
140
|
+
|
141
|
+
ruby_bug "redmine #1440", "1.9.1" do
|
142
|
+
it "returns nil when the level of recursion is 0" do
|
143
|
+
a = [ 1, 2, [3, [4, 5] ] ]
|
144
|
+
a.flatten!(0).should == nil
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
it "treats negative levels as no arguments" do
|
149
|
+
[ 1, 2, [ 3, 4, [5, 6] ] ].flatten!(-1).should == [1, 2, 3, 4, 5, 6]
|
150
|
+
[ 1, 2, [ 3, 4, [5, 6] ] ].flatten!(-10).should == [1, 2, 3, 4, 5, 6]
|
151
|
+
end
|
152
|
+
|
153
|
+
it "tries to convert passed Objects to Integers using #to_int" do
|
154
|
+
obj = mock("Converted to Integer")
|
155
|
+
obj.should_receive(:to_int).and_return(1)
|
156
|
+
|
157
|
+
[ 1, 2, [3, [4, 5] ] ].flatten!(obj).should == [1, 2, 3, [4, 5]]
|
158
|
+
end
|
159
|
+
|
160
|
+
it "raises a TypeError when the passed Object can't be converted to an Integer" do
|
161
|
+
obj = mock("Not converted")
|
162
|
+
lambda { [ 1, 2, [3, [4, 5] ] ].flatten!(obj) }.should raise_error(TypeError)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
it "does not call flatten! on elements" do
|
167
|
+
obj = mock('[1,2]')
|
168
|
+
obj.should_not_receive(:flatten!)
|
169
|
+
[obj, obj].flatten!.should == nil
|
170
|
+
|
171
|
+
obj = [5, 4]
|
172
|
+
obj.should_not_receive(:flatten!)
|
173
|
+
[obj, obj].flatten!.should == [5, 4, 5, 4]
|
174
|
+
end
|
175
|
+
|
176
|
+
it "raises an ArgumentError on recursive arrays" do
|
177
|
+
x = []
|
178
|
+
x << x
|
179
|
+
lambda { x.flatten! }.should raise_error(ArgumentError)
|
180
|
+
|
181
|
+
x = []
|
182
|
+
y = []
|
183
|
+
x << y
|
184
|
+
y << x
|
185
|
+
lambda { x.flatten! }.should raise_error(ArgumentError)
|
38
186
|
end
|
39
|
-
|
187
|
+
|
188
|
+
it "flattens any elements which responds to #to_ary, using the return value of said method" do
|
189
|
+
x = mock("[3,4]")
|
190
|
+
x.should_receive(:to_ary).at_least(:once).and_return([3, 4])
|
191
|
+
[1, 2, x, 5].flatten!.should == [1, 2, 3, 4, 5]
|
192
|
+
|
193
|
+
y = mock("MyArray[]")
|
194
|
+
y.should_receive(:to_ary).at_least(:once).and_return(ArraySpecs::MyArray[])
|
195
|
+
[y].flatten!.should == []
|
196
|
+
|
197
|
+
z = mock("[2,x,y,5]")
|
198
|
+
z.should_receive(:to_ary).and_return([2, x, y, 5])
|
199
|
+
[1, z, 6].flatten!.should == [1, 2, 3, 4, 5, 6]
|
200
|
+
|
201
|
+
ary = [ArraySpecs::MyArray[1, 2, 3]]
|
202
|
+
ary.flatten!
|
203
|
+
ary.should be_kind_of(Array)
|
204
|
+
ary.should == [1, 2, 3]
|
205
|
+
end
|
206
|
+
|
207
|
+
ruby_version_is ""..."1.9" do
|
208
|
+
it "raises a TypeError on frozen arrays when the array is modified" do
|
209
|
+
nested_ary = [1, 2, []]
|
210
|
+
nested_ary.freeze
|
211
|
+
lambda { nested_ary.flatten! }.should raise_error(TypeError)
|
212
|
+
end
|
213
|
+
|
214
|
+
it "does not raise on frozen arrays when the array would not be modified" do
|
215
|
+
ArraySpecs.frozen_array.flatten!.should be_nil
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
ruby_version_is "1.9" do
|
220
|
+
it "raises a RuntimeError on frozen arrays when the array is modified" do
|
221
|
+
nested_ary = [1, 2, []]
|
222
|
+
nested_ary.freeze
|
223
|
+
lambda { nested_ary.flatten! }.should raise_error(RuntimeError)
|
224
|
+
end
|
225
|
+
|
226
|
+
# see [ruby-core:23663]
|
227
|
+
it "raises a RuntimeError on frozen arrays when the array would not be modified" do
|
228
|
+
lambda { ArraySpecs.frozen_array.flatten! }.should raise_error(RuntimeError)
|
229
|
+
lambda { ArraySpecs.empty_frozen_array.flatten! }.should raise_error(RuntimeError)
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
3
|
+
|
4
|
+
describe "Array#frozen?" do
|
5
|
+
it "returns true if array is frozen" do
|
6
|
+
a = [1, 2, 3]
|
7
|
+
a.frozen?.should == false
|
8
|
+
a.freeze
|
9
|
+
a.frozen?.should == true
|
10
|
+
end
|
11
|
+
|
12
|
+
not_compliant_on :rubinius do
|
13
|
+
ruby_version_is "" .. "1.9" do
|
14
|
+
it "returns true for an array being sorted by #sort!" do
|
15
|
+
a = [1, 2, 3]
|
16
|
+
a.sort! { |x,y| a.frozen?.should == true; x <=> y }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
ruby_version_is "1.9" do
|
21
|
+
it "returns false for an array being sorted by #sort!" do
|
22
|
+
a = [1, 2, 3]
|
23
|
+
a.sort! { |x,y| a.frozen?.should == false; x <=> y }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
it "returns false for an array being sorted by #sort" do
|
28
|
+
a = [1, 2, 3]
|
29
|
+
a.sort { |x,y| a.frozen?.should == false; x <=> y }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
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#include?" do
|
2
5
|
it "returns true if object is present, false otherwise" do
|
3
6
|
[1, 2, "a", "b"].include?("c").should == false
|
@@ -15,4 +18,16 @@ describe "Array#include?" do
|
|
15
18
|
|
16
19
|
[1, 2.0, 3].include?(2).should == true
|
17
20
|
end
|
18
|
-
|
21
|
+
|
22
|
+
it "calls == on elements from left to right until success" do
|
23
|
+
key = "x"
|
24
|
+
one = mock('one')
|
25
|
+
two = mock('two')
|
26
|
+
three = mock('three')
|
27
|
+
one.should_receive(:==).any_number_of_times.and_return(false)
|
28
|
+
two.should_receive(:==).any_number_of_times.and_return(true)
|
29
|
+
three.should_not_receive(:==)
|
30
|
+
ary = [one, two, three]
|
31
|
+
ary.include?(key).should == true
|
32
|
+
end
|
33
|
+
end
|
@@ -1,26 +1,6 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
[1, 2, 3, 4, 5, 6].index(3).should == 2
|
4
|
-
[1, 2, 3, 4, 5, 6].index(4).should == 3
|
5
|
-
end
|
6
|
-
|
7
|
-
it "returns 0 if first element == to object" do
|
8
|
-
[2, 1, 3, 2, 5].index(2).should == 0
|
9
|
-
end
|
10
|
-
|
11
|
-
it "returns size-1 if only last element == to object" do
|
12
|
-
[2, 1, 3, 1, 5].index(5).should == 4
|
13
|
-
end
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
require File.expand_path('../shared/index', __FILE__)
|
14
3
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
it "accepts a block instead of an argument" do
|
20
|
-
[4, 2, 1, 5, 1, 3].index { |x| x < 2 }.should == 2
|
21
|
-
end
|
22
|
-
|
23
|
-
it "ignores the block if there is an argument" do
|
24
|
-
[4, 2, 1, 5, 1, 3].index(5) { |x| x < 2 }.should == 3
|
25
|
-
end
|
26
|
-
end
|
4
|
+
describe "Array#index" do
|
5
|
+
it_behaves_like(:array_index, :index)
|
6
|
+
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#insert" do
|
2
5
|
it "returns self" do
|
3
6
|
ary = []
|
@@ -43,14 +46,45 @@ describe "Array#insert" do
|
|
43
46
|
end
|
44
47
|
|
45
48
|
it "raises an IndexError if the negative index is out of bounds" do
|
46
|
-
lambda { [].insert(-2, 1)
|
49
|
+
lambda { [].insert(-2, 1) }.should raise_error(IndexError)
|
47
50
|
lambda { [1].insert(-3, 2) }.should raise_error(IndexError)
|
48
51
|
end
|
49
52
|
|
50
|
-
it "does nothing
|
53
|
+
it "does nothing of no object is passed" do
|
51
54
|
[].insert(0).should == []
|
52
55
|
[].insert(-1).should == []
|
53
56
|
[].insert(10).should == []
|
54
57
|
[].insert(-2).should == []
|
55
58
|
end
|
56
|
-
|
59
|
+
|
60
|
+
it "tries to convert the passed position argument to an Integer using #to_int" do
|
61
|
+
obj = mock('2')
|
62
|
+
obj.should_receive(:to_int).and_return(2)
|
63
|
+
[].insert(obj, 'x').should == [nil, nil, 'x']
|
64
|
+
end
|
65
|
+
|
66
|
+
it "raises an ArgumentError if no argument passed" do
|
67
|
+
lambda { [].insert() }.should raise_error(ArgumentError)
|
68
|
+
end
|
69
|
+
|
70
|
+
ruby_version_is ""..."1.9" do
|
71
|
+
it "raises a TypeError on frozen arrays when the array is modified" do
|
72
|
+
lambda { ArraySpecs.frozen_array.insert(0, 'x') }.should raise_error(TypeError)
|
73
|
+
end
|
74
|
+
|
75
|
+
it "does not raise on frozen arrays when the array would not be modified" do
|
76
|
+
ArraySpecs.frozen_array.insert(0).should == [1, 2, 3]
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
ruby_version_is "1.9" do
|
81
|
+
it "raises a RuntimeError on frozen arrays when the array is modified" do
|
82
|
+
lambda { ArraySpecs.frozen_array.insert(0, 'x') }.should raise_error(RuntimeError)
|
83
|
+
end
|
84
|
+
|
85
|
+
# see [ruby-core:23666]
|
86
|
+
it "raises a RuntimeError on frozen arrays when the array would not be modified" do
|
87
|
+
lambda { ArraySpecs.frozen_array.insert(0) }.should raise_error(RuntimeError)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -1,13 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
end
|
5
|
-
|
6
|
-
it "returns '[]' for an empty Array" do
|
7
|
-
[].inspect.should == "[]"
|
8
|
-
end
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
3
|
+
require File.expand_path('../shared/inspect', __FILE__)
|
9
4
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
end
|
5
|
+
describe "Array#inspect" do
|
6
|
+
it_behaves_like :array_inspect, :inspect
|
7
|
+
end
|
@@ -1,17 +1,20 @@
|
|
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 "creates an array with elements common to both arrays (intersection)" do
|
3
6
|
([] & []).should == []
|
4
7
|
([1, 2] & []).should == []
|
5
8
|
([] & [1, 2]).should == []
|
6
|
-
([1, 3, 5] & [1, 2, 3]).should == [1, 3]
|
9
|
+
([ 1, 3, 5 ] & [ 1, 2, 3 ]).should == [1, 3]
|
7
10
|
end
|
8
11
|
|
9
12
|
it "creates an array with no duplicates" do
|
10
|
-
([1, 1, 3, 5] & [1, 2, 3]).uniq!.should == nil
|
13
|
+
([ 1, 1, 3, 5 ] & [ 1, 2, 3 ]).uniq!.should == nil
|
11
14
|
end
|
12
15
|
|
13
16
|
it "creates an array with elements in order they are first encountered" do
|
14
|
-
([1, 2, 3, 2, 5] & [5, 2, 3, 4]).should == [2, 3, 5]
|
17
|
+
([ 1, 2, 3, 2, 5 ] & [ 5, 2, 3, 4 ]).should == [2, 3, 5]
|
15
18
|
end
|
16
19
|
|
17
20
|
it "does not modify the original Array" do
|
@@ -19,4 +22,52 @@ describe "Array#&" do
|
|
19
22
|
a & [1, 2, 3]
|
20
23
|
a.should == [1, 1, 3, 5]
|
21
24
|
end
|
22
|
-
|
25
|
+
|
26
|
+
ruby_bug "ruby-core #1448", "1.9.1" do
|
27
|
+
it "properly handles recursive arrays" do
|
28
|
+
empty = ArraySpecs.empty_recursive_array
|
29
|
+
(empty & empty).should == empty
|
30
|
+
|
31
|
+
(ArraySpecs.recursive_array & []).should == []
|
32
|
+
([] & ArraySpecs.recursive_array).should == []
|
33
|
+
|
34
|
+
(ArraySpecs.recursive_array & ArraySpecs.recursive_array).should == [1, 'two', 3.0, ArraySpecs.recursive_array]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
it "tries to convert the passed argument to an Array using #to_ary" do
|
39
|
+
obj = mock('[1,2,3]')
|
40
|
+
obj.should_receive(:to_ary).and_return([1, 2, 3])
|
41
|
+
([1, 2] & obj).should == ([1, 2])
|
42
|
+
end
|
43
|
+
|
44
|
+
it "determines equivalence between elements in the sense of eql?" do
|
45
|
+
([5.0, 4.0] & [5, 4]).should == []
|
46
|
+
str = "x"
|
47
|
+
([str] & [str.dup]).should == [str]
|
48
|
+
|
49
|
+
obj1 = mock('1')
|
50
|
+
obj2 = mock('2')
|
51
|
+
def obj1.hash; 0; end
|
52
|
+
def obj2.hash; 0; end
|
53
|
+
def obj1.eql? a; true; end
|
54
|
+
def obj2.eql? a; true; end
|
55
|
+
|
56
|
+
([obj1] & [obj2]).should == [obj1]
|
57
|
+
|
58
|
+
def obj1.eql? a; false; end
|
59
|
+
def obj2.eql? a; false; end
|
60
|
+
|
61
|
+
([obj1] & [obj2]).should == []
|
62
|
+
end
|
63
|
+
|
64
|
+
it "does return subclass instances for Array subclasses" do
|
65
|
+
(ArraySpecs::MyArray[1, 2, 3] & []).should be_kind_of(Array)
|
66
|
+
(ArraySpecs::MyArray[1, 2, 3] & ArraySpecs::MyArray[1, 2, 3]).should be_kind_of(Array)
|
67
|
+
([] & ArraySpecs::MyArray[1, 2, 3]).should be_kind_of(Array)
|
68
|
+
end
|
69
|
+
|
70
|
+
it "does not call to_ary on array subclasses" do
|
71
|
+
([5, 6] & ArraySpecs::ToAryArray[1, 2, 5, 6]).should == [5, 6]
|
72
|
+
end
|
73
|
+
end
|