1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
require_relative '../../spec_helper'
describe "Time#<=>" do
it "returns 1 if the first argument is a point in time after the second argument" do
(Time.now <=> Time.at(0)).should == 1
end
it "returns 1 if the first argument is a point in time after the second argument (down to a millisecond)" do
(Time.at(0, 1000) <=> Time.at(0, 0)).should == 1
(Time.at(1202778512, 1000) <=> Time.at(1202778512, 999)).should == 1
end
it "returns 1 if the first argument is a point in time after the second argument (down to a microsecond)" do
(Time.at(0, 100) <=> Time.at(0, 0)).should == 1
(Time.at(1202778512, 100) <=> Time.at(1202778512, 99)).should == 1
end
it "returns 0 if time is the same as other" do
(Time.at(1202778513) <=> Time.at(1202778513)).should == 0
(Time.at(100, 100) <=> Time.at(100, 100)).should == 0
end
it "returns -1 if the first argument is a point in time before the second argument" do
(Time.at(0) <=> Time.now).should == -1
(Time.at(100, 100) <=> Time.at(101, 100)).should == -1
end
it "returns -1 if the first argument is a point in time before the second argument (down to a millisecond)" do
(Time.at(0, 0) <=> Time.at(0, 1000)).should == -1
end
it "returns -1 if the first argument is a point in time before the second argument (down to a microsecond)" do
(Time.at(0, 0) <=> Time.at(0, 100)).should == -1
end
it "returns 1 if the first argument is a fraction of a microsecond after the second argument" do
(Time.at(100, Rational(1,1000)) <=> Time.at(100, 0)).should == 1
end
it "returns 0 if time is the same as other, including fractional microseconds" do
(Time.at(100, Rational(1,1000)) <=> Time.at(100, Rational(1,1000))).should == 0
end
it "returns -1 if the first argument is a fraction of a microsecond before the second argument" do
(Time.at(100, 0) <=> Time.at(100, Rational(1,1000))).should == -1
end
it "returns nil when compared to an Integer because Time does not respond to #coerce" do
time = Time.at(1)
time.respond_to?(:coerce).should == false
time.should_receive(:respond_to?).exactly(2).and_return(false)
-> {
(time <=> 2).should == nil
(2 <=> time).should == nil
}.should_not complain
end
context "given different timezones" do
it "returns 0 if time is the same as other" do
# three timezones, all at the same timestamp
time_utc = Time.new(2000, 1, 1, 0, 0, 0, 0)
time_cet = Time.new(2000, 1, 1, 1, 0, 0, '+01:00')
time_brt = Time.new(1999, 12, 31, 21, 0, 0, '-03:00')
(time_utc <=> time_cet).should == 0
(time_utc <=> time_brt).should == 0
(time_cet <=> time_brt).should == 0
end
it "returns -1 if the first argument is before the second argument" do
# time_brt is later, even though the date is earlier
time_utc = Time.new(2000, 1, 1, 0, 0, 0, 0)
time_brt = Time.new(1999, 12, 31, 23, 0, 0, '-03:00')
(time_utc <=> time_brt).should == -1
end
it "returns 1 if the first argument is before the second argument" do
# time_brt is later, even though the date is earlier
time_utc = Time.new(2000, 1, 1, 0, 0, 0, 0)
time_brt = Time.new(1999, 12, 31, 23, 0, 0, '-03:00')
(time_brt <=> time_utc).should == 1
end
end
describe "given a non-Time argument" do
it "returns nil if argument <=> self returns nil" do
t = Time.now
obj = mock('time')
obj.should_receive(:<=>).with(t).and_return(nil)
(t <=> obj).should == nil
end
it "returns -1 if argument <=> self is greater than 0" do
t = Time.now
r = mock('r')
r.should_receive(:>).with(0).and_return(true)
obj = mock('time')
obj.should_receive(:<=>).with(t).and_return(r)
(t <=> obj).should == -1
end
it "returns 1 if argument <=> self is not greater than 0 and is less than 0" do
t = Time.now
r = mock('r')
r.should_receive(:>).with(0).and_return(false)
r.should_receive(:<).with(0).and_return(true)
obj = mock('time')
obj.should_receive(:<=>).with(t).and_return(r)
(t <=> obj).should == 1
end
it "returns 0 if argument <=> self is neither greater than 0 nor less than 0" do
t = Time.now
r = mock('r')
r.should_receive(:>).with(0).and_return(false)
r.should_receive(:<).with(0).and_return(false)
obj = mock('time')
obj.should_receive(:<=>).with(t).and_return(r)
(t <=> obj).should == 0
end
it "returns nil if argument also uses an inverse comparison for <=>" do
t = Time.now
r = mock('r')
def r.<=>(other); other <=> self; end
r.should_receive(:<=>).once
(t <=> r).should be_nil
end
end
end
|