summaryrefslogtreecommitdiff
path: root/spec/ruby/core/array/shared/keep_if.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/ruby/core/array/shared/keep_if.rb')
-rw-r--r--spec/ruby/core/array/shared/keep_if.rb60
1 files changed, 60 insertions, 0 deletions
diff --git a/spec/ruby/core/array/shared/keep_if.rb b/spec/ruby/core/array/shared/keep_if.rb
new file mode 100644
index 0000000000..581ba31d1b
--- /dev/null
+++ b/spec/ruby/core/array/shared/keep_if.rb
@@ -0,0 +1,60 @@
+require File.expand_path('../../../enumerable/shared/enumeratorized', __FILE__)
+
+describe :keep_if, shared: true do
+ it "deletes elements for which the block returns a false value" do
+ array = [1, 2, 3, 4, 5]
+ array.send(@method) {|item| item > 3 }.should equal(array)
+ array.should == [4, 5]
+ end
+
+ it "returns an enumerator if no block is given" do
+ [1, 2, 3].send(@method).should be_an_instance_of(Enumerator)
+ end
+
+ it "updates the receiver after all blocks" do
+ a = [1, 2, 3]
+ a.send(@method) do |e|
+ a.length.should == 3
+ false
+ end
+ a.length.should == 0
+ end
+
+ before :all do
+ @object = [1,2,3]
+ end
+ it_should_behave_like :enumeratorized_with_origin_size
+
+ describe "on frozen objects" do
+ before :each do
+ @origin = [true, false]
+ @frozen = @origin.dup.freeze
+ end
+
+ it "returns an Enumerator if no block is given" do
+ @frozen.send(@method).should be_an_instance_of(Enumerator)
+ end
+
+ describe "with truthy block" do
+ it "keeps elements after any exception" do
+ lambda { @frozen.send(@method) { true } }.should raise_error(Exception)
+ @frozen.should == @origin
+ end
+
+ it "raises a RuntimeError" do
+ lambda { @frozen.send(@method) { true } }.should raise_error(RuntimeError)
+ end
+ end
+
+ describe "with falsy block" do
+ it "keeps elements after any exception" do
+ lambda { @frozen.send(@method) { false } }.should raise_error(Exception)
+ @frozen.should == @origin
+ end
+
+ it "raises a RuntimeError" do
+ lambda { @frozen.send(@method) { false } }.should raise_error(RuntimeError)
+ end
+ end
+ end
+end