diff options
author | eregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-06-13 21:41:45 +0000 |
---|---|---|
committer | eregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-06-13 21:41:45 +0000 |
commit | 67078e81f57523fdf65ba7a9d919a146763363a5 (patch) | |
tree | 795ec86c6a90842d9168b0900d058c46244249f3 /spec/ruby/core/enumerable | |
parent | 78890babe74e87aea79d1022ab455aeddf8a3310 (diff) | |
download | ruby-67078e81f57523fdf65ba7a9d919a146763363a5.tar.gz |
Update to ruby/spec@4bc7a2b
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63652 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'spec/ruby/core/enumerable')
-rw-r--r-- | spec/ruby/core/enumerable/all_spec.rb | 101 | ||||
-rw-r--r-- | spec/ruby/core/enumerable/any_spec.rb | 42 | ||||
-rw-r--r-- | spec/ruby/core/enumerable/fixtures/classes.rb | 14 | ||||
-rw-r--r-- | spec/ruby/core/enumerable/none_spec.rb | 185 | ||||
-rw-r--r-- | spec/ruby/core/enumerable/one_spec.rb | 159 |
5 files changed, 387 insertions, 114 deletions
diff --git a/spec/ruby/core/enumerable/all_spec.rb b/spec/ruby/core/enumerable/all_spec.rb index 1c96cdea17..b0edb14532 100644 --- a/spec/ruby/core/enumerable/all_spec.rb +++ b/spec/ruby/core/enumerable/all_spec.rb @@ -2,12 +2,11 @@ require_relative '../../spec_helper' require_relative 'fixtures/classes' describe "Enumerable#all?" do - before :each do @enum = EnumerableSpecs::Numerous.new @empty = EnumerableSpecs::Empty.new() - @enum1 = [0, 1, 2, -1] - @enum2 = [nil, false, true] + @enum1 = EnumerableSpecs::Numerous.new(0, 1, 2, -1) + @enum2 = EnumerableSpecs::Numerous.new(nil, false, true) end it "always returns true on empty enumeration" do @@ -21,6 +20,21 @@ describe "Enumerable#all?" do {}.all? { nil }.should == true end + it "raises an ArgumentError when more than 1 argument is provided" do + lambda { @enum.all?(1, 2, 3) }.should raise_error(ArgumentError) + lambda { [].all?(1, 2, 3) }.should raise_error(ArgumentError) + lambda { {}.all?(1, 2, 3) }.should raise_error(ArgumentError) + end + + ruby_version_is ""..."2.5" do + it "raises an ArgumentError when any arguments provided" do + lambda { @enum.all?(Proc.new {}) }.should raise_error(ArgumentError) + lambda { @enum.all?(nil) }.should raise_error(ArgumentError) + lambda { @empty.all?(1) }.should raise_error(ArgumentError) + lambda { @enum1.all?(1) {} }.should raise_error(ArgumentError) + end + end + it "does not hide exceptions out of #each" do lambda { EnumerableSpecs::ThrowingEach.new.all? @@ -58,16 +72,6 @@ describe "Enumerable#all?" do multi = EnumerableSpecs::YieldsMultiWithFalse.new multi.all?.should be_true end - - ruby_version_is "2.5" do - describe "given a pattern argument" do - # This spec should be replaced by more extensive ones - it "returns true iff all match that pattern" do - @enum.all?(Integer).should == true - @enum2.all?(NilClass).should == false - end - end - end end describe "with block" do @@ -117,14 +121,79 @@ describe "Enumerable#all?" do it "gathers initial args as elements when each yields multiple" do multi = EnumerableSpecs::YieldsMulti.new - multi.all? {|e| !(Array === e) }.should be_true + yielded = [] + multi.all? { |e| yielded << e }.should == true + yielded.should == [1, 3, 6] end it "yields multiple arguments when each yields multiple" do multi = EnumerableSpecs::YieldsMulti.new yielded = [] - multi.all? {|e, i| yielded << [e, i] } - yielded.should == [[1, 2], [3, 4], [6, 7]] + multi.all? { |*args| yielded << args }.should == true + yielded.should == [[1, 2], [3, 4, 5], [6, 7, 8, 9]] + end + end + + ruby_version_is "2.5" do + describe 'when given a pattern argument' do + it "calls `===` on the pattern the return value " do + pattern = EnumerableSpecs::Pattern.new { |x| x >= 0 } + @enum1.all?(pattern).should == false + pattern.yielded.should == [[0], [1], [2], [-1]] + end + + it "ignores block" do + @enum2.all?(NilClass) { raise }.should == false + [1, 2, nil].all?(NilClass) { raise }.should == false + {a: 1}.all?(Array) { raise }.should == true + end + + it "always returns true on empty enumeration" do + @empty.all?(Integer).should == true + [].all?(Integer).should == true + {}.all?(NilClass).should == true + end + + it "does not hide exceptions out of #each" do + lambda { + EnumerableSpecs::ThrowingEach.new.all?(Integer) + }.should raise_error(RuntimeError) + end + + it "returns true if the pattern never returns false or nil" do + pattern = EnumerableSpecs::Pattern.new { |x| 42 } + @enum.all?(pattern).should == true + + [1, 42, 3].all?(pattern).should == true + + pattern = EnumerableSpecs::Pattern.new { |x| Array === x } + {a: 1, b: 2}.all?(pattern).should == true + end + + it "returns false if the pattern ever returns false or nil" do + pattern = EnumerableSpecs::Pattern.new { |x| x >= 0 } + @enum1.all?(pattern).should == false + pattern.yielded.should == [[0], [1], [2], [-1]] + + [1, 2, 3, -1].all?(pattern).should == false + + pattern = EnumerableSpecs::Pattern.new { |x| x[1] >= 0 } + {a: 1, b: -1}.all?(pattern).should == false + end + + it "does not hide exceptions out of pattern#===" do + pattern = EnumerableSpecs::Pattern.new { raise "from pattern" } + lambda { + @enum.all?(pattern) + }.should raise_error(RuntimeError) + end + + it "calls the pattern with gathered array when yielded with multiple arguments" do + multi = EnumerableSpecs::YieldsMulti.new + pattern = EnumerableSpecs::Pattern.new { true } + multi.all?(pattern).should == true + pattern.yielded.should == [[[1, 2]], [[3, 4, 5]], [[6, 7, 8, 9]]] + end end end end diff --git a/spec/ruby/core/enumerable/any_spec.rb b/spec/ruby/core/enumerable/any_spec.rb index cd25f1440c..a4e98df736 100644 --- a/spec/ruby/core/enumerable/any_spec.rb +++ b/spec/ruby/core/enumerable/any_spec.rb @@ -4,9 +4,9 @@ require_relative 'fixtures/classes' describe "Enumerable#any?" do before :each do @enum = EnumerableSpecs::Numerous.new - @empty = EnumerableSpecs::Empty.new() - @enum1 = [0, 1, 2, -1] - @enum2 = [nil, false, true] + @empty = EnumerableSpecs::Empty.new + @enum1 = EnumerableSpecs::Numerous.new(0, 1, 2, -1) + @enum2 = EnumerableSpecs::Numerous.new(nil, false, true) end it "always returns false on empty enumeration" do @@ -86,7 +86,7 @@ describe "Enumerable#any?" do @enum2.any? { |i| i == nil }.should == true end - it "any? should return false if the block never returns other than false or nil" do + it "returns false if the block never returns other than false or nil" do @enum.any? { false }.should == false @enum.any? { nil }.should == false @@ -134,32 +134,21 @@ describe "Enumerable#any?" do it "gathers initial args as elements when each yields multiple" do multi = EnumerableSpecs::YieldsMulti.new - multi.any? {|e| e == 1 }.should be_true + yielded = [] + multi.any? { |e| yielded << e; false }.should == false + yielded.should == [1, 3, 6] end it "yields multiple arguments when each yields multiple" do multi = EnumerableSpecs::YieldsMulti.new yielded = [] - multi.any? {|e, i| yielded << [e, i] } - yielded.should == [[1, 2]] + multi.any? { |*args| yielded << args; false }.should == false + yielded.should == [[1, 2], [3, 4, 5], [6, 7, 8, 9]] end - end ruby_version_is "2.5" do describe 'when given a pattern argument' do - class EnumerableSpecs::Pattern - attr_reader :yielded - def initialize(&block) - @block = block - @yielded = [] - end - def ===(*args) - @yielded << args - @block.call(*args) - end - end - it "calls `===` on the pattern the return value " do pattern = EnumerableSpecs::Pattern.new { |x| x == 2 } @enum1.any?(pattern).should == true @@ -195,7 +184,7 @@ describe "Enumerable#any?" do {a: 1, b: 2}.any?(pattern).should == true end - it "any? should return false if the block never returns other than false or nil" do + it "returns false if the block never returns other than false or nil" do pattern = EnumerableSpecs::Pattern.new { |x| nil } @enum1.any?(pattern).should == false pattern.yielded.should == [[0], [1], [2], [-1]] @@ -204,7 +193,7 @@ describe "Enumerable#any?" do {a: 1}.any?(pattern).should == false end - it "does not hide exceptions out of the block" do + it "does not hide exceptions out of pattern#===" do pattern = EnumerableSpecs::Pattern.new { raise "from pattern" } lambda { @enum.any?(pattern) @@ -212,13 +201,10 @@ describe "Enumerable#any?" do end it "calls the pattern with gathered array when yielded with multiple arguments" do + multi = EnumerableSpecs::YieldsMulti.new pattern = EnumerableSpecs::Pattern.new { false } - EnumerableSpecs::YieldsMixed2.new.any?(pattern).should == false - pattern.yielded.should == EnumerableSpecs::YieldsMixed2.gathered_yields.map { |x| [x] } - - pattern = EnumerableSpecs::Pattern.new { false } - {a: 1, b: 2}.any?(pattern).should == false - pattern.yielded.should == [[[:a, 1]], [[:b, 2]]] + multi.any?(pattern).should == false + pattern.yielded.should == [[[1, 2]], [[3, 4, 5]], [[6, 7, 8, 9]]] end end end diff --git a/spec/ruby/core/enumerable/fixtures/classes.rb b/spec/ruby/core/enumerable/fixtures/classes.rb index 26a8aff8e2..e50bf34779 100644 --- a/spec/ruby/core/enumerable/fixtures/classes.rb +++ b/spec/ruby/core/enumerable/fixtures/classes.rb @@ -328,4 +328,18 @@ module EnumerableSpecs EnumerableMapping.new(self, block) end end + + class Pattern + attr_reader :yielded + + def initialize(&block) + @block = block + @yielded = [] + end + + def ===(*args) + @yielded << args + @block.call(*args) + end + end end # EnumerableSpecs utility classes diff --git a/spec/ruby/core/enumerable/none_spec.rb b/spec/ruby/core/enumerable/none_spec.rb index 4425875f4b..04fb64e089 100644 --- a/spec/ruby/core/enumerable/none_spec.rb +++ b/spec/ruby/core/enumerable/none_spec.rb @@ -2,67 +2,164 @@ require_relative '../../spec_helper' require_relative 'fixtures/classes' describe "Enumerable#none?" do - it "returns true if none of the elements in self are true" do - e = EnumerableSpecs::Numerous.new(false, nil, false) - e.none?.should be_true + before :each do + @empty = EnumerableSpecs::Empty.new + @enum = EnumerableSpecs::Numerous.new + @enum1 = EnumerableSpecs::Numerous.new(0, 1, 2, -1) + @enum2 = EnumerableSpecs::Numerous.new(nil, false, true) end - it "returns false if at least one of the elements in self are true" do - e = EnumerableSpecs::Numerous.new(false, nil, true, false) - e.none?.should be_false + it "always returns true on empty enumeration" do + @empty.none?.should == true + @empty.none? { true }.should == true end - it "gathers whole arrays as elements when each yields multiple" do - # This spec doesn't spec what it says it does - multi = EnumerableSpecs::YieldsMultiWithFalse.new - multi.none?.should be_false + it "raises an ArgumentError when more than 1 argument is provided" do + lambda { @enum.none?(1, 2, 3) }.should raise_error(ArgumentError) + lambda { [].none?(1, 2, 3) }.should raise_error(ArgumentError) + lambda { {}.none?(1, 2, 3) }.should raise_error(ArgumentError) end - ruby_version_is "2.5" do - describe "given a pattern argument" do - # This spec should be replaced by more extensive ones - it "returns true iff none match that pattern" do - EnumerableSpecs::Numerous.new.none?(Float).should == true - [nil, false, true].none?(NilClass).should == false - end + ruby_version_is ""..."2.5" do + it "raises an ArgumentError when any arguments provided" do + lambda { @enum.none?(Proc.new {}) }.should raise_error(ArgumentError) + lambda { @enum.none?(nil) }.should raise_error(ArgumentError) + lambda { @empty.none?(1) }.should raise_error(ArgumentError) + lambda { @enum.none?(1) {} }.should raise_error(ArgumentError) end end -end -describe "Enumerable#none? with a block" do - before :each do - @e = EnumerableSpecs::Numerous.new(1,1,2,3,4) - end + it "does not hide exceptions out of #each" do + lambda { + EnumerableSpecs::ThrowingEach.new.none? + }.should raise_error(RuntimeError) - it "passes each element to the block in turn until it returns true" do - acc = [] - @e.none? {|e| acc << e; false } - acc.should == [1,1,2,3,4] + lambda { + EnumerableSpecs::ThrowingEach.new.none? { false } + }.should raise_error(RuntimeError) end - it "stops passing elements to the block when it returns true" do - acc = [] - @e.none? {|e| acc << e; e == 3 ? true : false } - acc.should == [1,1,2,3] - end + describe "with no block" do + it "returns true if none of the elements in self are true" do + e = EnumerableSpecs::Numerous.new(false, nil, false) + e.none?.should be_true + end - it "returns true if the block never returns true" do - @e.none? {|e| false }.should be_true - end + it "returns false if at least one of the elements in self are true" do + e = EnumerableSpecs::Numerous.new(false, nil, true, false) + e.none?.should be_false + end - it "returns false if the block ever returns true" do - @e.none? {|e| e == 3 ? true : false }.should be_false + it "gathers whole arrays as elements when each yields multiple" do + # This spec doesn't spec what it says it does + multi = EnumerableSpecs::YieldsMultiWithFalse.new + multi.none?.should be_false + end end - it "gathers initial args as elements when each yields multiple" do - multi = EnumerableSpecs::YieldsMulti.new - multi.none? {|e| e == [1, 2] }.should be_true + describe "with a block" do + before :each do + @e = EnumerableSpecs::Numerous.new(1,1,2,3,4) + end + + it "passes each element to the block in turn until it returns true" do + acc = [] + @e.none? {|e| acc << e; false } + acc.should == [1,1,2,3,4] + end + + it "stops passing elements to the block when it returns true" do + acc = [] + @e.none? {|e| acc << e; e == 3 ? true : false } + acc.should == [1,1,2,3] + end + + it "returns true if the block never returns true" do + @e.none? {|e| false }.should be_true + end + + it "returns false if the block ever returns true" do + @e.none? {|e| e == 3 ? true : false }.should be_false + end + + it "does not hide exceptions out of the block" do + lambda { + @enum.none? { raise "from block" } + }.should raise_error(RuntimeError) + end + + it "gathers initial args as elements when each yields multiple" do + multi = EnumerableSpecs::YieldsMulti.new + yielded = [] + multi.none? { |e| yielded << e; false } + yielded.should == [1, 3, 6] + end + + it "yields multiple arguments when each yields multiple" do + multi = EnumerableSpecs::YieldsMulti.new + yielded = [] + multi.none? { |*args| yielded << args; false } + yielded.should == [[1, 2], [3, 4, 5], [6, 7, 8, 9]] + end end - it "yields multiple arguments when each yields multiple" do - multi = EnumerableSpecs::YieldsMulti.new - yielded = [] - multi.none? {|e, i| yielded << [e, i] } - yielded.should == [[1, 2]] + ruby_version_is "2.5" do + describe 'when given a pattern argument' do + it "calls `===` on the pattern the return value " do + pattern = EnumerableSpecs::Pattern.new { |x| x == 3 } + @enum1.none?(pattern).should == true + pattern.yielded.should == [[0], [1], [2], [-1]] + end + + it "ignores block" do + @enum2.none?(Integer) { raise }.should == true + [1, 2, nil].none?(TrueClass) { raise }.should == true + {a: 1}.none?(Hash) { raise }.should == true + end + + it "always returns true on empty enumeration" do + @empty.none?(Integer).should == true + [].none?(Integer).should == true + {}.none?(NilClass).should == true + end + + it "does not hide exceptions out of #each" do + lambda { + EnumerableSpecs::ThrowingEach.new.none?(Integer) + }.should raise_error(RuntimeError) + end + + it "returns true if the pattern never returns a truthy value" do + @enum2.none?(Integer).should == true + pattern = EnumerableSpecs::Pattern.new { |x| nil } + @enum.none?(pattern).should == true + + [1, 42, 3].none?(pattern).should == true + {a: 1, b: 2}.none?(pattern).should == true + end + + it "returns false if the pattern ever returns other than false or nil" do + pattern = EnumerableSpecs::Pattern.new { |x| x < 0 } + @enum1.none?(pattern).should == false + pattern.yielded.should == [[0], [1], [2], [-1]] + + [1, 2, 3, -1].none?(pattern).should == false + {a: 1}.none?(Array).should == false + end + + it "does not hide exceptions out of pattern#===" do + pattern = EnumerableSpecs::Pattern.new { raise "from pattern" } + lambda { + @enum.none?(pattern) + }.should raise_error(RuntimeError) + end + + it "calls the pattern with gathered array when yielded with multiple arguments" do + multi = EnumerableSpecs::YieldsMulti.new + pattern = EnumerableSpecs::Pattern.new { false } + multi.none?(pattern).should == true + pattern.yielded.should == [[[1, 2]], [[3, 4, 5]], [[6, 7, 8, 9]]] + end + end end end diff --git a/spec/ruby/core/enumerable/one_spec.rb b/spec/ruby/core/enumerable/one_spec.rb index facaad7670..67653749dd 100644 --- a/spec/ruby/core/enumerable/one_spec.rb +++ b/spec/ruby/core/enumerable/one_spec.rb @@ -2,7 +2,63 @@ require_relative '../../spec_helper' require_relative 'fixtures/classes' describe "Enumerable#one?" do - describe "when passed a block" do + before :each do + @empty = EnumerableSpecs::Empty.new + @enum = EnumerableSpecs::Numerous.new + @enum1 = EnumerableSpecs::Numerous.new(0, 1, 2, -1) + @enum2 = EnumerableSpecs::Numerous.new(nil, false, true) + end + + it "always returns false on empty enumeration" do + @empty.one?.should == false + @empty.one? { true }.should == false + end + + it "raises an ArgumentError when more than 1 argument is provided" do + lambda { @enum.one?(1, 2, 3) }.should raise_error(ArgumentError) + lambda { [].one?(1, 2, 3) }.should raise_error(ArgumentError) + lambda { {}.one?(1, 2, 3) }.should raise_error(ArgumentError) + end + + ruby_version_is ""..."2.5" do + it "raises an ArgumentError when any arguments provided" do + lambda { @enum.one?(Proc.new {}) }.should raise_error(ArgumentError) + lambda { @enum.one?(nil) }.should raise_error(ArgumentError) + lambda { @empty.one?(1) }.should raise_error(ArgumentError) + lambda { @enum.one?(1) {} }.should raise_error(ArgumentError) + end + end + + it "does not hide exceptions out of #each" do + lambda { + EnumerableSpecs::ThrowingEach.new.one? + }.should raise_error(RuntimeError) + + lambda { + EnumerableSpecs::ThrowingEach.new.one? { false } + }.should raise_error(RuntimeError) + end + + describe "with no block" do + it "returns true if only one element evaluates to true" do + [false, nil, true].one?.should be_true + end + + it "returns false if two elements evaluate to true" do + [false, :value, nil, true].one?.should be_false + end + + it "returns false if all elements evaluate to false" do + [false, nil, false].one?.should be_false + end + + it "gathers whole arrays as elements when each yields multiple" do + multi = EnumerableSpecs::YieldsMultiWithSingleTrue.new + multi.one?.should be_false + end + end + + describe "with a block" do it "returns true if block returns true once" do [:a, :b, :c].one? { |s| s == :a }.should be_true end @@ -15,46 +71,97 @@ describe "Enumerable#one?" do [:a, :b, :c].one? { |s| s == :d }.should be_false end + it "does not hide exceptions out of the block" do + lambda { + @enum.one? { raise "from block" } + }.should raise_error(RuntimeError) + end + it "gathers initial args as elements when each yields multiple" do # This spec doesn't spec what it says it does multi = EnumerableSpecs::YieldsMulti.new - multi.one? {|e| e == 1 }.should be_true + yielded = [] + multi.one? { |e| yielded << e; false }.should == false + yielded.should == [1, 3, 6] end it "yields multiple arguments when each yields multiple" do multi = EnumerableSpecs::YieldsMulti.new yielded = [] - multi.one? {|e, i| yielded << [e, i] } - yielded.should == [[1, 2], [3, 4]] + multi.one? { |*args| yielded << args; false }.should == false + yielded.should == [[1, 2], [3, 4, 5], [6, 7, 8, 9]] end + end + - ruby_version_is "2.5" do - describe "given a pattern argument" do - # This spec should be replaced by more extensive ones - it "returns true iff none match that pattern" do - EnumerableSpecs::Numerous.new.one?(Integer).should == false - [nil, false, true].one?(NilClass).should == true - end + ruby_version_is "2.5" do + describe 'when given a pattern argument' do + it "calls `===` on the pattern the return value " do + pattern = EnumerableSpecs::Pattern.new { |x| x == 1 } + @enum1.one?(pattern).should == true + pattern.yielded.should == [[0], [1], [2], [-1]] end - end - end - describe "when not passed a block" do - it "returns true if only one element evaluates to true" do - [false, nil, true].one?.should be_true - end + it "ignores block" do + @enum2.one?(NilClass) { raise }.should == true + [1, 2, nil].one?(NilClass) { raise }.should == true + {a: 1}.one?(Array) { raise }.should == true + end - it "returns false if two elements evaluate to true" do - [false, :value, nil, true].one?.should be_false - end + it "always returns false on empty enumeration" do + @empty.one?(Integer).should == false + [].one?(Integer).should == false + {}.one?(NilClass).should == false + end - it "returns false if all elements evaluate to false" do - [false, nil, false].one?.should be_false - end + it "does not hide exceptions out of #each" do + lambda { + EnumerableSpecs::ThrowingEach.new.one?(Integer) + }.should raise_error(RuntimeError) + end - it "gathers whole arrays as elements when each yields multiple" do - multi = EnumerableSpecs::YieldsMultiWithSingleTrue.new - multi.one?.should be_false + it "returns true if the pattern returns a truthy value only once" do + @enum2.one?(NilClass).should == true + pattern = EnumerableSpecs::Pattern.new { |x| x == 2 } + @enum1.one?(pattern).should == true + + [1, 2, 42, 3].one?(pattern).should == true + + pattern = EnumerableSpecs::Pattern.new { |x| x == [:b, 2] } + {a: 1, b: 2}.one?(pattern).should == true + end + + it "returns false if the pattern returns a truthy value more than once" do + pattern = EnumerableSpecs::Pattern.new { |x| !x } + @enum2.one?(pattern).should == false + pattern.yielded.should == [[nil], [false]] + + [1, 2, 3].one?(Integer).should == false + {a: 1, b: 2}.one?(Array).should == false + end + + it "returns false if the pattern never returns a truthy value" do + pattern = EnumerableSpecs::Pattern.new { |x| nil } + @enum1.one?(pattern).should == false + pattern.yielded.should == [[0], [1], [2], [-1]] + + [1, 2, 3].one?(pattern).should == false + {a: 1}.one?(pattern).should == false + end + + it "does not hide exceptions out of pattern#===" do + pattern = EnumerableSpecs::Pattern.new { raise "from pattern" } + lambda { + @enum.one?(pattern) + }.should raise_error(RuntimeError) + end + + it "calls the pattern with gathered array when yielded with multiple arguments" do + multi = EnumerableSpecs::YieldsMulti.new + pattern = EnumerableSpecs::Pattern.new { false } + multi.one?(pattern).should == false + pattern.yielded.should == [[[1, 2]], [[3, 4, 5]], [[6, 7, 8, 9]]] + end end end end |