<?php
Mock::Generate ('A_Datetime');
Mock::Generate ('A_Datetime_Duration');
class RangeTest extends UnitTestCase {
function setUp() {
$this->start = new MockA_Datetime();
$this->start->setReturnValue ('getTimestamp', strtotime ('1/1/07'));
$this->end = new MockA_Datetime();
$this->end->setReturnValue ('getTimestamp', strtotime ('1/1/09'));
$this->duration = new MockA_Datetime_Duration();
$this->duration->setReturnValue ('toString', '+1 year');
$this->range = new A_Datetime_Range ($this->start, $this->end);
}
function testConstructFromStartAndEnd() {
$range = new A_Datetime_Range ($this->start, $this->end);
$this->assertEqual ($range->getStart(), $this->start);
$this->assertEqual ($range->getEnd(), $this->end);
}
function testConstructFromStartAndDuration() {
$this->start->setReturnValue ('add', $this->end);
$this->start->expectOnce ('add', array ($this->duration));
$range = new A_Datetime_Range ($this->start, $this->duration);
$this->assertEqual ($range->getEnd(), $this->end);
}
function testConstructFromDurationAndEnd() {
$this->end->setReturnValue ('remove', $this->end);
$this->end->expectOnce ('remove', array ($this->duration));
$range = new A_Datetime_Range ($this->duration, $this->end);
}
function testGetStartWithFormatDelegatesToStart() {
$this->start->expectOnce ('format');
$this->range->getStart ('Y-m-d');
}
function testGetEndWithFormatDelegatesToEnd() {
$this->end->expectOnce ('format');
$this->range->getEnd ('Y-m-d');
}
function testContains() {
$datetime1 = new A_Datetime();
$datetime1->parseDate('2001/01/01');
$datetime2 = new A_Datetime();
$datetime2->parseDate('2001/02/01');
$datetime3 = new A_Datetime();
$datetime3->parseDate('2001/03/01');
$datetime4 = new A_Datetime();
$datetime4->parseDate('2001/04/01');
$range = new A_Datetime_Range($datetime1, $datetime3);
$this->assertTrue($range->contains($datetime2));
$this->assertFalse($range->contains($datetime4));
$this->assertFalse($range->contains($datetime1));
$this->assertTrue($range->contains($datetime1, true)); // inclusive check of end dates
$this->assertFalse($range->contains($datetime3));
$this->assertTrue($range->contains($datetime3, true)); // inclusive check of end dates
}
function testIntersects() {
$datetime1 = new A_Datetime();
$datetime1->parseDate('2001/01/01');
$datetime2 = new A_Datetime();
$datetime2->parseDate('2001/02/01');
$datetime3 = new A_Datetime();
$datetime3->parseDate('2001/03/01');
$datetime4 = new A_Datetime();
$datetime4->parseDate('2001/04/01');
$datetime5 = new A_Datetime();
$datetime5->parseDate('2001/05/01');
// not overlapping
$range1 = new A_Datetime_Range($datetime1, $datetime2);
$range2 = new A_Datetime_Range($datetime3, $datetime4);
$this->assertFalse($range1->intersects($range2));
// range1 end date in range2
$range1 = new A_Datetime_Range($datetime1, $datetime3);
$range2 = new A_Datetime_Range($datetime2, $datetime4);
$this->assertTrue($range1->intersects($range2));
// range1 start date in range2
$range1 = new A_Datetime_Range($datetime3, $datetime5);
$range2 = new A_Datetime_Range($datetime1, $datetime4);
$this->assertTrue($range1->intersects($range2));
// range1 the same as range2
$range1 = new A_Datetime_Range($datetime2, $datetime4);
$range2 = new A_Datetime_Range($datetime2, $datetime4);
$this->assertTrue($range1->intersects($range2));
// range1 end date the same as range2 start date
$range1 = new A_Datetime_Range($datetime1, $datetime3);
$range2 = new A_Datetime_Range($datetime3, $datetime5);
$this->assertTrue($range1->intersects($range2));
// range1 start date the same as range2 end date
$range1 = new A_Datetime_Range($datetime3, $datetime5);
$range2 = new A_Datetime_Range($datetime1, $datetime3);
$this->assertTrue($range1->intersects($range2));
// range1 inside range2
$range1 = new A_Datetime_Range($datetime2, $datetime4);
$range2 = new A_Datetime_Range($datetime1, $datetime5);
$this->assertTrue($range1->intersects($range2));
// range2 inside range1
$range1 = new A_Datetime_Range($datetime1, $datetime5);
$range2 = new A_Datetime_Range($datetime2, $datetime4);
$this->assertTrue($range1->intersects($range2));
}
function testToArray() {
$date4 = new MockA_Datetime();
$date4->setReturnValue ('getTimestamp', strtotime ('1/1/10'));
$date3 = new MockA_Datetime();
$date3->setReturnValue ('getTimestamp', strtotime ('1/1/09'));
$date3->setReturnValue ('newModify', $date4);
$date2 = new MockA_Datetime();
$date2->setReturnValue ('getTimestamp', strtotime ('1/1/08'));
$date2->setReturnValue ('newModify', $date3);
$date1 = new MockA_Datetime();
$date1->setReturnValue ('getTimestamp', strtotime ('1/1/07'));
$date1->setReturnValue ('newModify', $date2);
$this->start->setReturnValue ('newModify', $date1);
$this->assertEqual ($this->range->toArray ($this->duration), array ($date1, $date2, $date3));
}
}
|