summaryrefslogtreecommitdiff
path: root/spec/ruby/core/enumerable
diff options
context:
space:
mode:
authoreregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-06-13 21:41:45 +0000
committereregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-06-13 21:41:45 +0000
commit67078e81f57523fdf65ba7a9d919a146763363a5 (patch)
tree795ec86c6a90842d9168b0900d058c46244249f3 /spec/ruby/core/enumerable
parent78890babe74e87aea79d1022ab455aeddf8a3310 (diff)
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.rb101
-rw-r--r--spec/ruby/core/enumerable/any_spec.rb42
-rw-r--r--spec/ruby/core/enumerable/fixtures/classes.rb14
-rw-r--r--spec/ruby/core/enumerable/none_spec.rb185
-rw-r--r--spec/ruby/core/enumerable/one_spec.rb159
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