mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
1d15d5f080
* Other ruby implementations use the spec/ruby directory. [Misc #13792] [ruby-core:82287] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59979 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
89 lines
2.8 KiB
Ruby
89 lines
2.8 KiB
Ruby
# -*- encoding: us-ascii -*-
|
|
|
|
describe :enum_each, shared: true do
|
|
before :each do
|
|
object_each_with_arguments = Object.new
|
|
def object_each_with_arguments.each_with_arguments(arg, *args)
|
|
yield arg, *args
|
|
:method_returned
|
|
end
|
|
|
|
@enum_with_arguments = object_each_with_arguments.to_enum(:each_with_arguments, :arg0, :arg1, :arg2)
|
|
|
|
@enum_with_yielder = Enumerator.new {|y| y.yield :ok}
|
|
end
|
|
|
|
it "yields each element of self to the given block" do
|
|
acc = []
|
|
[1,2,3].to_enum.each {|e| acc << e }
|
|
acc.should == [1,2,3]
|
|
end
|
|
|
|
it "calls #each on the object given in the constructor by default" do
|
|
each = mock('each')
|
|
each.should_receive(:each)
|
|
each.to_enum.each {|e| e }
|
|
end
|
|
|
|
it "calls #each on the underlying object until it's exhausted" do
|
|
each = mock('each')
|
|
each.should_receive(:each).and_yield(1).and_yield(2).and_yield(3)
|
|
acc = []
|
|
each.to_enum.each {|e| acc << e }
|
|
acc.should == [1,2,3]
|
|
end
|
|
|
|
it "calls the method given in the constructor instead of #each" do
|
|
each = mock('peach')
|
|
each.should_receive(:peach)
|
|
each.to_enum(:peach).each {|e| e }
|
|
end
|
|
|
|
it "calls the method given in the constructor until it's exhausted" do
|
|
each = mock('each')
|
|
each.should_receive(:each).and_yield(1).and_yield(2).and_yield(3)
|
|
acc = []
|
|
each.to_enum.each {|e| acc << e }
|
|
acc.should == [1,2,3]
|
|
end
|
|
|
|
it "raises a NoMethodError if the object doesn't respond to #each" do
|
|
enum = Object.new.to_enum
|
|
lambda do
|
|
enum.each { |e| e }
|
|
end.should raise_error(NoMethodError)
|
|
end
|
|
|
|
it "returns self if not given arguments and not given a block" do
|
|
@enum_with_arguments.each.should equal(@enum_with_arguments)
|
|
|
|
@enum_with_yielder.each.should equal(@enum_with_yielder)
|
|
end
|
|
|
|
it "returns the same value from receiver.each if block is given" do
|
|
@enum_with_arguments.each {}.should equal(:method_returned)
|
|
end
|
|
|
|
it "passes given arguments at initialized to receiver.each" do
|
|
@enum_with_arguments.each.to_a.should == [[:arg0, :arg1, :arg2]]
|
|
end
|
|
|
|
it "requires multiple arguments" do
|
|
Enumerator.instance_method(:each).arity.should < 0
|
|
end
|
|
|
|
it "appends given arguments to receiver.each" do
|
|
@enum_with_arguments.each(:each0, :each1).to_a.should == [[:arg0, :arg1, :arg2, :each0, :each1]]
|
|
@enum_with_arguments.each(:each2, :each3).to_a.should == [[:arg0, :arg1, :arg2, :each2, :each3]]
|
|
end
|
|
|
|
it "returns the same value from receiver.each if block and arguments are given" do
|
|
@enum_with_arguments.each(:each1, :each2) {}.should equal(:method_returned)
|
|
end
|
|
|
|
it "returns new Enumerator if given arguments but not given a block" do
|
|
ret = @enum_with_arguments.each 1
|
|
ret.should be_an_instance_of(Enumerator)
|
|
ret.should_not equal(@enum_with_arguments)
|
|
end
|
|
end
|