Skip to content

Commit

Permalink
move minmax to shared, use it_behaves_like in Enumerable and Array
Browse files Browse the repository at this point in the history
  • Loading branch information
lxxxvi authored and eregon committed Oct 10, 2020
1 parent af24519 commit 6ce0727
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 29 deletions.
14 changes: 14 additions & 0 deletions core/array/minmax_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
require_relative '../../spec_helper'
require_relative '../../shared/enumerable/minmax'

describe "Array#minmax" do
before :each do
@enum = [6, 4, 5, 10, 8]
@empty_enum = []
@incomparable_enum = [BasicObject.new, BasicObject.new]
@incompatible_enum = [11, "22"]
@strs = ["333", "2", "60", "55555", "1010", "111"]
end

it_behaves_like :enumerable_minmax, :minmax
end
34 changes: 5 additions & 29 deletions core/enumerable/minmax_spec.rb
Original file line number Diff line number Diff line change
@@ -1,41 +1,17 @@
require_relative '../../spec_helper'
require_relative 'fixtures/classes'
require_relative '../../shared/enumerable/minmax'

describe "Enumerable#minmax" do
before :each do
@enum = EnumerableSpecs::Numerous.new(6, 4, 5, 10, 8)

@empty_enum = EnumerableSpecs::Empty.new
@incomparable_enum = EnumerableSpecs::Numerous.new(BasicObject.new, BasicObject.new)
@incompatible_enum = EnumerableSpecs::Numerous.new(11,"22")
@strs = EnumerableSpecs::Numerous.new("333", "2", "60", "55555", "1010", "111")
end

it "min should return the minimum element" do
@enum.minmax.should == [4, 10]
@strs.minmax.should == ["1010", "60" ]
end

it "returns [nil, nil] for an empty Enumerable" do
EnumerableSpecs::Empty.new.minmax.should == [nil, nil]
end

it "raises an ArgumentError when elements are incomparable" do
-> do
EnumerableSpecs::Numerous.new(11,"22").minmax
end.should raise_error(ArgumentError)
-> do
EnumerableSpecs::Numerous.new(11,12,22,33).minmax{|a, b| nil}
end.should raise_error(ArgumentError)
end

it "raises a NoMethodError for elements without #<=>" do
-> do
EnumerableSpecs::Numerous.new(BasicObject.new, BasicObject.new).minmax
end.should raise_error(NoMethodError)
end

it "returns the minimum when using a block rule" do
@enum.minmax {|a,b| b <=> a }.should == [10, 4]
@strs.minmax {|a,b| a.length <=> b.length }.should == ["2", "55555"]
end
it_behaves_like :enumerable_minmax, :minmax

it "gathers whole arrays as elements when each yields multiple" do
multi = EnumerableSpecs::YieldsMulti.new
Expand Down
24 changes: 24 additions & 0 deletions shared/enumerable/minmax.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
describe :enumerable_minmax, shared: true do
it "min should return the minimum element" do
@enum.minmax.should == [4, 10]
@strs.minmax.should == ["1010", "60"]
end

it "returns the minimum when using a block rule" do
@enum.minmax {|a,b| b <=> a }.should == [10, 4]
@strs.minmax {|a,b| a.length <=> b.length }.should == ["2", "55555"]
end

it "returns [nil, nil] for an empty Enumerable" do
@empty_enum.minmax.should == [nil, nil]
end

it "raises a NoMethodError for elements without #<=>" do
-> { @incomparable_enum.minmax }.should raise_error(NoMethodError)
end

it "raises an ArgumentError when elements are incompatible" do
-> { @incompatible_enum.minmax }.should raise_error(ArgumentError)
-> { @enum.minmax{ |a, b| nil } }.should raise_error(ArgumentError)
end
end

0 comments on commit 6ce0727

Please sign in to comment.