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,56 @@
1
+ require 'jactive_support/java_ext/iterable'
2
+ require File.expand_path('../shared/fixtures', __FILE__)
3
+
4
+ describe "java::lang::Iterable#clear" do
5
+ it "removes all elements" do
6
+ a = Itr[1, 2, 3, 4]
7
+ a.clear.should equal(a)
8
+ a.should == Itr[]
9
+ end
10
+
11
+ it "returns self" do
12
+ a = Itr[1]
13
+ oid = a.object_id
14
+ a.clear.object_id.should == oid
15
+ end
16
+
17
+ it "leaves the Iterable empty" do
18
+ a = Itr[1]
19
+ a.clear
20
+ a.empty?.should == true
21
+ end
22
+
23
+ it "keeps tainted status" do
24
+ a = Itr[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 { Itr[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 = Itr[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 iterable" do
47
+ lambda { IterableSpecs.frozen_iterable.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 iterable" do
53
+ lambda { IterableSpecs.frozen_iterable.clear }.should raise_error(RuntimeError)
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,71 @@
1
+ require 'jactive_support/java_ext/iterable'
2
+ require File.expand_path('../shared/fixtures', __FILE__)
3
+ require File.expand_path('../shared/enumeratorize', __FILE__)
4
+
5
+ describe "java::lang::Iterable#delete_if" do
6
+ before do
7
+ @a = Itr[ "a", "b", "c" ]
8
+ end
9
+
10
+ it "removes each element for which block returns true" do
11
+ @a = Itr[ "a", "b", "c" ]
12
+ @a.delete_if { |x| x >= "b" }
13
+ @a.should == Itr["a"]
14
+ end
15
+
16
+ it "returns self" do
17
+ @a.delete_if{ true }.equal?(@a).should be_true
18
+ end
19
+
20
+ it_behaves_like :enumeratorize, :delete_if
21
+
22
+ it "returns self when called on an Iterable emptied with #shift" do
23
+ iterable = Itr[1]
24
+ iterable.shift
25
+ iterable.delete_if { |x| true }.should equal(iterable)
26
+ end
27
+
28
+ ruby_version_is '1.8.7' do
29
+ it "returns an Enumerator if no block given, and the enumerator can modify the original iterable" do
30
+ enum = @a.delete_if
31
+ enum.should be_an_instance_of(enumerator_class)
32
+ @a.should_not be_empty
33
+ enum.each { true }
34
+ @a.should be_empty
35
+ end
36
+ end
37
+
38
+ ruby_version_is '' ... '1.9' do
39
+ it "raises a TypeError on a frozen iterable" do
40
+ lambda { IterableSpecs.frozen_iterable.delete_if {} }.should raise_error(TypeError)
41
+ end
42
+ it "raises a TypeError on an empty frozen iterable" do
43
+ lambda { IterableSpecs.empty_frozen_iterable.delete_if {} }.should raise_error(TypeError)
44
+ end
45
+ end
46
+
47
+ ruby_version_is '1.9' do
48
+ it "raises a RuntimeError on a frozen iterable" do
49
+ lambda { IterableSpecs.frozen_iterable.delete_if {} }.should raise_error(RuntimeError)
50
+ end
51
+ it "raises a RuntimeError on an empty frozen iterable" do
52
+ lambda { IterableSpecs.empty_frozen_iterable.delete_if {} }.should raise_error(RuntimeError)
53
+ end
54
+ end
55
+
56
+ it "keeps tainted status" do
57
+ @a.taint
58
+ @a.tainted?.should be_true
59
+ @a.delete_if{ true }
60
+ @a.tainted?.should be_true
61
+ end
62
+
63
+ ruby_version_is '1.9' do
64
+ it "keeps untrusted status" do
65
+ @a.untrust
66
+ @a.untrusted?.should be_true
67
+ @a.delete_if{ true }
68
+ @a.untrusted?.should be_true
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,10 @@
1
+ require 'jactive_support/java_ext/iterable'
2
+ require File.expand_path('../shared/fixtures', __FILE__)
3
+
4
+ describe "java::lang::Iterable#empty?" do
5
+ it "returns true if the iterable has no elements" do
6
+ Itr[].empty?.should == true
7
+ Itr[1].empty?.should == false
8
+ Itr[1, 2].empty?.should == false
9
+ end
10
+ end
@@ -0,0 +1,76 @@
1
+ require 'jactive_support/java_ext/iterable'
2
+ require File.expand_path('../shared/fixtures', __FILE__)
3
+ require File.expand_path('../shared/enumeratorize', __FILE__)
4
+
5
+ describe "java::lang::Iterable#reject!" do
6
+ it "removes elements for which block is true" do
7
+ a = Itr[3, 4, 5, 6, 7, 8, 9, 10, 11]
8
+ a.reject! { |i| i % 2 == 0 }.should equal(a)
9
+ a.should == Itr[3, 5, 7, 9, 11]
10
+ a.reject! { |i| i > 8 }
11
+ a.should == Itr[3, 5, 7]
12
+ a.reject! { |i| i < 4 }
13
+ a.should == Itr[5, 7]
14
+ a.reject! { |i| i == 5 }
15
+ a.should == Itr[7]
16
+ a.reject! { true }
17
+ a.should == Itr[]
18
+ a.reject! { true }
19
+ a.should == Itr[]
20
+ end
21
+
22
+ it "properly handles recursive iterables" do
23
+ empty = IterableSpecs.empty_recursive_iterable
24
+ empty_dup = empty.dup
25
+ empty.reject! { false }.should == nil
26
+ empty.should == empty_dup
27
+
28
+ empty = IterableSpecs.empty_recursive_iterable
29
+ empty.reject! { true }.should == Itr[]
30
+ empty.should == Itr[]
31
+
32
+ iterable = IterableSpecs.recursive_iterable
33
+ iterable_dup = iterable.dup
34
+ iterable.reject! { false }.should == nil
35
+ iterable.should == iterable_dup
36
+
37
+ iterable = IterableSpecs.recursive_iterable
38
+ iterable.reject! { true }.should == Itr[]
39
+ iterable.should == Itr[]
40
+ end
41
+
42
+ it "returns nil when called on an Iterable emptied with #shift" do
43
+ iterable = Itr[1]
44
+ iterable.shift
45
+ iterable.reject! { |x| true }.should == nil
46
+ end
47
+
48
+ it "returns nil if no changes are made" do
49
+ a = Itr[1, 2, 3]
50
+
51
+ a.reject! { |i| i < 0 }.should == nil
52
+
53
+ a.reject! { true }
54
+ a.reject! { true }.should == nil
55
+ end
56
+
57
+ ruby_version_is "" ... "1.9" do
58
+ it "raises a TypeError on a frozen iterable" do
59
+ lambda { IterableSpecs.frozen_iterable.reject! {} }.should raise_error(TypeError)
60
+ end
61
+ it "raises a TypeError on an empty frozen iterable" do
62
+ lambda { IterableSpecs.empty_frozen_iterable.reject! {} }.should raise_error(TypeError)
63
+ end
64
+ end
65
+
66
+ ruby_version_is "1.9" do
67
+ it "raises a RuntimeError on a frozen iterable" do
68
+ lambda { IterableSpecs.frozen_iterable.reject! {} }.should raise_error(RuntimeError)
69
+ end
70
+ it "raises a RuntimeError on an empty frozen iterable" do
71
+ lambda { IterableSpecs.empty_frozen_iterable.reject! {} }.should raise_error(RuntimeError)
72
+ end
73
+ end
74
+
75
+ it_behaves_like :enumeratorize, :reject!
76
+ end
@@ -0,0 +1,12 @@
1
+ shared_examples_for :enumeratorize do |method|
2
+ ruby_version_is '' ... '1.8.7' do
3
+ it 'raises a LocalJumpError if no block given' do
4
+ lambda{ Itr[1,2].send(method) }.should raise_error(LocalJumpError)
5
+ end
6
+ end
7
+ ruby_version_is '1.8.7' do
8
+ it 'returns an Enumerator if no block given' do
9
+ Itr[1,2].send(method).should be_an_instance_of(enumerator_class)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,90 @@
1
+ require File.expand_path('../../../../shared/version', __FILE__)
2
+ require File.expand_path('../../../../shared/fixtures', __FILE__)
3
+ require 'jactive_support/core_ext/to_java'
4
+ require 'jactive_support/core_ext/to_java_list'
5
+
6
+ class Itr
7
+ class Iterator
8
+ include java::util::Iterator
9
+
10
+ def initialize(array)
11
+ @array = array
12
+ @next = 0
13
+ end
14
+
15
+ def hasNext
16
+ @next < @array.size
17
+ end
18
+
19
+ def next
20
+ raise java::util::NoSuchElementException.new('No next element available') unless hasNext
21
+ @next += 1
22
+ @array[@next-1]
23
+ end
24
+
25
+ def remove
26
+ raise java::lang::IllegalStateException.new('Can not remove until after next is called') if @next == 0
27
+ @next -= 1
28
+ @array.delete_at(@next)
29
+ end
30
+ end
31
+
32
+ def self.[](*args)
33
+ new(args)
34
+ end
35
+
36
+ attr_reader :value
37
+
38
+ def initialize(arr)
39
+ @value = arr
40
+ end
41
+
42
+ include java::lang::Iterable
43
+
44
+ def iterator
45
+ Iterator.new(@value)
46
+ end
47
+
48
+ def ==(o)
49
+ o = o.to_a if o.respond_to?(:to_a)
50
+ to_a == o
51
+ end
52
+
53
+ def to_a
54
+ value
55
+ end
56
+
57
+ def <<(o)
58
+ value << o
59
+ end
60
+
61
+ def [](*args)
62
+ Itr.new(value[*args])
63
+ end
64
+ end
65
+
66
+ module IterableSpecs
67
+ def self.frozen_iterable
68
+ frozen_array = Itr[1,2,3]
69
+ frozen_array.freeze
70
+ frozen_array
71
+ end
72
+
73
+ def self.empty_frozen_iterable
74
+ frozen_array = Itr[]
75
+ frozen_array.freeze
76
+ frozen_array
77
+ end
78
+
79
+ def self.recursive_iterable
80
+ a = Itr[1, 'two', 3.0]
81
+ 5.times { a << a }
82
+ a
83
+ end
84
+
85
+ def self.empty_recursive_iterable
86
+ a = Itr[]
87
+ a << a
88
+ a
89
+ end
90
+ end
@@ -0,0 +1,160 @@
1
+ require 'jactive_support/java_ext/iterable'
2
+ require File.expand_path('../shared/fixtures', __FILE__)
3
+
4
+ describe "java::lang::Iterable#shift" do
5
+ it "removes and returns the first element" do
6
+ a = Itr[5, 1, 1, 5, 4]
7
+ a.shift.should == 5
8
+ a.should == Itr[1, 1, 5, 4]
9
+ a.shift.should == 1
10
+ a.should == Itr[1, 5, 4]
11
+ a.shift.should == 1
12
+ a.should == Itr[5, 4]
13
+ a.shift.should == 5
14
+ a.should == Itr[4]
15
+ a.shift.should == 4
16
+ a.should == Itr[]
17
+ end
18
+
19
+ it "returns nil when the iterable is empty" do
20
+ Itr[].shift.should == nil
21
+ end
22
+
23
+ it "properly handles recursive iterables" do
24
+ empty = IterableSpecs.empty_recursive_iterable
25
+ empty.shift.should == Itr[]
26
+ empty.should == Itr[]
27
+
28
+ iterable = IterableSpecs.recursive_iterable
29
+ iterable.shift.should == 1
30
+ iterable[0..2].should == Itr['two', 3.0, iterable]
31
+ end
32
+
33
+ ruby_version_is "" ... "1.9" do
34
+ it "raises a TypeError on a frozen iterable" do
35
+ lambda { IterableSpecs.frozen_iterable.shift }.should raise_error(TypeError)
36
+ end
37
+ it "raises a TypeError on an empty frozen iterable" do
38
+ lambda { IterableSpecs.empty_frozen_iterable.shift }.should raise_error(TypeError)
39
+ end
40
+ end
41
+
42
+ ruby_version_is "1.9" do
43
+ it "raises a RuntimeError on a frozen iterable" do
44
+ lambda { IterableSpecs.frozen_iterable.shift }.should raise_error(RuntimeError)
45
+ end
46
+ it "raises a RuntimeError on an empty frozen iterable" do
47
+ lambda { IterableSpecs.empty_frozen_iterable.shift }.should raise_error(RuntimeError)
48
+ end
49
+ end
50
+
51
+ ruby_version_is '' ... '1.8.7' do
52
+ it "raises an ArgumentError if passed an argument" do
53
+ lambda{ Itr[1, 2].shift(1) }.should raise_error(ArgumentError)
54
+ end
55
+ end
56
+
57
+ describe "passed a number n as an argument" do
58
+ ruby_version_is '1.8.7' do
59
+ it "removes and returns an iterable with the first n element of the iterable" do
60
+ a = Itr[1, 2, 3, 4, 5, 6]
61
+
62
+ a.shift(0).should == []
63
+ a.should == Itr[1, 2, 3, 4, 5, 6]
64
+
65
+ a.shift(1).should == [1]
66
+ a.should == Itr[2, 3, 4, 5, 6]
67
+
68
+ a.shift(2).should == [2, 3]
69
+ a.should == Itr[4, 5, 6]
70
+
71
+ a.shift(3).should == [4, 5, 6]
72
+ a.should == Itr[]
73
+ end
74
+
75
+ it "does not corrupt the iterable when shift without arguments is followed by shift with an argument" do
76
+ a = Itr[1, 2, 3, 4, 5]
77
+
78
+ a.shift.should == 1
79
+ a.shift(3).should == [2, 3, 4]
80
+ a.should == Itr[5]
81
+ end
82
+
83
+ it "returns a new empty iterable if there are no more elements" do
84
+ a = Itr[]
85
+ popped1 = a.shift(1)
86
+ popped1.should == []
87
+ a.should == Itr[]
88
+
89
+ popped2 = a.shift(2)
90
+ popped2.should == []
91
+ a.should == Itr[]
92
+
93
+ popped1.should_not equal(popped2)
94
+ end
95
+
96
+ it "returns whole elements if n exceeds size of the iterable" do
97
+ a = Itr[1, 2, 3, 4, 5]
98
+ a.shift(6).should == [1, 2, 3, 4, 5]
99
+ a.should == Itr[]
100
+ end
101
+
102
+ it "does not return self even when it returns whole elements" do
103
+ a = Itr[1, 2, 3, 4, 5]
104
+ a.shift(5).should_not equal(a)
105
+
106
+ a = Itr[1, 2, 3, 4, 5]
107
+ a.shift(6).should_not equal(a)
108
+ end
109
+
110
+ it "raises an ArgumentError if n is negative" do
111
+ lambda{ Itr[1, 2, 3].shift(-1) }.should raise_error(ArgumentError)
112
+ end
113
+
114
+ it "tries to convert n to an Integer using #to_int" do
115
+ a = Itr[1, 2, 3, 4]
116
+ a.shift(2.3).should == [1, 2]
117
+
118
+ obj = mock('to_int')
119
+ obj.should_receive(:to_int).and_return(2)
120
+ a.should == Itr[3, 4]
121
+ a.shift(obj).should == [3, 4]
122
+ a.should == Itr[]
123
+ end
124
+
125
+ it "raises a TypeError when the passed n can be coerced to Integer" do
126
+ lambda{ Itr[1, 2].shift("cat") }.should raise_error(TypeError)
127
+ lambda{ Itr[1, 2].shift(nil) }.should raise_error(TypeError)
128
+ end
129
+
130
+ it "raises an ArgumentError if more arguments are passed" do
131
+ lambda{ Itr[1, 2].shift(1, 2) }.should raise_error(ArgumentError)
132
+ end
133
+
134
+ it "returns ruby arrays" do
135
+ Itr[1, 2, 3].shift(2).should be_kind_of(Array)
136
+ end
137
+
138
+ it "returns an untainted iterable even if the iterable is tainted" do
139
+ ary = Itr[1, 2].taint
140
+ ary.shift(2).tainted?.should be_false
141
+ ary.shift(0).tainted?.should be_false
142
+ end
143
+
144
+ it "keeps taint status" do
145
+ a = Itr[1, 2].taint
146
+ a.shift(2)
147
+ a.tainted?.should be_true
148
+ a.shift(2)
149
+ a.tainted?.should be_true
150
+ end
151
+
152
+ ruby_version_is '' ... '1.9' do
153
+ it "raises a TypeError on a frozen iterable" do
154
+ lambda { IterableSpecs.frozen_iterable.shift(2) }.should raise_error(TypeError)
155
+ lambda { IterableSpecs.frozen_iterable.shift(0) }.should raise_error(TypeError)
156
+ end
157
+ end
158
+ end
159
+ end
160
+ end