1require_relative '../../spec_helper' 2require_relative 'fixtures/classes' 3 4describe "Array#last" do 5 it "returns the last element" do 6 [1, 1, 1, 1, 2].last.should == 2 7 end 8 9 it "returns nil if self is empty" do 10 [].last.should == nil 11 end 12 13 it "returns the last count elements if given a count" do 14 [1, 2, 3, 4, 5, 9].last(3).should == [4, 5, 9] 15 end 16 17 it "returns an empty array when passed a count on an empty array" do 18 [].last(0).should == [] 19 [].last(1).should == [] 20 end 21 22 it "returns an empty array when count == 0" do 23 [1, 2, 3, 4, 5].last(0).should == [] 24 end 25 26 it "returns an array containing the last element when passed count == 1" do 27 [1, 2, 3, 4, 5].last(1).should == [5] 28 end 29 30 it "raises an ArgumentError when count is negative" do 31 lambda { [1, 2].last(-1) }.should raise_error(ArgumentError) 32 end 33 34 it "returns the entire array when count > length" do 35 [1, 2, 3, 4, 5, 9].last(10).should == [1, 2, 3, 4, 5, 9] 36 end 37 38 it "returns an array which is independent to the original when passed count" do 39 ary = [1, 2, 3, 4, 5] 40 ary.last(0).replace([1,2]) 41 ary.should == [1, 2, 3, 4, 5] 42 ary.last(1).replace([1,2]) 43 ary.should == [1, 2, 3, 4, 5] 44 ary.last(6).replace([1,2]) 45 ary.should == [1, 2, 3, 4, 5] 46 end 47 48 it "properly handles recursive arrays" do 49 empty = ArraySpecs.empty_recursive_array 50 empty.last.should equal(empty) 51 52 array = ArraySpecs.recursive_array 53 array.last.should equal(array) 54 end 55 56 it "tries to convert the passed argument to an Integer usinig #to_int" do 57 obj = mock('to_int') 58 obj.should_receive(:to_int).and_return(2) 59 [1, 2, 3, 4, 5].last(obj).should == [4, 5] 60 end 61 62 it "raises a TypeError if the passed argument is not numeric" do 63 lambda { [1,2].last(nil) }.should raise_error(TypeError) 64 lambda { [1,2].last("a") }.should raise_error(TypeError) 65 66 obj = mock("nonnumeric") 67 lambda { [1,2].last(obj) }.should raise_error(TypeError) 68 end 69 70 it "does not return subclass instance on Array subclasses" do 71 ArraySpecs::MyArray[].last(0).should be_an_instance_of(Array) 72 ArraySpecs::MyArray[].last(2).should be_an_instance_of(Array) 73 ArraySpecs::MyArray[1, 2, 3].last(0).should be_an_instance_of(Array) 74 ArraySpecs::MyArray[1, 2, 3].last(1).should be_an_instance_of(Array) 75 ArraySpecs::MyArray[1, 2, 3].last(2).should be_an_instance_of(Array) 76 end 77 78 it "is not destructive" do 79 a = [1, 2, 3] 80 a.last 81 a.should == [1, 2, 3] 82 a.last(2) 83 a.should == [1, 2, 3] 84 a.last(3) 85 a.should == [1, 2, 3] 86 end 87end 88