| 
<?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));
 }
 
 }
 |