forked from rubinius/rubinius
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
77 additions
and
34 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,61 +1,96 @@ | ||
require File.expand_path('../../../spec_helper', __FILE__) | ||
require File.expand_path('../fixtures/classes', __FILE__) | ||
|
||
describe "Kernel#Array" do | ||
it "is a private method" do | ||
describe "Kernel" do | ||
it "has private instance method Array()" do | ||
Kernel.should have_private_instance_method(:Array) | ||
end | ||
|
||
it "does not call #to_ary on an Array" do | ||
obj = [1,2,3] | ||
obj.should_not_receive(:to_ary) | ||
end | ||
|
||
Array(obj).should == [1, 2, 3] | ||
describe :kernel_Array, :shared => true do | ||
before :each do | ||
@array = [1, 2, 3] | ||
end | ||
|
||
it "does not call #to_ary on an Array" do | ||
@array.should_not_receive(:to_ary) | ||
@object.send(@method, @array).should == @array | ||
end | ||
|
||
it "tries to call #to_ary on the given argument if it's not an Array" do | ||
(obj = mock('[1,2,3]')).should_receive(:to_ary).and_return([1, 2, 3]) | ||
it "calls #to_ary to convert the argument to an Array" do | ||
obj = mock("Array([1,2,3])") | ||
obj.should_receive(:to_ary).and_return(@array) | ||
obj.should_not_receive(:to_a) | ||
|
||
Array(obj).should == [1, 2, 3] | ||
@object.send(@method, obj).should == @array | ||
end | ||
|
||
it "does not call #to_a on an Array" do | ||
obj = [1,2,3] | ||
obj.should_not_receive(:to_a) | ||
@array.should_not_receive(:to_a) | ||
@object.send(@method, @array).should == @array | ||
end | ||
|
||
it "calls #to_a if the argument does not respond to #to_ary" do | ||
obj = mock("Array([1,2,3])") | ||
obj.should_receive(:to_a).and_return(@array) | ||
|
||
Array(obj).should == [1, 2, 3] | ||
@object.send(@method, obj).should == @array | ||
end | ||
|
||
it "tries to call #to_a on the given argument if #to_ary is provided and it returns nil" do | ||
(obj = mock('[4,5,6]')).should_receive(:to_ary).and_return(nil) | ||
obj.should_receive(:to_a).and_return([4, 5, 6]) | ||
Array(obj).should == [4, 5, 6] | ||
it "calls #to_a if #to_ary returns nil" do | ||
obj = mock("Array([1,2,3])") | ||
obj.should_receive(:to_ary).and_return(nil) | ||
obj.should_receive(:to_a).and_return(@array) | ||
|
||
@object.send(@method, obj).should == @array | ||
end | ||
|
||
it "tries to call #to_a on the given argument if #to_ary is not provided" do | ||
(obj = mock('[4,5,6]')).should_receive(:to_a).and_return([4, 5, 6]) | ||
Array(obj).should == [4, 5, 6] | ||
ruby_version_is ""..."1.9" do | ||
it "raises a TypeError if #to_a returns nil" do | ||
obj = mock("Array([1,2,3])") | ||
obj.should_receive(:to_a).and_return(nil) | ||
|
||
lambda { @object.send(@method, obj) }.should raise_error(TypeError) | ||
end | ||
end | ||
|
||
it "returns an array with the given argument if neither #to_ary nor #to_a are provided" do | ||
obj = mock('x') | ||
Array(obj).should == [obj] | ||
|
||
ruby_version_is "1.9" do | ||
it "returns an Array containing the argument if #to_a returns nil" do | ||
obj = mock("Array([1,2,3])") | ||
obj.should_receive(:to_a).and_return(nil) | ||
|
||
@object.send(@method, obj).should == [obj] | ||
end | ||
end | ||
|
||
it "returns an Array containing the argument if it responds to neither #to_ary nor #to_a" do | ||
obj = mock("Array(x)") | ||
@object.send(@method, obj).should == [obj] | ||
end | ||
it "returns an empty array if the given argument is nil" do | ||
Array(nil).should == [] | ||
|
||
it "returns an empty Array when passed nil" do | ||
@object.send(@method, nil).should == [] | ||
end | ||
|
||
it "raises a TypeError if #to_ary / #to_a do not return an array" do | ||
(obj = mock('ha!')).should_receive(:to_a).and_return("ha!") | ||
lambda { Array(obj) }.should raise_error(TypeError) | ||
|
||
obj.should_receive(:to_ary).and_return("ha!") | ||
lambda { Array(obj) }.should raise_error(TypeError) | ||
it "raises a TypeError if #to_ary does not return an Array" do | ||
obj = mock("Array() string") | ||
obj.should_receive(:to_ary).and_return("string") | ||
|
||
lambda { @object.send(@method, obj) }.should raise_error(TypeError) | ||
end | ||
|
||
it "raises a TypeError if #to_a does not return an Array" do | ||
obj = mock("Array() string") | ||
obj.should_receive(:to_a).and_return("string") | ||
|
||
lambda { @object.send(@method, obj) }.should raise_error(TypeError) | ||
end | ||
end | ||
|
||
describe "Kernel.Array" do | ||
it "needs to be reviewed for spec completeness" | ||
it_behaves_like :kernel_Array, :Array_method, KernelSpecs | ||
end | ||
|
||
describe "Kernel#Array" do | ||
it_behaves_like :kernel_Array, :Array_function, KernelSpecs | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters