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,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
|