jactive_support 1.0.2
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 +24 -0
- data/lib/jactive_support.rb +6 -0
- data/lib/jactive_support/constantize.rb +19 -0
- data/lib/jactive_support/core_ext.rb +4 -0
- data/lib/jactive_support/core_ext/enum.rb +43 -0
- data/lib/jactive_support/core_ext/hash.rb +2 -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/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/java_ext.rb +4 -0
- data/lib/jactive_support/java_ext/date.rb +37 -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/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.rb +6 -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/number.rb +91 -0
- data/lib/jactive_support/java_ext/sql_date.rb +7 -0
- data/lib/jactive_support/java_ext/sql_date/conversions.rb +33 -0
- data/lib/jactive_support/json.rb +1 -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/rescuable.rb +62 -0
- data/lib/jactive_support/version.rb +3 -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,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
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
3
|
+
require File.expand_path('../shared/iteration', __FILE__)
|
4
|
+
|
5
|
+
describe "Hash#delete_if" do
|
6
|
+
it "yields two arguments: key and value" do
|
7
|
+
all_args = []
|
8
|
+
new_hash(1 => 2, 3 => 4).delete_if { |*args| all_args << args }
|
9
|
+
all_args.sort.should == [[1, 2], [3, 4]]
|
10
|
+
end
|
11
|
+
|
12
|
+
=begin self
|
13
|
+
it "returns self" do
|
14
|
+
h = new_hash(:a => 1, :b => 2, :c => 3, :d => 4)
|
15
|
+
h.delete_if { |k,v| v % 2 == 1 }.should equal(h)
|
16
|
+
end
|
17
|
+
=end
|
18
|
+
|
19
|
+
it "removes every entry for which block is true" do
|
20
|
+
h = new_hash(:a => 1, :b => 2, :c => 3, :d => 4)
|
21
|
+
h.delete_if { |k,v| v % 2 == 1 }
|
22
|
+
h.should == new_hash(:b => 2, :d => 4)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "processes entries with the same order as each()" do
|
26
|
+
h = new_hash(:a => 1, :b => 2, :c => 3, :d => 4)
|
27
|
+
|
28
|
+
each_pairs = []
|
29
|
+
delete_pairs = []
|
30
|
+
|
31
|
+
h.each_pair { |k,v| each_pairs << [k, v] }
|
32
|
+
h.delete_if { |k,v| delete_pairs << [k,v] }
|
33
|
+
|
34
|
+
each_pairs.should == delete_pairs
|
35
|
+
end
|
36
|
+
|
37
|
+
=begin frozen
|
38
|
+
ruby_version_is "" ... "1.9" do
|
39
|
+
it "raises an TypeError if called on a frozen instance" do
|
40
|
+
lambda { HashSpecs.frozen_hash.delete_if { false } }.should raise_error(TypeError)
|
41
|
+
lambda { HashSpecs.empty_frozen_hash.delete_if { true } }.should raise_error(TypeError)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
ruby_version_is "1.9" do
|
46
|
+
it "raises an RuntimeError if called on a frozen instance" do
|
47
|
+
lambda { HashSpecs.frozen_hash.delete_if { false } }.should raise_error(RuntimeError)
|
48
|
+
lambda { HashSpecs.empty_frozen_hash.delete_if { true } }.should raise_error(RuntimeError)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
=end
|
52
|
+
|
53
|
+
it_behaves_like(:hash_iteration_no_block, :delete_if)
|
54
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
3
|
+
|
4
|
+
describe "Hash#delete" do
|
5
|
+
it "removes the entry and returns the deleted value" do
|
6
|
+
h = new_hash(:a => 5, :b => 2)
|
7
|
+
h.delete(:b).should == 2
|
8
|
+
h.should == new_hash(:a => 5)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "calls supplied block if the key is not found" do
|
12
|
+
new_hash(:a => 1, :b => 10, :c => 100).delete(:d) { 5 }.should == 5
|
13
|
+
new_hash(:default).delete(:d) { 5 }.should == 5
|
14
|
+
new_hash { :defualt }.delete(:d) { 5 }.should == 5
|
15
|
+
end
|
16
|
+
|
17
|
+
it "returns nil if the key is not found when no block is given" do
|
18
|
+
new_hash(:a => 1, :b => 10, :c => 100).delete(:d).should == nil
|
19
|
+
new_hash(:default).delete(:d).should == nil
|
20
|
+
new_hash { :defualt }.delete(:d).should == nil
|
21
|
+
end
|
22
|
+
|
23
|
+
=begin frozen
|
24
|
+
ruby_version_is "" ... "1.9" do
|
25
|
+
it "raises a TypeError if called on a frozen instance" do
|
26
|
+
lambda { HashSpecs.frozen_hash.delete("foo") }.should raise_error(TypeError)
|
27
|
+
lambda { HashSpecs.empty_frozen_hash.delete("foo") }.should raise_error(TypeError)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
ruby_version_is "1.9" do
|
32
|
+
it "raises a RuntimeError if called on a frozen instance" do
|
33
|
+
lambda { HashSpecs.frozen_hash.delete("foo") }.should raise_error(RuntimeError)
|
34
|
+
lambda { HashSpecs.empty_frozen_hash.delete("foo") }.should raise_error(RuntimeError)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
=end
|
38
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
3
|
+
require File.expand_path('../shared/iteration', __FILE__)
|
4
|
+
|
5
|
+
describe "Hash#each_key" do
|
6
|
+
|
7
|
+
=begin self
|
8
|
+
it "returns self" do
|
9
|
+
h = new_hash(1 => -1, 2 => -2, 3 => -3, 4 => -4)
|
10
|
+
h.each_key { |k| }.should equal(h)
|
11
|
+
end
|
12
|
+
=end
|
13
|
+
|
14
|
+
it "calls block once for each key, passing key" do
|
15
|
+
r = new_hash
|
16
|
+
h = new_hash(1 => -1, 2 => -2, 3 => -3, 4 => -4)
|
17
|
+
h.each_key { |k| r[k] = k }
|
18
|
+
r.should == new_hash(1 => 1, 2 => 2, 3 => 3, 4 => 4)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "processes keys in the same order as keys()" do
|
22
|
+
keys = []
|
23
|
+
h = new_hash(1 => -1, 2 => -2, 3 => -3, 4 => -4)
|
24
|
+
h.each_key { |k| keys << k }
|
25
|
+
keys.should == h.keys
|
26
|
+
end
|
27
|
+
|
28
|
+
it_behaves_like(:hash_iteration_no_block, :each_key)
|
29
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
3
|
+
require File.expand_path('../shared/iteration', __FILE__)
|
4
|
+
require File.expand_path('../shared/each', __FILE__)
|
5
|
+
|
6
|
+
describe "Hash#each_pair" do
|
7
|
+
ruby_version_is ""..."1.9" do
|
8
|
+
=begin self
|
9
|
+
it "returns self" do
|
10
|
+
h = new_hash(1 => 2, 3 => 4)
|
11
|
+
h.each_pair { |key, value| }.should equal(h)
|
12
|
+
end
|
13
|
+
=end
|
14
|
+
|
15
|
+
it "yields the key and value of each pair to a block expecting |key, value|" do
|
16
|
+
all_args = []
|
17
|
+
|
18
|
+
h = new_hash(1 => 2, 3 => 4)
|
19
|
+
h.each_pair { |key, value| all_args << [key, value] }
|
20
|
+
|
21
|
+
all_args.sort.should == [[1, 2], [3, 4]]
|
22
|
+
end
|
23
|
+
|
24
|
+
it "yields a [key, value] Array for each pair to a block expecting |*args|" do
|
25
|
+
all_args = []
|
26
|
+
|
27
|
+
h = new_hash(1 => 2, 3 => 4)
|
28
|
+
h.each_pair { |*args| all_args << args }
|
29
|
+
|
30
|
+
all_args.sort.should == [[1, 2], [3, 4]]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
ruby_version_is "1.9" do
|
35
|
+
it_behaves_like(:hash_each, :each_pair)
|
36
|
+
end
|
37
|
+
it_behaves_like(:hash_iteration_no_block, :each_pair)
|
38
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
3
|
+
require File.expand_path('../shared/iteration', __FILE__)
|
4
|
+
require File.expand_path('../shared/each', __FILE__)
|
5
|
+
|
6
|
+
describe "Hash#each" do
|
7
|
+
it_behaves_like(:hash_each, :each)
|
8
|
+
it_behaves_like(:hash_iteration_no_block, :each)
|
9
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
3
|
+
require File.expand_path('../shared/iteration', __FILE__)
|
4
|
+
|
5
|
+
describe "Hash#each_value" do
|
6
|
+
=begin self
|
7
|
+
it "returns self" do
|
8
|
+
h = new_hash(:a => -5, :b => -3, :c => -2, :d => -1, :e => -1)
|
9
|
+
h.each_value { |v| }.should equal(h)
|
10
|
+
end
|
11
|
+
=end
|
12
|
+
|
13
|
+
it "calls block once for each key, passing value" do
|
14
|
+
r = []
|
15
|
+
h = new_hash(:a => -5, :b => -3, :c => -2, :d => -1, :e => -1)
|
16
|
+
h.each_value { |v| r << v }
|
17
|
+
r.sort.should == [-5, -3, -2, -1, -1]
|
18
|
+
end
|
19
|
+
|
20
|
+
it "processes values in the same order as values()" do
|
21
|
+
values = []
|
22
|
+
h = new_hash(:a => -5, :b => -3, :c => -2, :d => -1, :e => -1)
|
23
|
+
h.each_value { |v| values << v }
|
24
|
+
values.should == h.values.to_a
|
25
|
+
end
|
26
|
+
|
27
|
+
it_behaves_like(:hash_iteration_no_block, :each_value)
|
28
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
3
|
+
|
4
|
+
describe "Hash#[]" do
|
5
|
+
it "returns the value for key" do
|
6
|
+
obj = mock('x')
|
7
|
+
h = new_hash(1 => 2, 3 => 4, "foo" => "bar", obj => obj, [] => "baz")
|
8
|
+
h[1].should == 2
|
9
|
+
h[3].should == 4
|
10
|
+
h["foo"].should == "bar"
|
11
|
+
h[obj].should == obj
|
12
|
+
h[[]].should == "baz"
|
13
|
+
end
|
14
|
+
|
15
|
+
it "returns nil as default default value" do
|
16
|
+
new_hash(0 => 0)[5].should == nil
|
17
|
+
end
|
18
|
+
|
19
|
+
it "returns the default (immediate) value for missing keys" do
|
20
|
+
h = new_hash 5
|
21
|
+
h[:a].should == 5
|
22
|
+
h[:a] = 0
|
23
|
+
h[:a].should == 0
|
24
|
+
h[:b].should == 5
|
25
|
+
end
|
26
|
+
|
27
|
+
=begin default
|
28
|
+
it "calls subclass implementations of default" do
|
29
|
+
h = DefaultHash.new
|
30
|
+
h[:nothing].should == 100
|
31
|
+
end
|
32
|
+
=end
|
33
|
+
|
34
|
+
it "does not create copies of the immediate default value" do
|
35
|
+
str = "foo"
|
36
|
+
h = new_hash(str)
|
37
|
+
a = h[:a]
|
38
|
+
b = h[:b]
|
39
|
+
a << "bar"
|
40
|
+
|
41
|
+
a.should equal(b)
|
42
|
+
a.should == "foobar"
|
43
|
+
b.should == "foobar"
|
44
|
+
end
|
45
|
+
|
46
|
+
=begin default
|
47
|
+
it "returns the default (dynamic) value for missing keys" do
|
48
|
+
h = new_hash { |hsh, k| k.kind_of?(Numeric) ? hsh[k] = k + 2 : hsh[k] = k }
|
49
|
+
h[1].should == 3
|
50
|
+
h['this'].should == 'this'
|
51
|
+
h.should == new_hash(1 => 3, 'this' => 'this')
|
52
|
+
|
53
|
+
i = 0
|
54
|
+
h = new_hash { |hsh, key| i += 1 }
|
55
|
+
h[:foo].should == 1
|
56
|
+
h[:foo].should == 2
|
57
|
+
h[:bar].should == 3
|
58
|
+
end
|
59
|
+
=end
|
60
|
+
|
61
|
+
=begin nil
|
62
|
+
it "does not return default values for keys with nil values" do
|
63
|
+
h = new_hash 5
|
64
|
+
h[:a] = nil
|
65
|
+
h[:a].should == nil
|
66
|
+
|
67
|
+
h = new_hash() { 5 }
|
68
|
+
h[:a] = nil
|
69
|
+
h[:a].should == nil
|
70
|
+
end
|
71
|
+
=end
|
72
|
+
|
73
|
+
it "compares keys with eql? semantics" do
|
74
|
+
new_hash(1.0 => "x")[1].should == nil
|
75
|
+
new_hash(1.0 => "x")[1.0].should == "x"
|
76
|
+
new_hash(1 => "x")[1.0].should == nil
|
77
|
+
new_hash(1 => "x")[1].should == "x"
|
78
|
+
end
|
79
|
+
|
80
|
+
it "compares key via hash" do
|
81
|
+
x = mock('0')
|
82
|
+
x.should_receive(:hash).and_return(0)
|
83
|
+
|
84
|
+
h = new_hash
|
85
|
+
# 1.9 only calls #hash if the hash had at least one entry beforehand.
|
86
|
+
h[:foo] = :bar
|
87
|
+
h[x].should == nil
|
88
|
+
end
|
89
|
+
|
90
|
+
=begin hashCode equals
|
91
|
+
it "does not compare keys with different #hashCode values via #equals" do
|
92
|
+
x = mock('x')
|
93
|
+
x.should_not_receive(:equals)
|
94
|
+
x.stub!(:hashCode).and_return(0)
|
95
|
+
|
96
|
+
y = mock('y')
|
97
|
+
y.should_not_receive(:equals)
|
98
|
+
y.stub!(:hashCode).and_return(1)
|
99
|
+
|
100
|
+
new_hash(y => 1)[x].should == nil
|
101
|
+
end
|
102
|
+
|
103
|
+
it "compares keys with the same #hashCode value via #equals" do
|
104
|
+
x = mock('x')
|
105
|
+
x.should_receive(:equals).and_return(true)
|
106
|
+
x.stub!(:hashCode).and_return(42)
|
107
|
+
|
108
|
+
y = mock('y')
|
109
|
+
y.should_not_receive(:equals)
|
110
|
+
y.stub!(:hashCode).and_return(42)
|
111
|
+
|
112
|
+
new_hash(y => 1)[x].should == 1
|
113
|
+
end
|
114
|
+
=end
|
115
|
+
end
|
116
|
+
|
117
|
+
describe "Hash.[]" do
|
118
|
+
it "needs to be reviewed for spec completeness"
|
119
|
+
end
|