/**
  * Test aritmatic operations
  * 
  */
 function test_intersect_union()
 {
     // intersection()
     // union()
     // 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 0 0 0
     // 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4
     //
     // A  |- - - - - - - - - -|
     // B              |-|
     // C                                  |- - - - - - - - -|
     // D                                                          |- - - -|
     $timespanA = Month::startingDuration(DateAndTime::withYearMonthDayHourMinuteSecondOffset(2005, 5, 4, 15, 25, 10, Duration::withHours(-4)), Duration::withDays(10));
     $timespanB = Month::startingDuration(DateAndTime::withYearMonthDayHourMinuteSecondOffset(2005, 5, 10, 12, 0, 0, Duration::withHours(-4)), Duration::withDays(1));
     $timespanC = Month::startingEnding(DateAndTime::withYearMonthDay(2005, 5, 20), DateAndTime::withYearMonthDay(2005, 5, 29));
     $timespanD = Month::startingEnding(DateAndTime::withYearMonthDay(2005, 6, 1), DateAndTime::withYearMonthDay(2005, 6, 6));
     // intersection()
     $this->assertTrue($timespanA->isEqualTo($timespanA->intersection($timespanB)));
     $this->assertTrue($timespanA->isEqualTo($timespanA->intersection($timespanC)));
     $this->assertEqual($timespanA->intersection($timespanD), NULL);
     // union()
     $temp = Timespan::startingEnding(DateAndTime::withYearMonthDay(2005, 5, 1), DateAndTime::withYearMonthDay(2005, 6, 1));
     $this->assertTrue($temp->isEqualTo($timespanA->union($timespanB)));
     $temp = Timespan::startingEnding(DateAndTime::withYearMonthDay(2005, 5, 1), DateAndTime::withYearMonthDay(2005, 6, 1));
     $this->assertTrue($temp->isEqualTo($timespanA->union($timespanC)));
     $temp = Timespan::startingEnding(DateAndTime::withYearMonthDay(2005, 5, 1), DateAndTime::withYearMonthDay(2005, 7, 1));
     $this->assertTrue($temp->isEqualTo($timespanA->union($timespanD)));
 }