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.
Files changed (133) hide show
  1. data/.gitignore +4 -0
  2. data/.rvmrc +63 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +20 -0
  5. data/Rakefile +45 -0
  6. data/jactive_support.gemspec +24 -0
  7. data/lib/jactive_support.rb +6 -0
  8. data/lib/jactive_support/constantize.rb +19 -0
  9. data/lib/jactive_support/core_ext.rb +4 -0
  10. data/lib/jactive_support/core_ext/enum.rb +43 -0
  11. data/lib/jactive_support/core_ext/hash.rb +2 -0
  12. data/lib/jactive_support/core_ext/hash/assert_valid_params.rb +19 -0
  13. data/lib/jactive_support/core_ext/hash/with_keys_values.rb +9 -0
  14. data/lib/jactive_support/core_ext/locale.rb +28 -0
  15. data/lib/jactive_support/core_ext/module.rb +9 -0
  16. data/lib/jactive_support/core_ext/numeric.rb +7 -0
  17. data/lib/jactive_support/core_ext/ordering.rb +17 -0
  18. data/lib/jactive_support/core_ext/to_java.rb +9 -0
  19. data/lib/jactive_support/core_ext/to_java_date.rb +25 -0
  20. data/lib/jactive_support/core_ext/to_java_list.rb +11 -0
  21. data/lib/jactive_support/core_ext/to_java_map.rb +11 -0
  22. data/lib/jactive_support/java_ext.rb +4 -0
  23. data/lib/jactive_support/java_ext/date.rb +37 -0
  24. data/lib/jactive_support/java_ext/date/calculations.rb +43 -0
  25. data/lib/jactive_support/java_ext/date/conversions.rb +135 -0
  26. data/lib/jactive_support/java_ext/enum.rb +19 -0
  27. data/lib/jactive_support/java_ext/iterable.rb +74 -0
  28. data/lib/jactive_support/java_ext/iterator.rb +8 -0
  29. data/lib/jactive_support/java_ext/list.rb +65 -0
  30. data/lib/jactive_support/java_ext/list_iterator.rb +8 -0
  31. data/lib/jactive_support/java_ext/locale.rb +32 -0
  32. data/lib/jactive_support/java_ext/map.rb +6 -0
  33. data/lib/jactive_support/java_ext/map/constructor.rb +35 -0
  34. data/lib/jactive_support/java_ext/map/hash.rb +166 -0
  35. data/lib/jactive_support/java_ext/number.rb +91 -0
  36. data/lib/jactive_support/java_ext/sql_date.rb +7 -0
  37. data/lib/jactive_support/java_ext/sql_date/conversions.rb +33 -0
  38. data/lib/jactive_support/json.rb +1 -0
  39. data/lib/jactive_support/json/encoders/collection.rb +12 -0
  40. data/lib/jactive_support/json/encoders/locale.rb +6 -0
  41. data/lib/jactive_support/json/encoders/map.rb +55 -0
  42. data/lib/jactive_support/json/encoding.rb +5 -0
  43. data/lib/jactive_support/rescuable.rb +62 -0
  44. data/lib/jactive_support/version.rb +3 -0
  45. data/spec/constantize_spec.rb +57 -0
  46. data/spec/core_ext/hash_spec.rb +34 -0
  47. data/spec/core_ext/module_spec.rb +19 -0
  48. data/spec/core_ext/ordering_spec.rb +12 -0
  49. data/spec/enum_spec.rb +67 -0
  50. data/spec/java_ext/iterable/clear_spec.rb +56 -0
  51. data/spec/java_ext/iterable/delete_if_spec.rb +71 -0
  52. data/spec/java_ext/iterable/empty_spec.rb +10 -0
  53. data/spec/java_ext/iterable/reject_spec.rb +76 -0
  54. data/spec/java_ext/iterable/shared/enumeratorize.rb +12 -0
  55. data/spec/java_ext/iterable/shared/fixtures.rb +90 -0
  56. data/spec/java_ext/iterable/shift_spec.rb +160 -0
  57. data/spec/java_ext/list/clear_spec.rb +56 -0
  58. data/spec/java_ext/list/collect_spec.rb +11 -0
  59. data/spec/java_ext/list/last_spec.rb +87 -0
  60. data/spec/java_ext/list/map_spec.rb +11 -0
  61. data/spec/java_ext/list/push_spec.rb +44 -0
  62. data/spec/java_ext/list/shared/collect.rb +133 -0
  63. data/spec/java_ext/list/shared/fixtures.rb +34 -0
  64. data/spec/java_ext/map/assoc_spec.rb +43 -0
  65. data/spec/java_ext/map/clear_spec.rb +49 -0
  66. data/spec/java_ext/map/clone_spec.rb +13 -0
  67. data/spec/java_ext/map/compare_by_identity_spec.rb +111 -0
  68. data/spec/java_ext/map/constructor_spec.rb +54 -0
  69. data/spec/java_ext/map/delete_if_spec.rb +54 -0
  70. data/spec/java_ext/map/delete_spec.rb +38 -0
  71. data/spec/java_ext/map/each_key_spec.rb +29 -0
  72. data/spec/java_ext/map/each_pair_spec.rb +38 -0
  73. data/spec/java_ext/map/each_spec.rb +9 -0
  74. data/spec/java_ext/map/each_value_spec.rb +28 -0
  75. data/spec/java_ext/map/element_reference_spec.rb +119 -0
  76. data/spec/java_ext/map/element_set_spec.rb +7 -0
  77. data/spec/java_ext/map/empty_spec.rb +15 -0
  78. data/spec/java_ext/map/eql_spec.rb +19 -0
  79. data/spec/java_ext/map/equal_value_spec.rb +18 -0
  80. data/spec/java_ext/map/fetch_spec.rb +35 -0
  81. data/spec/java_ext/map/fixtures/classes.rb +36 -0
  82. data/spec/java_ext/map/flatten_spec.rb +64 -0
  83. data/spec/java_ext/map/has_key_spec.rb +8 -0
  84. data/spec/java_ext/map/has_value_spec.rb +8 -0
  85. data/spec/java_ext/map/hash_spec.rb +53 -0
  86. data/spec/java_ext/map/include_spec.rb +7 -0
  87. data/spec/java_ext/map/index_spec.rb +7 -0
  88. data/spec/java_ext/map/indexes_spec.rb +9 -0
  89. data/spec/java_ext/map/indices_spec.rb +9 -0
  90. data/spec/java_ext/map/initialize_copy_spec.rb +13 -0
  91. data/spec/java_ext/map/initialize_spec.rb +64 -0
  92. data/spec/java_ext/map/inspect_spec.rb +9 -0
  93. data/spec/java_ext/map/invert_spec.rb +27 -0
  94. data/spec/java_ext/map/keep_if_spec.rb +33 -0
  95. data/spec/java_ext/map/key_spec.rb +14 -0
  96. data/spec/java_ext/map/keys_spec.rb +39 -0
  97. data/spec/java_ext/map/length_spec.rb +7 -0
  98. data/spec/java_ext/map/member_spec.rb +7 -0
  99. data/spec/java_ext/map/merge_spec.rb +69 -0
  100. data/spec/java_ext/map/rassoc_spec.rb +39 -0
  101. data/spec/java_ext/map/reject_spec.rb +123 -0
  102. data/spec/java_ext/map/replace_spec.rb +7 -0
  103. data/spec/java_ext/map/select_spec.rb +98 -0
  104. data/spec/java_ext/map/shared/each.rb +77 -0
  105. data/spec/java_ext/map/shared/eql.rb +224 -0
  106. data/spec/java_ext/map/shared/equal.rb +94 -0
  107. data/spec/java_ext/map/shared/index.rb +29 -0
  108. data/spec/java_ext/map/shared/iteration.rb +28 -0
  109. data/spec/java_ext/map/shared/key.rb +43 -0
  110. data/spec/java_ext/map/shared/length.rb +12 -0
  111. data/spec/java_ext/map/shared/replace.rb +82 -0
  112. data/spec/java_ext/map/shared/store.rb +68 -0
  113. data/spec/java_ext/map/shared/to_s.rb +68 -0
  114. data/spec/java_ext/map/shared/update.rb +95 -0
  115. data/spec/java_ext/map/shared/value.rb +16 -0
  116. data/spec/java_ext/map/shared/values_at.rb +12 -0
  117. data/spec/java_ext/map/shift_spec.rb +44 -0
  118. data/spec/java_ext/map/size_spec.rb +7 -0
  119. data/spec/java_ext/map/sort_spec.rb +17 -0
  120. data/spec/java_ext/map/store_spec.rb +7 -0
  121. data/spec/java_ext/map/to_a_spec.rb +29 -0
  122. data/spec/java_ext/map/to_hash_spec.rb +11 -0
  123. data/spec/java_ext/map/to_s_spec.rb +20 -0
  124. data/spec/java_ext/map/try_convert_spec.rb +32 -0
  125. data/spec/java_ext/map/update_spec.rb +7 -0
  126. data/spec/java_ext/map/value_spec.rb +8 -0
  127. data/spec/java_ext/map/values_at_spec.rb +7 -0
  128. data/spec/java_ext/map/values_spec.rb +10 -0
  129. data/spec/locale_spec.rb +77 -0
  130. data/spec/shared/fixtures.rb +7 -0
  131. data/spec/shared/version.rb +123 -0
  132. data/spec/spec_helper.rb +50 -0
  133. metadata +332 -0
@@ -0,0 +1,68 @@
1
+ shared_examples_for :hash_store do |method|
2
+ before { @method = method }
3
+
4
+ it "associates the key with the value and return the value" do
5
+ h = new_hash(:a => 1)
6
+ h.send(@method, :b, 2).should == 2
7
+ h.should == new_hash(:b=>2, :a=>1)
8
+ end
9
+
10
+ it "duplicates string keys using dup semantics" do
11
+ # dup doesn't copy singleton methods
12
+ key = "foo"
13
+ def key.reverse() "bar" end
14
+ h = new_hash
15
+ h.send(@method, key, 0)
16
+ h.keys[0].reverse.should == "oof"
17
+ end
18
+
19
+ it "stores unequal keys that hash to the same value" do
20
+ h = new_hash
21
+ k1 = ["x"]
22
+ k2 = ["y"]
23
+ # So they end up in the same bucket
24
+ k1.should_receive(:hash).and_return(0)
25
+ k2.should_receive(:hash).and_return(0)
26
+
27
+ h[k1] = 1
28
+ h[k2] = 2
29
+ h.size.should == 2
30
+ end
31
+
32
+ =begin frozen
33
+ it "duplicates and freezes string keys" do
34
+ key = "foo"
35
+ h = new_hash
36
+ h.send(@method, key, 0)
37
+ key << "bar"
38
+
39
+ h.should == new_hash("foo" => 0)
40
+ h.keys[0].frozen?.should == true
41
+ end
42
+
43
+ it "doesn't duplicate and freeze already frozen string keys" do
44
+ key = "foo".freeze
45
+ h = new_hash
46
+ h.send(@method, key, 0)
47
+ h.keys[0].should equal(key)
48
+ end
49
+
50
+ ruby_version_is ""..."1.9" do
51
+ it "raises a TypeError if called on a frozen instance" do
52
+ lambda { HashSpecs.frozen_hash.send(@method, 1, 2) }.should raise_error(TypeError)
53
+ end
54
+ end
55
+
56
+ ruby_version_is "1.9" do
57
+ it "raises a RuntimeError if called on a frozen instance" do
58
+ lambda { HashSpecs.frozen_hash.send(@method, 1, 2) }.should raise_error(RuntimeError)
59
+ end
60
+ end
61
+ =end
62
+
63
+ it "does not raise an exception if changing the value of an existing key during iteration" do
64
+ hash = {1 => 2, 3 => 4, 5 => 6}
65
+ hash.each { hash.send(@method, 1, :foo) }
66
+ hash.should == {1 => :foo, 3 => 4, 5 => 6}
67
+ end
68
+ end
@@ -0,0 +1,68 @@
1
+ require File.expand_path('../../../../spec_helper', __FILE__)
2
+ require File.expand_path('../../fixtures/classes', __FILE__)
3
+
4
+ shared_examples_for :to_s do |method|
5
+ before { @method = method }
6
+
7
+ it "returns a string representation with same order as each()" do
8
+ h = new_hash(:a => [1, 2], :b => -2, :d => -6, nil => nil)
9
+
10
+ pairs = []
11
+ h.each do |key, value|
12
+ pairs << key.inspect + '=>' + value.inspect
13
+ end
14
+
15
+ str = '{' + pairs.join(', ') + '}'
16
+ h.send(@method).should == str
17
+ end
18
+
19
+ it "calls inspect on keys and values" do
20
+ key = mock('key')
21
+ val = mock('val')
22
+ key.should_receive(:inspect).and_return('key')
23
+ val.should_receive(:inspect).and_return('val')
24
+
25
+ new_hash(key => val).send(@method).should == '{key=>val}'
26
+ end
27
+
28
+ it "handles hashes with recursive values" do
29
+ x = new_hash
30
+ x[0] = x
31
+ x.send(@method).should == '{0=>{...}}'
32
+
33
+ x = new_hash
34
+ y = new_hash
35
+ x[0] = y
36
+ y[1] = x
37
+ x.send(@method).should == "{0=>{1=>{...}}}"
38
+ y.send(@method).should == "{1=>{0=>{...}}}"
39
+ end
40
+
41
+ # Recursive hash keys are disallowed on 1.9
42
+ ruby_version_is ""..."1.9" do
43
+ it "handles hashes with recursive keys" do
44
+ x = new_hash
45
+ x[x] = 0
46
+ x.send(@method).should == '{{...}=>0}'
47
+
48
+ x = new_hash
49
+ x[x] = x
50
+ x.send(@method).should == '{{...}=>{...}}'
51
+
52
+
53
+ x = new_hash
54
+ y = new_hash
55
+ x[y] = 0
56
+ y[x] = 1
57
+ x.send(@method).should == "{{{...}=>1}=>0}"
58
+ y.send(@method).should == "{{{...}=>0}=>1}"
59
+
60
+ x = new_hash
61
+ y = new_hash
62
+ x[y] = x
63
+ y[x] = y
64
+ x.send(@method).should == "{{{...}=>{...}}=>{...}}"
65
+ y.send(@method).should == "{{{...}=>{...}}=>{...}}"
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,95 @@
1
+ shared_examples_for :hash_update do |method|
2
+ before { @method = method }
3
+
4
+ =begin self
5
+ it "returns self" do
6
+ h = new_hash(:_1 => 'a', :_2 => '3')
7
+ h.send(@method, :_1 => '9', :_9 => 2).should equal(h)
8
+ end
9
+ =end
10
+
11
+ it "adds the entries from other, overwriting duplicate keys" do
12
+ h = new_hash(:_1 => 'a', :_2 => '3')
13
+ h.send(@method, :_1 => '9', :_9 => 2)
14
+ h.should == new_hash(:_1 => "9", :_2 => "3", :_9 => 2)
15
+ end
16
+
17
+ =begin self
18
+ it "returns self with block" do
19
+ h1 = new_hash(:a => 2, :b => -1)
20
+ h2 = new_hash(:a => -2, :c => 1)
21
+ h1.send(@method, h2) { |k,x,y| 3.14 }.should equal(h1)
22
+ end
23
+ =end
24
+
25
+ =begin nil
26
+ it "sets any duplicate key to the value of block if passed a block" do
27
+ h1 = new_hash(:a => 2, :b => -1)
28
+ h2 = new_hash(:a => -2, :c => 1)
29
+ h1.send(@method, h2) { |k,x,y| 3.14 }
30
+ h1.should == new_hash(:c => 1, :b => -1, :a => 3.14)
31
+
32
+ h1.send(@method, h1) { nil }
33
+ h1.should == new_hash(:a => nil, :b => nil, :c => nil)
34
+ end
35
+ =end
36
+
37
+ it "tries to convert the passed argument to a hash using #to_hash" do
38
+ obj = mock('{1=>2}')
39
+ obj.should_receive(:to_hash).and_return(new_hash(1 => 2).to_hash)
40
+ new_hash(3 => 4).send(@method, obj).should == new_hash(1 => 2, 3 => 4)
41
+ end
42
+
43
+ it "does not call to_hash on hash subclasses" do
44
+ new_hash(3 => 4).send(@method, ToHashHash[1 => 2]).should == new_hash(1 => 2, 3 => 4)
45
+ end
46
+
47
+ =begin nil
48
+ it "processes entries with same order as merge()" do
49
+ h = new_hash(1 => 2, 3 => 4, 5 => 6, "x" => nil, nil => 5, [] => [])
50
+ merge_bang_pairs = []
51
+ merge_pairs = []
52
+ h.merge(h) { |*arg| merge_pairs << arg }
53
+ h.send(@method, h) { |*arg| merge_bang_pairs << arg }
54
+ merge_bang_pairs.should == merge_pairs
55
+ end
56
+ =end
57
+
58
+ =begin frozen
59
+ ruby_version_is ""..."1.9" do
60
+ it "raises a TypeError if called on a non-empty, frozen instance" do
61
+ lambda { HashSpecs.frozen_hash.send(@method, 1 => 2) }.should raise_error(TypeError)
62
+ end
63
+
64
+ it "does not raise an exception on a frozen instance that would not be modified" do
65
+ hash = HashSpecs.frozen_hash.send(@method, HashSpecs.empty_frozen_hash)
66
+ hash.should == HashSpecs.frozen_hash
67
+ end
68
+ end
69
+
70
+ ruby_version_is "1.9" do
71
+ it "raises a RuntimeError on a frozen instance that is modified" do
72
+ lambda do
73
+ HashSpecs.frozen_hash.send(@method, 1 => 2)
74
+ end.should raise_error(RuntimeError)
75
+ end
76
+
77
+ it "checks frozen status before coercing an object with #to_hash" do
78
+ obj = mock("to_hash frozen")
79
+ # This is necessary because mock cleanup code cannot run on the frozen
80
+ # object.
81
+ def obj.to_hash() raise Exception, "should not receive #to_hash" end
82
+ obj.freeze
83
+
84
+ lambda { HashSpecs.frozen_hash.send(@method, obj) }.should raise_error(RuntimeError)
85
+ end
86
+
87
+ # see redmine #1571
88
+ it "raises a RuntimeError on a frozen instance that would not be modified" do
89
+ lambda do
90
+ HashSpecs.frozen_hash.send(@method, HashSpecs.empty_frozen_hash)
91
+ end.should raise_error(RuntimeError)
92
+ end
93
+ end
94
+ =end
95
+ end
@@ -0,0 +1,16 @@
1
+ shared_examples_for :hash_value_p do |method|
2
+ before { @method = method }
3
+
4
+ it "returns true if the value exists in the hash" do
5
+ new_hash(:a => :b).send(@method, :a).should == false
6
+ new_hash(1 => 2).send(@method, 2).should == true
7
+ h = new_hash 5
8
+ h.send(@method, 5).should == false
9
+ h = new_hash { 5 }
10
+ h.send(@method, 5).should == false
11
+ end
12
+
13
+ it "uses == semantics for comparing values" do
14
+ new_hash(5 => 2.0).send(@method, 2).should == true
15
+ end
16
+ end
@@ -0,0 +1,12 @@
1
+ shared_examples_for :hash_values_at do |method|
2
+ before { @method = method }
3
+
4
+ it "returns an array of values for the given keys" do
5
+ h = new_hash(:a => 9, :b => 'a', :c => -10, :d => nil)
6
+ h.send(@method).should be_kind_of(Array)
7
+ h.send(@method).should == []
8
+ h.send(@method, :a, :d, :b).should be_kind_of(Array)
9
+ h.send(@method, :a, :d, :b).should == [9, nil, 'a']
10
+ end
11
+ end
12
+
@@ -0,0 +1,44 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+ require File.expand_path('../fixtures/classes', __FILE__)
3
+
4
+ describe "Hash#shift" do
5
+ =begin shift
6
+ it "removes a pair from hash and return it" do
7
+ h = new_hash(:a => 1, :b => 2, "c" => 3, nil => 4, [] => 5)
8
+ h2 = h.dup
9
+
10
+ h.size.times do |i|
11
+ r = h.shift
12
+ r.should be_kind_of(Array)
13
+ h2[r.first].should == r.last
14
+ h.size.should == h2.size - i - 1
15
+ end
16
+
17
+ h.should == new_hash
18
+ end
19
+
20
+ it "returns nil from an empty hash " do
21
+ new_hash.shift.should == nil
22
+ end
23
+
24
+ it "returns (computed) default for empty hashes" do
25
+ new_hash(5).shift.should == 5
26
+ h = new_hash { |*args| args }
27
+ h.shift.should == [h, nil]
28
+ end
29
+
30
+ ruby_version_is "" ... "1.9" do
31
+ it "raises a TypeError if called on a frozen instance" do
32
+ lambda { HashSpecs.frozen_hash.shift }.should raise_error(TypeError)
33
+ lambda { HashSpecs.empty_frozen_hash.shift }.should raise_error(TypeError)
34
+ end
35
+ end
36
+
37
+ ruby_version_is "1.9" do
38
+ it "raises a RuntimeError if called on a frozen instance" do
39
+ lambda { HashSpecs.frozen_hash.shift }.should raise_error(RuntimeError)
40
+ lambda { HashSpecs.empty_frozen_hash.shift }.should raise_error(RuntimeError)
41
+ end
42
+ end
43
+ =end
44
+ end
@@ -0,0 +1,7 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+ require File.expand_path('../fixtures/classes', __FILE__)
3
+ require File.expand_path('../shared/length', __FILE__)
4
+
5
+ describe "Hash#size" do
6
+ it_behaves_like(:hash_length, :size)
7
+ end
@@ -0,0 +1,17 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+ require File.expand_path('../fixtures/classes', __FILE__)
3
+
4
+ describe "Hash#sort" do
5
+ it "converts self to a nested array of [key, value] arrays and sort with Array#sort" do
6
+ new_hash('a' => 'b', '1' => '2', 'b' => 'a').sort.should ==
7
+ [["1", "2"], ["a", "b"], ["b", "a"]]
8
+ end
9
+
10
+ it "works when some of the keys are themselves arrays" do
11
+ new_hash([1,2] => 5, [1,1] => 5).sort.should == [[[1,1],5], [[1,2],5]]
12
+ end
13
+
14
+ it "uses block to sort array if passed a block" do
15
+ new_hash(1 => 2, 2 => 9, 3 => 4).sort { |a,b| b <=> a }.should == [[3, 4], [2, 9], [1, 2]]
16
+ end
17
+ end
@@ -0,0 +1,7 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+ require File.expand_path('../fixtures/classes', __FILE__)
3
+ require File.expand_path('../shared/store', __FILE__)
4
+
5
+ describe "Hash#store" do
6
+ it_behaves_like(:hash_store, :store)
7
+ end
@@ -0,0 +1,29 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+ require File.expand_path('../fixtures/classes', __FILE__)
3
+
4
+ describe "Hash#to_a" do
5
+ it "returns a list of [key, value] pairs with same order as each()" do
6
+ h = new_hash(:a => 1, 1 => :a, 3 => :b, :b => 5)
7
+ pairs = []
8
+
9
+ h.each_pair do |key, value|
10
+ pairs << [key, value]
11
+ end
12
+
13
+ h.to_a.should be_kind_of(Array)
14
+ h.to_a.should == pairs
15
+ end
16
+
17
+ it "is called for Enumerable#entries" do
18
+ h = new_hash(:a => 1, 1 => :a, 3 => :b, :b => 5)
19
+ pairs = []
20
+
21
+ h.each_pair do |key, value|
22
+ pairs << [key, value]
23
+ end
24
+
25
+ ent = h.entries
26
+ ent.should be_kind_of(Array)
27
+ ent.should == pairs
28
+ end
29
+ end
@@ -0,0 +1,11 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+ require File.expand_path('../fixtures/classes', __FILE__)
3
+
4
+ describe "Hash#to_hash" do
5
+ =begin self
6
+ it "returns self" do
7
+ h = new_hash
8
+ h.to_hash.should equal(h)
9
+ end
10
+ =end
11
+ end
@@ -0,0 +1,20 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+ require File.expand_path('../fixtures/classes', __FILE__)
3
+ require File.expand_path('../shared/to_s', __FILE__)
4
+
5
+ describe "Hash#to_s" do
6
+
7
+ ruby_version_is "1.9" do
8
+ it_behaves_like :to_s, :to_s
9
+ end
10
+
11
+ ruby_version_is ""..."1.9" do
12
+ it "returns a string by calling Hash#to_a and using Array#join with default separator" do
13
+ h = new_hash(:fun => 'x', 1 => 3, nil => "ok", [] => :y)
14
+ h.to_a.to_s.should == h.to_s
15
+ old, $, = $,, ':'
16
+ h.to_a.to_s.should == h.to_s
17
+ $, = old
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,32 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ ruby_version_is "1.8.8" do
4
+ describe "Hash.try_convert" do
5
+ it "returns the argument if passed a Hash" do
6
+ h = {:foo => :glark}
7
+ Hash.try_convert(h).should == h
8
+ end
9
+
10
+ it "returns nil if the argument can't be coerced into a Hash" do
11
+ Hash.try_convert(Object.new).should be_nil
12
+ end
13
+
14
+ it "does not rescue exceptions raised by #to_hash" do
15
+ obj = mock("to_hash raises")
16
+ obj.should_receive(:to_hash).and_raise(RuntimeError)
17
+ lambda { Hash.try_convert obj }.should raise_error(RuntimeError)
18
+ end
19
+
20
+ it "coerces the argument with #to_hash" do
21
+ obj = mock('to_hash')
22
+ obj.should_receive(:to_hash).and_return({:foo => :bar})
23
+ Hash.try_convert(obj).should == {:foo => :bar}
24
+ end
25
+
26
+ it "raises a TypeError if #to_hash does not return a Hash" do
27
+ obj = mock("to_hash invalid")
28
+ obj.should_receive(:to_hash).and_return(:invalid_to_hash)
29
+ lambda { Hash.try_convert obj }.should raise_error(TypeError)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,7 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+ require File.expand_path('../fixtures/classes', __FILE__)
3
+ require File.expand_path('../shared/update', __FILE__)
4
+
5
+ describe "Hash#update" do
6
+ it_behaves_like(:hash_update, :update)
7
+ end