diff --git a/core/enumerable/compact_spec.rb b/core/enumerable/compact_spec.rb index 1895430c4..a3bd4b686 100644 --- a/core/enumerable/compact_spec.rb +++ b/core/enumerable/compact_spec.rb @@ -2,6 +2,18 @@ require_relative 'fixtures/classes' describe "Enumerable#compact" do + describe "value packing of source yields" do + it "packs a multi-argument source yield into an Array" do + e = Enumerator.new { |y| y.yield 1, 2 } + e.compact.should == [[1, 2]] + end + + it "removes a zero-argument source yield like nil" do + e = Enumerator.new { |y| y.yield; y.yield :v } + e.compact.should == [:v] + end + end + it 'returns array without nil elements' do arr = EnumerableSpecs::Numerous.new(nil, 1, 2, nil, true) arr.compact.should == [1, 2, true] diff --git a/core/enumerable/drop_spec.rb b/core/enumerable/drop_spec.rb index 8d95f464b..18d8a9822 100644 --- a/core/enumerable/drop_spec.rb +++ b/core/enumerable/drop_spec.rb @@ -1,7 +1,15 @@ require_relative '../../spec_helper' require_relative 'fixtures/classes' +require_relative 'shared/value_packing' describe "Enumerable#drop" do + describe "value packing of source yields" do + before :each do + @take = -> e { e.drop(0) } + end + it_behaves_like :enumerable_value_packing, nil + end + before :each do @enum = EnumerableSpecs::Numerous.new(3, 2, 1, :go) end diff --git a/core/enumerable/drop_while_spec.rb b/core/enumerable/drop_while_spec.rb index 4b4fdf2d4..3d5bd06dc 100644 --- a/core/enumerable/drop_while_spec.rb +++ b/core/enumerable/drop_while_spec.rb @@ -1,8 +1,16 @@ require_relative '../../spec_helper' require_relative 'fixtures/classes' require_relative 'shared/enumerable_enumeratorized' +require_relative 'shared/value_packing' describe "Enumerable#drop_while" do + describe "value packing of source yields" do + before :each do + @take = -> e { e.drop_while { false } } + end + it_behaves_like :enumerable_value_packing, nil + end + before :each do @enum = EnumerableSpecs::Numerous.new(3, 2, 1, :go) end diff --git a/core/enumerable/reject_spec.rb b/core/enumerable/reject_spec.rb index 31e89f5b0..7bd32fe4d 100644 --- a/core/enumerable/reject_spec.rb +++ b/core/enumerable/reject_spec.rb @@ -1,8 +1,16 @@ require_relative '../../spec_helper' require_relative 'fixtures/classes' require_relative 'shared/enumerable_enumeratorized' +require_relative 'shared/value_packing' describe "Enumerable#reject" do + describe "value packing of source yields" do + before :each do + @take = -> e { e.reject { false } } + end + it_behaves_like :enumerable_value_packing, nil + end + it "returns an array of the elements for which block is false" do EnumerableSpecs::Numerous.new.reject { |i| i > 3 }.should == [2, 3, 1] entries = (1..10).to_a diff --git a/core/enumerable/select_spec.rb b/core/enumerable/select_spec.rb index a53c228a4..35e344c58 100644 --- a/core/enumerable/select_spec.rb +++ b/core/enumerable/select_spec.rb @@ -1,8 +1,16 @@ require_relative '../../spec_helper' require_relative 'fixtures/classes' require_relative 'shared/enumerable_enumeratorized' +require_relative 'shared/value_packing' describe "Enumerable#select" do + describe "value packing of source yields" do + before :each do + @take = -> e { e.select { true } } + end + it_behaves_like :enumerable_value_packing, nil + end + before :each do ScratchPad.record [] @elements = (1..10).to_a diff --git a/core/enumerable/take_while_spec.rb b/core/enumerable/take_while_spec.rb index 918bfc897..51951b107 100644 --- a/core/enumerable/take_while_spec.rb +++ b/core/enumerable/take_while_spec.rb @@ -1,8 +1,16 @@ require_relative '../../spec_helper' require_relative 'fixtures/classes' require_relative 'shared/enumerable_enumeratorized' +require_relative 'shared/value_packing' describe "Enumerable#take_while" do + describe "value packing of source yields" do + before :each do + @take = -> e { e.take_while { true } } + end + it_behaves_like :enumerable_value_packing, nil + end + before :each do @enum = EnumerableSpecs::Numerous.new(3, 2, 1, :go) end diff --git a/core/enumerable/uniq_spec.rb b/core/enumerable/uniq_spec.rb index a1ed44796..e2999b869 100644 --- a/core/enumerable/uniq_spec.rb +++ b/core/enumerable/uniq_spec.rb @@ -1,7 +1,15 @@ require_relative '../../spec_helper' require_relative 'fixtures/classes' +require_relative 'shared/value_packing' describe 'Enumerable#uniq' do + describe "value packing of source yields" do + before :each do + @take = -> e { e.uniq } + end + it_behaves_like :enumerable_value_packing, nil + end + it 'returns an array that contains only unique elements' do [0, 1, 2, 3].to_enum.uniq { |n| n.even? }.should == [0, 1] end diff --git a/core/enumerator/lazy/compact_spec.rb b/core/enumerator/lazy/compact_spec.rb index 7305e1c9c..baa80acd3 100644 --- a/core/enumerator/lazy/compact_spec.rb +++ b/core/enumerator/lazy/compact_spec.rb @@ -2,6 +2,23 @@ require_relative 'fixtures/classes' describe "Enumerator::Lazy#compact" do + # Cannot use shared/value_packing.rb examples: the packed nil is removed by #compact. + describe "value packing of source yields" do + it "packs a multi-argument source yield into an Array" do + e = Enumerator.new { |y| y.yield 1, 2 } + args = nil + e.lazy.compact.each { |*a| args = a } + args.should == [[1, 2]] + end + + it "removes a zero-argument source yield like nil" do + e = Enumerator.new { |y| y.yield; y.yield :v } + collected = [] + e.lazy.compact.each { |*a| collected << a } + collected.should == [[:v]] + end + end + it 'returns array without nil elements' do arr = [1, nil, 3, false, 5].to_enum.lazy.compact arr.should.instance_of?(Enumerator::Lazy) diff --git a/core/enumerator/lazy/drop_spec.rb b/core/enumerator/lazy/drop_spec.rb index 95ac7e9ec..724992066 100644 --- a/core/enumerator/lazy/drop_spec.rb +++ b/core/enumerator/lazy/drop_spec.rb @@ -2,8 +2,16 @@ require_relative '../../../spec_helper' require_relative 'fixtures/classes' +require_relative '../../enumerable/shared/value_packing' describe "Enumerator::Lazy#drop" do + describe "value packing of source yields (matches Enumerable#drop)" do + before :each do + @take = -> e { e.lazy.drop(0) } + end + it_behaves_like :enumerable_value_packing, nil + end + before :each do @yieldsmixed = EnumeratorLazySpecs::YieldsMixed.new.to_enum.lazy @eventsmixed = EnumeratorLazySpecs::EventsMixed.new.to_enum.lazy diff --git a/core/enumerator/lazy/drop_while_spec.rb b/core/enumerator/lazy/drop_while_spec.rb index 65f3007de..2196fc650 100644 --- a/core/enumerator/lazy/drop_while_spec.rb +++ b/core/enumerator/lazy/drop_while_spec.rb @@ -2,8 +2,16 @@ require_relative '../../../spec_helper' require_relative 'fixtures/classes' +require_relative '../../enumerable/shared/value_packing' describe "Enumerator::Lazy#drop_while" do + describe "value packing of source yields (matches Enumerable#drop_while)" do + before :each do + @take = -> e { e.lazy.drop_while { false } } + end + it_behaves_like :enumerable_value_packing, nil + end + before :each do @yieldsmixed = EnumeratorLazySpecs::YieldsMixed.new.to_enum.lazy @eventsmixed = EnumeratorLazySpecs::EventsMixed.new.to_enum.lazy diff --git a/core/enumerator/lazy/reject_spec.rb b/core/enumerator/lazy/reject_spec.rb index 374d4df14..23c882b1d 100644 --- a/core/enumerator/lazy/reject_spec.rb +++ b/core/enumerator/lazy/reject_spec.rb @@ -2,8 +2,16 @@ require_relative '../../../spec_helper' require_relative 'fixtures/classes' +require_relative '../../enumerable/shared/value_packing' describe "Enumerator::Lazy#reject" do + describe "value packing of source yields (matches Enumerable#reject)" do + before :each do + @take = -> e { e.lazy.reject { false } } + end + it_behaves_like :enumerable_value_packing, nil + end + before :each do @yieldsmixed = EnumeratorLazySpecs::YieldsMixed.new.to_enum.lazy @eventsmixed = EnumeratorLazySpecs::EventsMixed.new.to_enum.lazy diff --git a/core/enumerator/lazy/select_spec.rb b/core/enumerator/lazy/select_spec.rb index 29c8f1bd8..5d6b68cff 100644 --- a/core/enumerator/lazy/select_spec.rb +++ b/core/enumerator/lazy/select_spec.rb @@ -1,7 +1,15 @@ require_relative '../../../spec_helper' require_relative 'fixtures/classes' +require_relative '../../enumerable/shared/value_packing' describe "Enumerator::Lazy#select" do + describe "value packing of source yields (matches Enumerable#select)" do + before :each do + @take = -> e { e.lazy.select { true } } + end + it_behaves_like :enumerable_value_packing, nil + end + before :each do @yieldsmixed = EnumeratorLazySpecs::YieldsMixed.new.to_enum.lazy @eventsmixed = EnumeratorLazySpecs::EventsMixed.new.to_enum.lazy diff --git a/core/enumerator/lazy/take_while_spec.rb b/core/enumerator/lazy/take_while_spec.rb index c369712c5..1dc62b242 100644 --- a/core/enumerator/lazy/take_while_spec.rb +++ b/core/enumerator/lazy/take_while_spec.rb @@ -2,8 +2,16 @@ require_relative '../../../spec_helper' require_relative 'fixtures/classes' +require_relative '../../enumerable/shared/value_packing' describe "Enumerator::Lazy#take_while" do + describe "value packing of source yields (matches Enumerable#take_while)" do + before :each do + @take = -> e { e.lazy.take_while { true } } + end + it_behaves_like :enumerable_value_packing, nil + end + before :each do @yieldsmixed = EnumeratorLazySpecs::YieldsMixed.new.to_enum.lazy @eventsmixed = EnumeratorLazySpecs::EventsMixed.new.to_enum.lazy diff --git a/core/enumerator/lazy/uniq_spec.rb b/core/enumerator/lazy/uniq_spec.rb index d30ed8df2..d928cb06e 100644 --- a/core/enumerator/lazy/uniq_spec.rb +++ b/core/enumerator/lazy/uniq_spec.rb @@ -1,7 +1,15 @@ require_relative '../../../spec_helper' require_relative 'fixtures/classes' +require_relative '../../enumerable/shared/value_packing' describe 'Enumerator::Lazy#uniq' do + describe "value packing of source yields (matches Enumerable#uniq)" do + before :each do + @take = -> e { e.lazy.uniq } + end + it_behaves_like :enumerable_value_packing, nil + end + context 'without block' do before :each do @lazy = [0, 1, 0, 1].to_enum.lazy.uniq diff --git a/core/enumerator/lazy/with_index_spec.rb b/core/enumerator/lazy/with_index_spec.rb index 2e983fd3b..513d0317b 100644 --- a/core/enumerator/lazy/with_index_spec.rb +++ b/core/enumerator/lazy/with_index_spec.rb @@ -4,6 +4,29 @@ require_relative 'fixtures/classes' describe "Enumerator::Lazy#with_index" do + describe "value packing of source yields" do + it "pairs a packed Array with the index for a multi-argument source yield" do + e = Enumerator.new { |y| y.yield 1, 2 } + args = nil + e.lazy.with_index.each { |*a| args = a } + args.should == [[[1, 2], 0]] + end + + it "pairs nil with the index for a zero-argument source yield" do + e = Enumerator.new { |y| y.yield } + args = nil + e.lazy.with_index.each { |*a| args = a } + args.should == [[nil, 0]] + end + + it "calls the block with the packed value and the index" do + e = Enumerator.new { |y| y.yield 1, 2 } + seen = [] + e.lazy.with_index { |v, i| seen << [v, i] }.force + seen.should == [[[1, 2], 0]] + end + end + it "enumerates with an index" do (0..Float::INFINITY).lazy.with_index.map { |i, idx| [i, idx] }.first(3).should == [[0, 0], [1, 1], [2, 2]] end