jactive_support 1.0.0-universal-java-1.6
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 +4 -0
- data/.rvmrc +63 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +20 -0
- data/Rakefile +45 -0
- data/jactive_support.gemspec +25 -0
- data/lib/jactive_support/constantize.rb +19 -0
- data/lib/jactive_support/core_ext/enum.rb +43 -0
- data/lib/jactive_support/core_ext/hash/assert_valid_params.rb +19 -0
- data/lib/jactive_support/core_ext/hash/with_keys_values.rb +9 -0
- data/lib/jactive_support/core_ext/hash.rb +2 -0
- data/lib/jactive_support/core_ext/locale.rb +28 -0
- data/lib/jactive_support/core_ext/module.rb +9 -0
- data/lib/jactive_support/core_ext/numeric.rb +7 -0
- data/lib/jactive_support/core_ext/ordering.rb +17 -0
- data/lib/jactive_support/core_ext/to_java.rb +9 -0
- data/lib/jactive_support/core_ext/to_java_date.rb +25 -0
- data/lib/jactive_support/core_ext/to_java_list.rb +11 -0
- data/lib/jactive_support/core_ext/to_java_map.rb +11 -0
- data/lib/jactive_support/core_ext.rb +4 -0
- data/lib/jactive_support/java_ext/date/calculations.rb +43 -0
- data/lib/jactive_support/java_ext/date/conversions.rb +135 -0
- data/lib/jactive_support/java_ext/date.rb +37 -0
- data/lib/jactive_support/java_ext/enum.rb +19 -0
- data/lib/jactive_support/java_ext/iterable.rb +74 -0
- data/lib/jactive_support/java_ext/iterator.rb +8 -0
- data/lib/jactive_support/java_ext/list.rb +65 -0
- data/lib/jactive_support/java_ext/list_iterator.rb +8 -0
- data/lib/jactive_support/java_ext/locale.rb +32 -0
- data/lib/jactive_support/java_ext/map/constructor.rb +35 -0
- data/lib/jactive_support/java_ext/map/hash.rb +166 -0
- data/lib/jactive_support/java_ext/map.rb +6 -0
- data/lib/jactive_support/java_ext/number.rb +91 -0
- data/lib/jactive_support/java_ext/sql_date/conversions.rb +33 -0
- data/lib/jactive_support/java_ext/sql_date.rb +7 -0
- data/lib/jactive_support/java_ext.rb +4 -0
- data/lib/jactive_support/json/encoders/collection.rb +12 -0
- data/lib/jactive_support/json/encoders/locale.rb +6 -0
- data/lib/jactive_support/json/encoders/map.rb +55 -0
- data/lib/jactive_support/json/encoding.rb +5 -0
- data/lib/jactive_support/json.rb +1 -0
- data/lib/jactive_support/rescuable.rb +62 -0
- data/lib/jactive_support/version.rb +3 -0
- data/lib/jactive_support.rb +5 -0
- data/spec/constantize_spec.rb +57 -0
- data/spec/core_ext/hash_spec.rb +34 -0
- data/spec/core_ext/module_spec.rb +19 -0
- data/spec/core_ext/ordering_spec.rb +12 -0
- data/spec/enum_spec.rb +67 -0
- data/spec/java_ext/iterable/clear_spec.rb +56 -0
- data/spec/java_ext/iterable/delete_if_spec.rb +71 -0
- data/spec/java_ext/iterable/empty_spec.rb +10 -0
- data/spec/java_ext/iterable/reject_spec.rb +76 -0
- data/spec/java_ext/iterable/shared/enumeratorize.rb +12 -0
- data/spec/java_ext/iterable/shared/fixtures.rb +90 -0
- data/spec/java_ext/iterable/shift_spec.rb +160 -0
- data/spec/java_ext/list/clear_spec.rb +56 -0
- data/spec/java_ext/list/collect_spec.rb +11 -0
- data/spec/java_ext/list/last_spec.rb +87 -0
- data/spec/java_ext/list/map_spec.rb +11 -0
- data/spec/java_ext/list/push_spec.rb +44 -0
- data/spec/java_ext/list/shared/collect.rb +133 -0
- data/spec/java_ext/list/shared/fixtures.rb +34 -0
- data/spec/java_ext/map/assoc_spec.rb +43 -0
- data/spec/java_ext/map/clear_spec.rb +49 -0
- data/spec/java_ext/map/clone_spec.rb +13 -0
- data/spec/java_ext/map/compare_by_identity_spec.rb +111 -0
- data/spec/java_ext/map/constructor_spec.rb +54 -0
- data/spec/java_ext/map/delete_if_spec.rb +54 -0
- data/spec/java_ext/map/delete_spec.rb +38 -0
- data/spec/java_ext/map/each_key_spec.rb +29 -0
- data/spec/java_ext/map/each_pair_spec.rb +38 -0
- data/spec/java_ext/map/each_spec.rb +9 -0
- data/spec/java_ext/map/each_value_spec.rb +28 -0
- data/spec/java_ext/map/element_reference_spec.rb +119 -0
- data/spec/java_ext/map/element_set_spec.rb +7 -0
- data/spec/java_ext/map/empty_spec.rb +15 -0
- data/spec/java_ext/map/eql_spec.rb +19 -0
- data/spec/java_ext/map/equal_value_spec.rb +18 -0
- data/spec/java_ext/map/fetch_spec.rb +35 -0
- data/spec/java_ext/map/fixtures/classes.rb +36 -0
- data/spec/java_ext/map/flatten_spec.rb +64 -0
- data/spec/java_ext/map/has_key_spec.rb +8 -0
- data/spec/java_ext/map/has_value_spec.rb +8 -0
- data/spec/java_ext/map/hash_spec.rb +53 -0
- data/spec/java_ext/map/include_spec.rb +7 -0
- data/spec/java_ext/map/index_spec.rb +7 -0
- data/spec/java_ext/map/indexes_spec.rb +9 -0
- data/spec/java_ext/map/indices_spec.rb +9 -0
- data/spec/java_ext/map/initialize_copy_spec.rb +13 -0
- data/spec/java_ext/map/initialize_spec.rb +64 -0
- data/spec/java_ext/map/inspect_spec.rb +9 -0
- data/spec/java_ext/map/invert_spec.rb +27 -0
- data/spec/java_ext/map/keep_if_spec.rb +33 -0
- data/spec/java_ext/map/key_spec.rb +14 -0
- data/spec/java_ext/map/keys_spec.rb +39 -0
- data/spec/java_ext/map/length_spec.rb +7 -0
- data/spec/java_ext/map/member_spec.rb +7 -0
- data/spec/java_ext/map/merge_spec.rb +69 -0
- data/spec/java_ext/map/rassoc_spec.rb +39 -0
- data/spec/java_ext/map/reject_spec.rb +123 -0
- data/spec/java_ext/map/replace_spec.rb +7 -0
- data/spec/java_ext/map/select_spec.rb +98 -0
- data/spec/java_ext/map/shared/each.rb +77 -0
- data/spec/java_ext/map/shared/eql.rb +224 -0
- data/spec/java_ext/map/shared/equal.rb +94 -0
- data/spec/java_ext/map/shared/index.rb +29 -0
- data/spec/java_ext/map/shared/iteration.rb +28 -0
- data/spec/java_ext/map/shared/key.rb +43 -0
- data/spec/java_ext/map/shared/length.rb +12 -0
- data/spec/java_ext/map/shared/replace.rb +82 -0
- data/spec/java_ext/map/shared/store.rb +68 -0
- data/spec/java_ext/map/shared/to_s.rb +68 -0
- data/spec/java_ext/map/shared/update.rb +95 -0
- data/spec/java_ext/map/shared/value.rb +16 -0
- data/spec/java_ext/map/shared/values_at.rb +12 -0
- data/spec/java_ext/map/shift_spec.rb +44 -0
- data/spec/java_ext/map/size_spec.rb +7 -0
- data/spec/java_ext/map/sort_spec.rb +17 -0
- data/spec/java_ext/map/store_spec.rb +7 -0
- data/spec/java_ext/map/to_a_spec.rb +29 -0
- data/spec/java_ext/map/to_hash_spec.rb +11 -0
- data/spec/java_ext/map/to_s_spec.rb +20 -0
- data/spec/java_ext/map/try_convert_spec.rb +32 -0
- data/spec/java_ext/map/update_spec.rb +7 -0
- data/spec/java_ext/map/value_spec.rb +8 -0
- data/spec/java_ext/map/values_at_spec.rb +7 -0
- data/spec/java_ext/map/values_spec.rb +10 -0
- data/spec/locale_spec.rb +77 -0
- data/spec/shared/fixtures.rb +7 -0
- data/spec/shared/version.rb +123 -0
- data/spec/spec_helper.rb +50 -0
- metadata +332 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
require 'jactive_support/java_ext/list'
|
|
2
|
+
require File.expand_path('../shared/fixtures', __FILE__)
|
|
3
|
+
|
|
4
|
+
describe "java::util::List#clear" do
|
|
5
|
+
it "removes all elements" do
|
|
6
|
+
a = List[1, 2, 3, 4]
|
|
7
|
+
a.clear.should equal(a)
|
|
8
|
+
a.should == List[]
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "returns self" do
|
|
12
|
+
a = List[1]
|
|
13
|
+
oid = a.object_id
|
|
14
|
+
a.clear.object_id.should == oid
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "leaves the List empty" do
|
|
18
|
+
a = List[1]
|
|
19
|
+
a.clear
|
|
20
|
+
a.empty?.should == true
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "keeps tainted status" do
|
|
24
|
+
a = List[1]
|
|
25
|
+
a.taint
|
|
26
|
+
a.tainted?.should be_true
|
|
27
|
+
a.clear
|
|
28
|
+
a.tainted?.should be_true
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "does not accept any arguments" do
|
|
32
|
+
lambda { List[1].clear(true) }.should raise_error(ArgumentError)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
ruby_version_is '1.9' do
|
|
36
|
+
it "keeps untrusted status" do
|
|
37
|
+
a = List[1]
|
|
38
|
+
a.untrust
|
|
39
|
+
a.untrusted?.should be_true
|
|
40
|
+
a.clear
|
|
41
|
+
a.untrusted?.should be_true
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
ruby_version_is '' ... '1.9' do
|
|
46
|
+
it "raises a TypeError on a frozen array" do
|
|
47
|
+
lambda { ListSpecs.frozen_list.clear }.should raise_error(TypeError)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
ruby_version_is '1.9' do
|
|
52
|
+
it "raises a RuntimeError on a frozen array" do
|
|
53
|
+
lambda { ListSpecs.frozen_list.clear }.should raise_error(RuntimeError)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
require 'jactive_support/java_ext/list'
|
|
2
|
+
require File.expand_path('../shared/fixtures', __FILE__)
|
|
3
|
+
require File.expand_path('../shared/collect', __FILE__)
|
|
4
|
+
|
|
5
|
+
describe "java::util::List#collect" do
|
|
6
|
+
it_behaves_like(:list_collect, :collect)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
describe "java::util::List#collect!" do
|
|
10
|
+
it_behaves_like(:list_collect_b, :collect!)
|
|
11
|
+
end
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
require 'jactive_support/java_ext/list'
|
|
2
|
+
require File.expand_path('../shared/fixtures', __FILE__)
|
|
3
|
+
|
|
4
|
+
describe "java::util::List#last" do
|
|
5
|
+
it "returns the last element" do
|
|
6
|
+
List[1, 1, 1, 1, 2].last.should == 2
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
it "returns nil if self is empty" do
|
|
10
|
+
List[].last.should == nil
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "returns the last count elements if given a count" do
|
|
14
|
+
List[1, 2, 3, 4, 5, 9].last(3).should == [4, 5, 9]
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "returns an empty list when passed a count on an empty list" do
|
|
18
|
+
List[].last(0).should == []
|
|
19
|
+
List[].last(1).should == []
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "returns an empty list when count == 0" do
|
|
23
|
+
List[1, 2, 3, 4, 5].last(0).should == []
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "returns an list containing the last element when passed count == 1" do
|
|
27
|
+
List[1, 2, 3, 4, 5].last(1).should == [5]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "raises an ArgumentError when count is negative" do
|
|
31
|
+
lambda { List[1, 2].last(-1) }.should raise_error(ArgumentError)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "returns the entire list when count > length" do
|
|
35
|
+
List[1, 2, 3, 4, 5, 9].last(10).should == [1, 2, 3, 4, 5, 9]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "returns an list which is independent to the original when passed count" do
|
|
39
|
+
ary = List[1, 2, 3, 4, 5]
|
|
40
|
+
ary.last(0).replace([1,2])
|
|
41
|
+
ary.should == List[1, 2, 3, 4, 5]
|
|
42
|
+
ary.last(1).replace([1,2])
|
|
43
|
+
ary.should == List[1, 2, 3, 4, 5]
|
|
44
|
+
ary.last(6).replace([1,2])
|
|
45
|
+
ary.should == List[1, 2, 3, 4, 5]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it "properly handles recursive lists" do
|
|
49
|
+
empty = ListSpecs.empty_recursive_list
|
|
50
|
+
empty.last.should equal(empty)
|
|
51
|
+
|
|
52
|
+
list = ListSpecs.recursive_list
|
|
53
|
+
list.last.should equal(list)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "tries to convert the passed argument to an Integer usinig #to_int" do
|
|
57
|
+
obj = mock('to_int')
|
|
58
|
+
obj.should_receive(:to_int).and_return(2)
|
|
59
|
+
List[1, 2, 3, 4, 5].last(obj).should == [4, 5]
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it "raises a TypeError if the passed argument is not numeric" do
|
|
63
|
+
lambda { List[1,2].last(nil) }.should raise_error(TypeError)
|
|
64
|
+
lambda { List[1,2].last("a") }.should raise_error(TypeError)
|
|
65
|
+
|
|
66
|
+
obj = mock("nonnumeric")
|
|
67
|
+
lambda { List[1,2].last(obj) }.should raise_error(TypeError)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "does not return subclass instance on List subclasses" do
|
|
71
|
+
List[].last(0).should be_kind_of(Array)
|
|
72
|
+
List[].last(2).should be_kind_of(Array)
|
|
73
|
+
List[1, 2, 3].last(0).should be_kind_of(Array)
|
|
74
|
+
List[1, 2, 3].last(1).should be_kind_of(Array)
|
|
75
|
+
List[1, 2, 3].last(2).should be_kind_of(Array)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it "is not destructive" do
|
|
79
|
+
a = List[1, 2, 3]
|
|
80
|
+
a.last
|
|
81
|
+
a.should == List[1, 2, 3]
|
|
82
|
+
a.last(2)
|
|
83
|
+
a.should == List[1, 2, 3]
|
|
84
|
+
a.last(3)
|
|
85
|
+
a.should == List[1, 2, 3]
|
|
86
|
+
end
|
|
87
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
require 'jactive_support/java_ext/list'
|
|
2
|
+
require File.expand_path('../shared/fixtures', __FILE__)
|
|
3
|
+
require File.expand_path('../shared/collect', __FILE__)
|
|
4
|
+
|
|
5
|
+
describe "java::util::List#map" do
|
|
6
|
+
it_behaves_like(:list_collect, :map)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
describe "java::util::List#map!" do
|
|
10
|
+
it_behaves_like(:list_collect_b, :map!)
|
|
11
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
require 'jactive_support/java_ext/list'
|
|
2
|
+
require File.expand_path('../shared/fixtures', __FILE__)
|
|
3
|
+
|
|
4
|
+
describe "java::util::List#push" do
|
|
5
|
+
it "appends the arguments to the list" do
|
|
6
|
+
a = List[ "a", "b", "c" ]
|
|
7
|
+
a.push("d", "e", "f").should equal(a)
|
|
8
|
+
a.push().should == List["a", "b", "c", "d", "e", "f"]
|
|
9
|
+
a.push(5)
|
|
10
|
+
a.should == List["a", "b", "c", "d", "e", "f", 5]
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "isn't confused by previous shift" do
|
|
14
|
+
a = List[ "a", "b", "c" ]
|
|
15
|
+
a.shift
|
|
16
|
+
a.push("foo")
|
|
17
|
+
a.should == List["b", "c", "foo"]
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "properly handles recursive lists" do
|
|
21
|
+
empty = ListSpecs.empty_recursive_list
|
|
22
|
+
empty.push(:last).should == List[empty, :last]
|
|
23
|
+
|
|
24
|
+
list = ListSpecs.recursive_list
|
|
25
|
+
list.push(:last).should == List[1, 'two', 3.0, list, list, list, list, list, :last]
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
ruby_version_is "" ... "1.9" do
|
|
29
|
+
it "raises a TypeError on a frozen list if modification takes place" do
|
|
30
|
+
lambda { ListSpecs.frozen_list.push(1) }.should raise_error(TypeError)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it "does not raise on a frozen list if no modification is made" do
|
|
34
|
+
ListSpecs.frozen_list.push.should == List[1, 2, 3]
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
ruby_version_is "1.9" do
|
|
39
|
+
it "raises a RuntimeError on a frozen list" do
|
|
40
|
+
lambda { ListSpecs.frozen_list.push(1) }.should raise_error(RuntimeError)
|
|
41
|
+
lambda { ListSpecs.frozen_list.push }.should raise_error(RuntimeError)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
shared_examples_for :list_collect do |method|
|
|
2
|
+
it "returns a copy of list with each element replaced by the value returned by block" do
|
|
3
|
+
a = List['a', 'b', 'c', 'd']
|
|
4
|
+
b = a.send(method) { |i| i + '!' }
|
|
5
|
+
b.should == ["a!", "b!", "c!", "d!"]
|
|
6
|
+
b.object_id.should_not == a.object_id
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
it "does not return subclass instance" do
|
|
10
|
+
List[1, 2, 3].send(method) { |x| x + 1 }.should be_kind_of(Array)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "does not change self" do
|
|
14
|
+
a = List['a', 'b', 'c', 'd']
|
|
15
|
+
b = a.send(method) { |i| i + '!' }
|
|
16
|
+
a.should == List['a', 'b', 'c', 'd']
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "returns the evaluated value of block if it broke in the block" do
|
|
20
|
+
a = List['a', 'b', 'c', 'd']
|
|
21
|
+
b = a.send(method) {|i|
|
|
22
|
+
if i == 'c'
|
|
23
|
+
break 0
|
|
24
|
+
else
|
|
25
|
+
i + '!'
|
|
26
|
+
end
|
|
27
|
+
}
|
|
28
|
+
b.should == 0
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
ruby_version_is '' ... '1.9' do
|
|
32
|
+
it 'returns a copy of self if no block given' do
|
|
33
|
+
a = List[1, 2, 3]
|
|
34
|
+
|
|
35
|
+
copy = a.send(method)
|
|
36
|
+
copy.should == a.to_a
|
|
37
|
+
copy.should_not equal(a)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
ruby_version_is '1.9' do
|
|
41
|
+
it "returns an Enumerator when no block given" do
|
|
42
|
+
a = List[1, 2, 3]
|
|
43
|
+
a.send(method).should be_an_instance_of(enumerator_class)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it "does not copy tainted status" do
|
|
48
|
+
a = List[1, 2, 3]
|
|
49
|
+
a.taint
|
|
50
|
+
a.send(method){|x| x}.tainted?.should be_false
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
ruby_version_is '1.9' do
|
|
54
|
+
it "does not copy untrusted status" do
|
|
55
|
+
a = List[1, 2, 3]
|
|
56
|
+
a.untrust
|
|
57
|
+
a.send(method){|x| x}.untrusted?.should be_false
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
shared_examples_for :list_collect_b do |method|
|
|
63
|
+
it "replaces each element with the value returned by block" do
|
|
64
|
+
a = List[7, 9, 3, 5]
|
|
65
|
+
a.send(method) { |i| i - 1 }.should equal(a)
|
|
66
|
+
a.should == List[6, 8, 2, 4]
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it "returns self" do
|
|
70
|
+
a = List[1, 2, 3, 4, 5]
|
|
71
|
+
b = a.send(method) {|i| i+1 }
|
|
72
|
+
a.object_id.should == b.object_id
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
it "returns the evaluated value of block but its contents is partially modified, if it broke in the block" do
|
|
76
|
+
a = List['a', 'b', 'c', 'd']
|
|
77
|
+
b = a.send(method) {|i|
|
|
78
|
+
if i == 'c'
|
|
79
|
+
break 0
|
|
80
|
+
else
|
|
81
|
+
i + '!'
|
|
82
|
+
end
|
|
83
|
+
}
|
|
84
|
+
b.should == 0
|
|
85
|
+
a.should == List['a!', 'b!', 'c', 'd']
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
ruby_version_is '' ... '1.8.7' do
|
|
89
|
+
it 'raises LocalJumpError if no block given' do
|
|
90
|
+
a = List[1, 2, 3]
|
|
91
|
+
lambda { a.send(method) }.should raise_error(LocalJumpError)
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
ruby_version_is '1.8.7' do
|
|
96
|
+
it "returns an Enumerator when no block given, and the enumerator can modify the original list" do
|
|
97
|
+
a = List[1, 2, 3]
|
|
98
|
+
enum = a.send(method)
|
|
99
|
+
enum.should be_an_instance_of(enumerator_class)
|
|
100
|
+
enum.each{|i| "#{i}!" }
|
|
101
|
+
a.should == List["1!", "2!", "3!"]
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
it "keeps tainted status" do
|
|
106
|
+
a = List[1, 2, 3]
|
|
107
|
+
a.taint
|
|
108
|
+
a.tainted?.should be_true
|
|
109
|
+
a.send(method){|x| x}
|
|
110
|
+
a.tainted?.should be_true
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
ruby_version_is '1.9' do
|
|
114
|
+
it "keeps untrusted status" do
|
|
115
|
+
a = List[1, 2, 3]
|
|
116
|
+
a.untrust
|
|
117
|
+
a.send(method){|x| x}
|
|
118
|
+
a.untrusted?.should be_true
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
ruby_version_is '' ... '1.9' do
|
|
123
|
+
it "raises a TypeError on a frozen list" do
|
|
124
|
+
lambda { ListSpecs.frozen_list.send(method) {} }.should raise_error(TypeError)
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
ruby_version_is '1.9' do
|
|
129
|
+
it "raises a RuntimeError on a frozen list" do
|
|
130
|
+
lambda { ListSpecs.frozen_list.send(method) {} }.should raise_error(RuntimeError)
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require File.expand_path('../../../../shared/version', __FILE__)
|
|
2
|
+
require File.expand_path('../../../../shared/fixtures', __FILE__)
|
|
3
|
+
|
|
4
|
+
class List < java::util::ArrayList
|
|
5
|
+
def self.[](*args)
|
|
6
|
+
new(args)
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
module ListSpecs
|
|
11
|
+
def self.frozen_list
|
|
12
|
+
frozen_array = List[1,2,3]
|
|
13
|
+
frozen_array.freeze
|
|
14
|
+
frozen_array
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def self.empty_frozen_list
|
|
18
|
+
frozen_array = List[]
|
|
19
|
+
frozen_array.freeze
|
|
20
|
+
frozen_array
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def self.recursive_list
|
|
24
|
+
a = List[1, 'two', 3.0]
|
|
25
|
+
5.times { a << a }
|
|
26
|
+
a
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def self.empty_recursive_list
|
|
30
|
+
a = List[]
|
|
31
|
+
a << a
|
|
32
|
+
a
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
|
2
|
+
|
|
3
|
+
ruby_version_is "1.9" do
|
|
4
|
+
describe "Hash#assoc" do
|
|
5
|
+
before(:each) do
|
|
6
|
+
@h = {:apple => :green, :orange => :orange, :grape => :green, :banana => :yellow}
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
it "returns an Array if the argument is == to a key of the Hash" do
|
|
10
|
+
@h.assoc(:apple).should be_an_instance_of(Array)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "returns a 2-element Array if the argument is == to a key of the Hash" do
|
|
14
|
+
@h.assoc(:grape).size.should == 2
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "sets the first element of the Array to the located key" do
|
|
18
|
+
@h.assoc(:banana).first.should == :banana
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "sets the last element of the Array to the value of the located key" do
|
|
22
|
+
@h.assoc(:banana).last.should == :yellow
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "only returns the first matching key-value pair for identity hashes" do
|
|
26
|
+
@h.compare_by_identity
|
|
27
|
+
@h['pear'] = :red
|
|
28
|
+
@h['pear'] = :green
|
|
29
|
+
@h.keys.grep(/pear/).size.should == 2
|
|
30
|
+
@h.assoc('pear').should == ['pear', :red]
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it "uses #== to compare the argument to the keys" do
|
|
34
|
+
@h[1.0] = :value
|
|
35
|
+
1.should == 1.0
|
|
36
|
+
@h.assoc(1).should == [1.0, :value]
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "returns nil if the argument is not a key of the Hash" do
|
|
40
|
+
@h.assoc(:green).should be_nil
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
|
2
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
|
3
|
+
|
|
4
|
+
describe "Hash#clear" do
|
|
5
|
+
#it "returns itself" do
|
|
6
|
+
# h = new_hash(1 => 2, 3 => 4)
|
|
7
|
+
# h.clear.should equal(h)
|
|
8
|
+
#end
|
|
9
|
+
|
|
10
|
+
it "removes all key, value pairs" do
|
|
11
|
+
h = new_hash(1 => 2, 3 => 4)
|
|
12
|
+
h.clear
|
|
13
|
+
h.should == new_hash
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
=begin default
|
|
17
|
+
it "does not remove default values" do
|
|
18
|
+
h = new_hash 5
|
|
19
|
+
h.clear
|
|
20
|
+
h.default.should == 5
|
|
21
|
+
|
|
22
|
+
h = new_hash("a" => 100, "b" => 200)
|
|
23
|
+
h.default = "Go fish"
|
|
24
|
+
h.clear
|
|
25
|
+
h["z"].should == "Go fish"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "does not remove default procs" do
|
|
29
|
+
h = new_hash { 5 }
|
|
30
|
+
h.clear
|
|
31
|
+
h.default_proc.should_not == nil
|
|
32
|
+
end
|
|
33
|
+
=end
|
|
34
|
+
|
|
35
|
+
=begin frozen
|
|
36
|
+
ruby_version_is ""..."1.9" do
|
|
37
|
+
it "raises a TypeError if called on a frozen instance" do
|
|
38
|
+
lambda { HashSpecs.frozen_hash.clear }.should raise_error(TypeError)
|
|
39
|
+
lambda { HashSpecs.empty_frozen_hash.clear }.should raise_error(TypeError)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
ruby_version_is "1.9" do
|
|
43
|
+
it "raises a RuntimeError if called on a frozen instance" do
|
|
44
|
+
lambda { HashSpecs.frozen_hash.clear }.should raise_error(RuntimeError)
|
|
45
|
+
lambda { HashSpecs.empty_frozen_hash.clear }.should raise_error(RuntimeError)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
=end
|
|
49
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
|
2
|
+
|
|
3
|
+
describe "Hash#clone" do
|
|
4
|
+
it "copies instance variable but not the objects they refer to" do
|
|
5
|
+
hash = new_hash('key' => 'value')
|
|
6
|
+
|
|
7
|
+
clone = hash.clone
|
|
8
|
+
|
|
9
|
+
clone.should == hash
|
|
10
|
+
clone.object_id.should_not == hash.object_id
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
=begin compare_by_identity
|
|
2
|
+
ruby_version_is "1.9" do
|
|
3
|
+
describe "Hash#compare_by_identity" do
|
|
4
|
+
before(:each) do
|
|
5
|
+
@h = new_hash
|
|
6
|
+
@idh = new_hash.compare_by_identity
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
it "causes future comparisons on the receiver to be made by identity" do
|
|
10
|
+
@h["a"] = :a
|
|
11
|
+
@h["a"].should == :a
|
|
12
|
+
@h.compare_by_identity
|
|
13
|
+
@h["a"].should be_nil
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "causes #compare_by_identity? to return true" do
|
|
17
|
+
@idh.compare_by_identity?.should be_true
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "returns self" do
|
|
21
|
+
h = new_hash
|
|
22
|
+
h[:foo] = :bar
|
|
23
|
+
h.compare_by_identity.should == h
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "uses the semantics of BasicObject#equal? to determine key identity" do
|
|
27
|
+
1.1.should_not equal(1.1)
|
|
28
|
+
@idh[1.1] = :a
|
|
29
|
+
@idh[1.1] = :b
|
|
30
|
+
[1].should_not equal([1])
|
|
31
|
+
@idh[[1]] = :c
|
|
32
|
+
@idh[[1]] = :d
|
|
33
|
+
:bar.should equal(:bar)
|
|
34
|
+
@idh[:bar] = :e
|
|
35
|
+
@idh[:bar] = :f
|
|
36
|
+
"bar".should_not equal('bar')
|
|
37
|
+
@idh["bar"] = :g
|
|
38
|
+
@idh["bar"] = :h
|
|
39
|
+
@idh.values.should == [:a, :b, :c, :d, :f, :g, :h]
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "doesn't call #equal? on keys to determine their identity" do
|
|
43
|
+
obj = mock('equal')
|
|
44
|
+
obj.should_not_receive(:equal?)
|
|
45
|
+
@idh[:foo] = :glark
|
|
46
|
+
@idh[obj] = :a
|
|
47
|
+
@idh[obj.dup].should == nil
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "regards #dup'd objects as having different identities" do
|
|
51
|
+
str = 'foo'
|
|
52
|
+
@idh[str.dup] = :str
|
|
53
|
+
@idh[str].should be_nil
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "regards #clone'd objects as having different identities" do
|
|
57
|
+
str = 'foo'
|
|
58
|
+
@idh[str.clone] = :str
|
|
59
|
+
@idh[str].should be_nil
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it "regards references to the same object as having the same identity" do
|
|
63
|
+
o = Object.new
|
|
64
|
+
@h[o] = :o
|
|
65
|
+
@h[:a] = :a
|
|
66
|
+
@h[o].should == :o
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it "raises a RuntimeError on frozen hashes" do
|
|
70
|
+
@h = @h.freeze
|
|
71
|
+
lambda { @h.compare_by_identity }.should raise_error(RuntimeError)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Behaviour confirmed in bug #1871
|
|
75
|
+
it "perists over #dups" do
|
|
76
|
+
@idh['foo'] = :bar
|
|
77
|
+
@idh['foo'] = :glark
|
|
78
|
+
@idh.dup.should == @idh
|
|
79
|
+
@idh.dup.size.should == @idh.size
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
it "persists over #clones" do
|
|
83
|
+
@idh['foo'] = :bar
|
|
84
|
+
@idh['foo'] = :glark
|
|
85
|
+
@idh.clone.should == @idh
|
|
86
|
+
@idh.clone.size.should == @idh.size
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
describe "Hash#compare_by_identity?" do
|
|
91
|
+
it "returns false by default" do
|
|
92
|
+
h = new_hash
|
|
93
|
+
h.compare_by_identity?.should be_false
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
it "returns true once #compare_by_identity has been invoked on self" do
|
|
97
|
+
h = new_hash
|
|
98
|
+
h.compare_by_identity
|
|
99
|
+
h.compare_by_identity?.should be_true
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it "returns true when called multiple times on the same ident hash" do
|
|
103
|
+
h = new_hash
|
|
104
|
+
h.compare_by_identity
|
|
105
|
+
h.compare_by_identity?.should be_true
|
|
106
|
+
h.compare_by_identity?.should be_true
|
|
107
|
+
h.compare_by_identity?.should be_true
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
=end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
|
2
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
|
3
|
+
|
|
4
|
+
describe "Hash.[]" do
|
|
5
|
+
it "creates a Hash; values can be provided as the argument list" do
|
|
6
|
+
hash_class[:a, 1, :b, 2].should == new_hash(:a => 1, :b => 2)
|
|
7
|
+
hash_class[].should == new_hash
|
|
8
|
+
hash_class[:a, 1, :b, new_hash(:c => 2)].should ==
|
|
9
|
+
new_hash(:a => 1, :b => new_hash(:c => 2))
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "creates a Hash; values can be provided as one single hash" do
|
|
13
|
+
hash_class[:a => 1, :b => 2].should == new_hash(:a => 1, :b => 2)
|
|
14
|
+
hash_class[new_hash(1 => 2, 3 => 4)].should == new_hash(1 => 2, 3 => 4)
|
|
15
|
+
hash_class[new_hash].should == new_hash
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
=begin nil
|
|
19
|
+
ruby_version_is '1.8.7' do
|
|
20
|
+
# Not officially documented yet, see http://redmine.ruby-lang.org/issues/show/1385
|
|
21
|
+
ruby_bug "[ruby-core:21249]", "1.8.7.167" do
|
|
22
|
+
it "creates a Hash; values can be provided as a list of value-pairs in an array" do
|
|
23
|
+
hash_class[[[:a, 1], [:b, 2]]].should == new_hash(:a => 1, :b => 2)
|
|
24
|
+
hash_class[[[:a, 1], [:b], 42, [:d, 2], [:e, 2, 3], []]].should == new_hash(:a => 1, :b => nil, :d => 2)
|
|
25
|
+
obj = mock('x')
|
|
26
|
+
def obj.to_ary() [:b, 2] end
|
|
27
|
+
hash_class[[[:a, 1], obj]].should == new_hash(:a => 1, :b => 2)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
=end
|
|
32
|
+
|
|
33
|
+
it "raises an ArgumentError when passed an odd number of arguments" do
|
|
34
|
+
lambda { hash_class[1, 2, 3] }.should raise_error(ArgumentError)
|
|
35
|
+
lambda { hash_class[1, 2, new_hash(3 => 4)] }.should raise_error(ArgumentError)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
ruby_version_is '1.8.7' do
|
|
39
|
+
it "calls to_hash" do
|
|
40
|
+
obj = mock('x')
|
|
41
|
+
def obj.to_hash() new_hash(1 => 2, 3 => 4) end
|
|
42
|
+
hash_class[obj].should == new_hash(1 => 2, 3 => 4)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "returns an instance of a subclass when passed an Array" do
|
|
46
|
+
MyHash[[1,2,3,4]].should be_kind_of(MyHash)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "returns an instance of the class it's called on" do
|
|
51
|
+
hash_class[MyHash[1, 2]].class.should == hash_class
|
|
52
|
+
MyHash[hash_class[1, 2]].should be_kind_of(MyHash)
|
|
53
|
+
end
|
|
54
|
+
end
|