diff --git a/src/Core/Base/Date.php b/src/Core/Base/Date.php index 43b9bf7489..79a428b205 100644 --- a/src/Core/Base/Date.php +++ b/src/Core/Base/Date.php @@ -12,18 +12,15 @@ namespace OnPHP\Core\Base; +use DateTime; use OnPHP\Core\OSQL\DialectString; use OnPHP\Core\Exception\WrongArgumentException; use OnPHP\Core\DB\Dialect; -use DateTime; - -/* $Id$ */ /** * Date's container and utilities. * * @see DateRange - * * @ingroup Base **/ class Date implements Stringable, DialectString @@ -37,40 +34,50 @@ class Date implements Stringable, DialectString const WEEKDAY_SUNDAY = 0; // because strftime('%w') is 0 on Sunday /** - * @var \DateTime + * @var DateTime|null */ - protected $dateTime = null; + protected ?DateTime $dateTime = null; /** - * @return Date - **/ - public static function create($date) + * @return static + * @throws WrongArgumentException + */ + public static function create($date): Date { return new static($date); } - public static function today($delimiter = '-') + /** + * @param string $delimiter + * @return string + */ + public static function today($delimiter = '-'): string { return date("Y{$delimiter}m{$delimiter}d"); } /** - * @return Date - **/ - public static function makeToday() + * @return static + * @throws WrongArgumentException + */ + public static function makeToday(): Date { return new static(static::today()); } /** - * @return Date * @see http://www.faqs.org/rfcs/rfc3339.html * @see http://www.cl.cam.ac.uk/~mgk25/iso-time.html - **/ - public static function makeFromWeek($weekNumber, $year = null) + * @param $weekNumber + * @param int|null $year + * @return Date + * @throws WrongArgumentException + */ + public static function makeFromWeek($weekNumber, int $year = null): Date { - if (!$year) + if (null === $year) { $year = date('Y'); + } Assert::isTrue( ($weekNumber > 0) @@ -99,7 +106,12 @@ public static function makeFromWeek($weekNumber, $year = null) return $date->modify("+{$days} day"); } - public static function dayDifference(Date $left, Date $right) + /** + * @param Date $left + * @param Date $right + * @return int + */ + public static function dayDifference(Date $left, Date $right): int { return gregoriantojd( @@ -114,15 +126,25 @@ public static function dayDifference(Date $left, Date $right) ); } - public static function compare(Date $left, Date $right) + /** + * @param Date $left + * @param Date $right + * @return int + */ + public static function compare(Date $left, Date $right): int { - if ($left->toStamp() == $right->toStamp()) + if ($left->toStamp() == $right->toStamp()) { return 0; - else + } else { return ($left->toStamp() > $right->toStamp() ? 1 : -1); + } } - public static function getWeekCountInYear($year) + /** + * @param $year + * @return int + */ + public static function getWeekCountInYear($year): int { $weekCount = date('W', mktime(0, 0, 0, 12, 31, $year)); @@ -133,6 +155,10 @@ public static function getWeekCountInYear($year) } } + /** + * @param $date + * @throws WrongArgumentException + */ public function __construct($date) { $this->import($date); @@ -148,12 +174,19 @@ public function __sleep() return array('dateTime'); } - public function toStamp() + /** + * @return int + */ + public function toStamp(): int { return $this->getDateTime()->getTimestamp(); } - public function toDate($delimiter = '-') + /** + * @param string $delimiter + * @return string + */ + public function toDate($delimiter = '-'): string { return $this->getYear() @@ -163,62 +196,81 @@ public function toDate($delimiter = '-') .$this->getDay(); } - public function getYear() + /** + * @return string + */ + public function getYear(): string { return $this->dateTime->format('Y'); } - public function getMonth() + /** + * @return string + */ + public function getMonth(): string { return $this->dateTime->format('m'); } - public function getDay() + /** + * @return string + */ + public function getDay(): string { return $this->dateTime->format('d'); } - public function getWeek() + /** + * @return string + */ + public function getWeek(): string { return date('W', $this->dateTime->getTimestamp()); } - public function getWeekDay() + /** + * @return string + */ + public function getWeekDay(): string { return strftime('%w', $this->dateTime->getTimestamp()); } /** - * @return Date - **/ - public function spawn($modification = null) + * @param string|null $modification + * @return static + * @throws WrongArgumentException + */ + public function spawn(string $modification = null): Date { - $child = new static($this->toString()); - if ($modification) + if (null !== $modification) { return $child->modify($modification); + } return $child; } /** + * @param string $string + * @return static * @throws WrongArgumentException - * @return Date - **/ - public function modify($string) + */ + public function modify(string $string): Date { try { $this->dateTime->modify($string); - } catch (\Exception $e) { - throw new WrongArgumentException( - "wrong time string '{$string}'" - ); + } catch (\Throwable $e) { + throw new WrongArgumentException("wrong time string '{$string}'"); } return $this; } + /** + * @return false|int + */ public function getDayStartStamp() { return @@ -230,6 +282,9 @@ public function getDayStartStamp() ); } + /** + * @return false|int + */ public function getDayEndStamp() { return @@ -242,9 +297,11 @@ public function getDayEndStamp() } /** + * @param int $weekStart * @return Date - **/ - public function getFirstDayOfWeek($weekStart = Date::WEEKDAY_MONDAY) + * @throws WrongArgumentException + */ + public function getFirstDayOfWeek(int $weekStart = Date::WEEKDAY_MONDAY): Date { return $this->spawn( '-'.((7 + $this->getWeekDay() - $weekStart) % 7).' days' @@ -252,43 +309,57 @@ public function getFirstDayOfWeek($weekStart = Date::WEEKDAY_MONDAY) } /** + * @param int $weekStart * @return Date - **/ - public function getLastDayOfWeek($weekStart = Date::WEEKDAY_MONDAY) + * @throws WrongArgumentException + */ + public function getLastDayOfWeek(int $weekStart = Date::WEEKDAY_MONDAY): Date { return $this->spawn( '+'.((13 - $this->getWeekDay() + $weekStart) % 7).' days' ); } - public function toString() + /** + * @return string + */ + public function toString(): string { return $this->dateTime->format(static::getFormat()); } - public function toFormatString($format) + /** + * @param string $format + * @return string + */ + public function toFormatString(string $format): string { return $this->dateTime->format($format); } - public function toDialectString(Dialect $dialect) + /** + * @param Dialect $dialect + * @return string + */ + public function toDialectString(Dialect $dialect): string { - // there are no known differences yet return $dialect->quoteValue($this->toString()); } /** * ISO 8601 date string - **/ - public function toIsoString() + * @return string + */ + public function toIsoString(): string { return $this->toString(); } /** * @return Timestamp - **/ - public function toTimestamp() + * @throws WrongArgumentException + */ + public function toTimestamp(): Timestamp { return Timestamp::create($this->toStamp()); } @@ -296,25 +367,29 @@ public function toTimestamp() /** * @return DateTime|null */ - public function getDateTime() + public function getDateTime(): ?DateTime { return $this->dateTime; } - protected static function getFormat() + /** + * @return string + */ + protected static function getFormat(): string { return 'Y-m-d'; } - + /** + * @param $date + * @throws WrongArgumentException + */ protected function import($date) { - try{ + try { if (is_int($date) || is_numeric($date)) { // unix timestamp - $this->dateTime = new \DateTime(date(static::getFormat(), $date)); - + $this->dateTime = new DateTime(date(static::getFormat(), $date)); } elseif ($date && is_string($date)) { - if ( preg_match('/^(\d{1,4})[-\.](\d{1,2})[-\.](\d{1,2})/', $date, $matches) ) { @@ -325,18 +400,14 @@ protected function import($date) preg_match('/^(\d{1,2})[-\.](\d{1,2})[-\.](\d{1,4})/', $date, $matches) ) { Assert::isTrue( - checkdate($matches[2], $matches[2], $matches[3]) + checkdate($matches[2], $matches[1], $matches[3]) ); } - $this->dateTime = new \DateTime($date); + $this->dateTime = new DateTime($date); } - - } catch(\Exception $e) { - throw new WrongArgumentException( - "strange input given - '{$date}'" - ); + } catch(\Throwable $e) { + throw new WrongArgumentException("strange input given - '{$date}'"); } } } -?> diff --git a/src/Core/Base/Timestamp.php b/src/Core/Base/Timestamp.php index 96cd7685ad..ff7d9d0f4c 100644 --- a/src/Core/Base/Timestamp.php +++ b/src/Core/Base/Timestamp.php @@ -12,72 +12,86 @@ namespace OnPHP\Core\Base; +use DateTimeZone; +use OnPHP\Core\Exception\WrongArgumentException; use OnPHP\Core\Exception\WrongStateException; -/* $Id$ */ - /** * Date and time container and utilities. * * @see Date - * * @ingroup Base -**/ + */ class Timestamp extends Date { /** + * @param $timestamp + * @param DateTimeZone|null $zone * @return Timestamp - **/ - public static function create($timestamp, \DateTimeZone $zone=null) + * @throws WrongArgumentException + */ + public static function create($timestamp, DateTimeZone $zone = null): Timestamp { return new static($timestamp, $zone); } - public static function now() + /** + * @return string + */ + public static function now(): string { return date(static::getFormat()); } /** * @return Timestamp - **/ - public static function makeNow() + * @throws WrongArgumentException + */ + public static function makeNow(): Timestamp { return new static(time()); } /** - * @return Timestamp - **/ - public static function makeToday() - { - return new static(static::today()); - } - - public function __construct($dateTime, \DateTimeZone $zone=null) + * @param $dateTime + * @param DateTimeZone|null $zone + * @throws WrongArgumentException + */ + public function __construct($dateTime, DateTimeZone $zone = null) { parent::__construct($dateTime); - if($zone) { + if (null !== $zone) { $this->dateTime->setTimezone($zone); } - } - private function getDefaultTimeZone() + /** + * @return DateTimeZone + * @throws WrongStateException + */ + private function getDefaultTimeZone(): DateTimeZone { try { $defaultTimeZoneName = date_default_timezone_get(); - return new \DateTimeZone($defaultTimeZoneName); - } catch(\Exception $e) { + return new DateTimeZone($defaultTimeZoneName); + } catch(\Throwable $e) { throw new WrongStateException( - "strange default time zone given - '{$defaultTimeZoneName}'!". - 'Use date_default_timezone_set() for set valid default time zone.' + ( + ($defaultTimeZoneName ?? false) + ? "strange default time zone given - '{$defaultTimeZoneName}'!" + : "default time zone not fetched!" + ) . ' Use date_default_timezone_set() for set valid default time zone.' ); } } - public function toTime($timeDelimiter = ':', $secondDelimiter = '.') + /** + * @param string $timeDelimiter + * @param string $secondDelimiter + * @return string + */ + public function toTime(string $timeDelimiter = ':', string $secondDelimiter = '.'): string { return $this->getHour() @@ -87,33 +101,52 @@ public function toTime($timeDelimiter = ':', $secondDelimiter = '.') .$this->getSecond(); } + /** + * @param string $dateDelimiter + * @param string $timeDelimiter + * @param string $secondDelimiter + * @return string + */ public function toDateTime( - $dateDelimiter = '-', - $timeDelimiter = ':', - $secondDelimiter = '.' - ) + string $dateDelimiter = '-', + string $timeDelimiter = ':', + string $secondDelimiter = '.' + ): string { return $this->toDate($dateDelimiter).' ' .$this->toTime($timeDelimiter, $secondDelimiter); } - public function getHour() + /** + * @return string + */ + public function getHour(): string { return $this->dateTime->format('H'); } - public function getMinute() + /** + * @return string + */ + public function getMinute(): string { return $this->dateTime->format('i'); } - public function getSecond() + /** + * @return string + */ + public function getSecond(): string { return $this->dateTime->format('s'); } - public function equals(Timestamp $timestamp) + /** + * @param Timestamp $timestamp + * @return bool + */ + public function equals(Timestamp $timestamp): bool { return ($this->toDateTime() === $timestamp->toDateTime()); } @@ -126,10 +159,14 @@ public function getDayStartStamp() return parent::getDayStartStamp(); } + /** + * @return false|int + */ public function getHourStartStamp() { - if (!$this->getMinute() && !$this->getSecond()) + if (!$this->getMinute() && !$this->getSecond()) { return $this->dateTime->getTimestamp(); + } return mktime( @@ -144,8 +181,10 @@ public function getHourStartStamp() /** * ISO 8601 time string - **/ - public function toIsoString($convertToUtc = true) + * @param bool $convertToUtc + * @return string + */ + public function toIsoString(bool $convertToUtc = true): string { if ($convertToUtc) return date('Y-m-d\TH:i:s\Z', $this->dateTime->getTimestamp() - date('Z', $this->dateTime->getTimestamp())); @@ -155,15 +194,18 @@ public function toIsoString($convertToUtc = true) /** * @return Timestamp - **/ - public function toTimestamp() + * @throws WrongArgumentException + */ + public function toTimestamp(): Timestamp { return $this->spawn(); } - protected static function getFormat() + /** + * @return string + */ + protected static function getFormat(): string { return 'Y-m-d H:i:s'; } -} -?> +} \ No newline at end of file diff --git a/src/Core/Base/TimestampTZ.php b/src/Core/Base/TimestampTZ.php index 9f1593ea44..6b4965c7a7 100644 --- a/src/Core/Base/TimestampTZ.php +++ b/src/Core/Base/TimestampTZ.php @@ -10,8 +10,14 @@ namespace OnPHP\Core\Base; +use DateTimeZone; +use OnPHP\Core\Exception\WrongArgumentException; + /** * Timestamp with time zone + * + * @see Timestamp, Date + * @ingroup Base */ class TimestampTZ extends Timestamp { @@ -19,23 +25,24 @@ class TimestampTZ extends Timestamp * @static * @return string */ - protected static function getFormat() + protected static function getFormat(): string { return 'Y-m-d H:i:sO'; } /** - * @return Timestamp - **/ - public function toTimestamp($zone=null) + * @param null $zone + * @return Timestamp|TimestampTZ + * @throws WrongArgumentException + */ + public function toTimestamp($zone = null): Timestamp { - if($zone) { - + if (null === $zone) { if( - !($zone instanceof \DateTimeZone) + !($zone instanceof DateTimeZone) && is_scalar($zone) ) { - $zone = new \DateTimeZone($zone); + $zone = new DateTimeZone($zone); } return new static($this->toStamp(), $zone); @@ -44,7 +51,13 @@ public function toTimestamp($zone=null) return parent::toTimestamp(); } - public static function compare(Date $left, Date $right) + /** + * @param Date $left + * @param Date $right + * @return int + * @throws WrongArgumentException + */ + public static function compare(Date $left, Date $right): int { Assert::isTrue( ( @@ -55,5 +68,4 @@ public static function compare(Date $left, Date $right) return parent::compare($left, $right); } -} -?> \ No newline at end of file +} \ No newline at end of file diff --git a/src/Main/Base/CalendarDay.php b/src/Main/Base/CalendarDay.php index 094d90c39a..60e0f3804a 100644 --- a/src/Main/Base/CalendarDay.php +++ b/src/Main/Base/CalendarDay.php @@ -26,7 +26,7 @@ final class CalendarDay extends Date /** * @return CalendarDay **/ - public static function create($timestamp) + public static function create($timestamp): CalendarDay { return new self($timestamp); } diff --git a/src/Main/Base/DateRange.php b/src/Main/Base/DateRange.php index f441677770..d17a5156d0 100644 --- a/src/Main/Base/DateRange.php +++ b/src/Main/Base/DateRange.php @@ -23,55 +23,158 @@ * * @see Date * @see TimestampRange - * * @ingroup Helpers **/ class DateRange implements Stringable, SingleRange { - private $start = null; - private $end = null; + /** + * @var Date|null + */ + private ?Date $start = null; + /** + * @var Date|null + */ + private ?Date $end = null; + /** + * @var int|null + */ + private ?int $dayStartStamp = null; + /** + * @var int|null + */ + private ?int $dayEndStamp = null; - private $dayStartStamp = null; - private $dayEndStamp = null; + /** + * @param Date|null $start + * @param Date|null $end + * @return static + * @throws WrongArgumentException + */ + public static function create(Date $start = null, Date $end = null): DateRange + { + return new static($start, $end); + } /** - * @return DateRange - **/ - public static function create($start = null, $end = null) + * @param DateRange[] $array + * @return DateRange[] + * @throws WrongArgumentException + */ + public static function merge(array $array): array { - return new self($start, $end); + array_map(function ($item) { + Assert::isInstance($item, DateRange::class); + Assert::isTrue(!$item->isOpen()); + }, $array); + + $out = array(); + + foreach ($array as $range) { + $accepted = false; + + foreach ($out as $outRange) { + if ($outRange->isNeighbour($range)) { + $outRange->enlarge($range); + $accepted = true; + } + } + + if (!$accepted) { + $out[] = clone $range; + } + } + + return $out; + } + + /** + * @param DateRange $left + * @param DateRange $right + * @return int + */ + public static function compare(DateRange $left, DateRange $right): int + { + if ($left->isEmpty() && $right->isEmpty()) { + return 0; + } elseif ($left->isEmpty()) { + return 1; + } elseif ($right->isEmpty()) { + return -1; + } + + $leftStart = $left->getStartStamp(); + $leftEnd = $left->getEndStamp(); + + $rightStart = $right->getStartStamp(); + $rightEnd = $right->getEndStamp(); + + if ( + !$leftStart && !$rightStart + || $leftStart && $rightStart && ($leftStart == $rightStart) + ) { + if ( + !$leftEnd && !$rightEnd + || $leftEnd && $rightEnd && ($leftEnd == $rightEnd) + ) { + return 0; + } elseif ( + $leftEnd && !$rightEnd + || $leftEnd < $rightEnd + ) { + return -1; + } + + return 1; + } elseif ( + !$leftStart && $rightStart + || $leftStart < $rightStart + ) { + return -1; + } elseif ($leftStart && !$rightStart) { + return 1; + } + + return 1; } - public function __construct($start = null, $end = null) + /** + * @param Date|null $start + * @param Date|null $end + * @throws WrongArgumentException + */ + public function __construct(Date $start = null, Date $end = null) { - if ($start) + if ($start instanceof Date) { $this->setStart($start); + } - if ($end) + if ($end instanceof Date) { $this->setEnd($end); + } } public function __clone() { - if ($this->start) + if ($this->start) { $this->start = clone $this->start; + } - if ($this->end) + if ($this->end) { $this->end = clone $this->end; + } } /** + * @param Date $start + * @return static * @throws WrongArgumentException - * @return DateRange - **/ - public function setStart(/* Date */ $start) + */ + public function setStart(Date $start): DateRange { - $this->checkType($start); - - if ($this->end && $this->end->toStamp() < $start->toStamp()) - throw new WrongArgumentException( - 'start must be lower than end' - ); + Assert::isFalse( + $this->end instanceof Date && $this->end->toStamp() < $start->toStamp(), + 'start must be lower than end' + ); $this->start = $start; $this->dayStartStamp = null; @@ -80,106 +183,123 @@ public function setStart(/* Date */ $start) } /** - * @return DateRange - **/ - public function safeSetStart(/* Date */ $start) + * @param Date $start + * @return static + * @throws WrongArgumentException + */ + public function safeSetStart(Date $start): DateRange { - if ( - !$this->getEnd() - || Timestamp::compare( - $start, $this->getEnd() - ) < 0 - ) + if (!$this->getEnd() instanceof Date) { $this->setStart($start); + return $this; + } - elseif ($this->getEnd()) - $this->setStart($this->getEnd()); + $this->setStart( + Timestamp::compare($start, $this->getEnd()) < 0 + ? $start + : $this->getEnd() + ); return $this; } /** - * @return DateRange - **/ - public function safeSetEnd(/* Date */ $end) + * @param Date $end + * @return static + * @throws WrongArgumentException + */ + public function safeSetEnd(Date $end): DateRange { - if ( - !$this->getStart() - || Timestamp::compare( - $end, $this->getStart() - ) > 0 - ) + if (!$this->getStart() instanceof Date) { $this->setEnd($end); + return $this; + } - elseif ($this->getStart()) - $this->setEnd($this->getStart()); + $this->setEnd( + Timestamp::compare($end, $this->getStart()) > 0 + ? $end + : $this->getStart() + ); return $this; } /** + * @param Date $end + * @return static * @throws WrongArgumentException - * @return DateRange - **/ - public function setEnd(/* Date */ $end) + */ + public function setEnd(Date $end): DateRange { - $this->checkType($end); - - if ($this->start && $this->start->toStamp() > $end->toStamp()) - throw new WrongArgumentException( - 'end must be higher than start' - ); + Assert::isFalse( + $this->start instanceof Date && $this->start->toStamp() > $end->toStamp(), + 'end must be higher than start' + ); $this->end = $end; $this->dayEndStamp = null; + return $this; } /** - * @return DateRange - **/ - public function lazySet($start = null, $end = null) + * @param Date|null $start + * @param Date|null $end + * @return static + * @throws WrongArgumentException + */ + public function lazySet(Date $start = null, Date $end = null): DateRange { - if ($start) - $this->checkType($start); - - if ($end) - $this->checkType($end); - - if ($start && $end) { - if ($start->toStamp() >= $end->toStamp()) + if ( + $start instanceof Date + && $end instanceof Date + ) { + if ($start->toStamp() >= $end->toStamp()) { $this->setEnd($start)->setStart($end); - else + } else { $this->setStart($start)->setEnd($end); - } elseif ($start) + } + + return $this; + } + + if ($start instanceof Date) { $this->setStart($start); - elseif ($end) + } + + if ($end instanceof Date) { $this->setEnd($end); + } return $this; } /** - * @return DateRange - **/ - public function dropStart() + * @return static + */ + public function dropStart(): DateRange { $this->start = null; $this->dayStartStamp = null; + return $this; } /** - * @return DateRange - **/ - public function dropEnd() + * @return static + */ + public function dropEnd(): DateRange { $this->end = null; $this->dayEndStamp = null; + return $this; } - public function isEmpty() + /** + * @return bool + */ + public function isEmpty(): bool { return ($this->start === null) @@ -187,55 +307,80 @@ public function isEmpty() } /** - * @return Date - **/ - public function getStart() + * @return Date|null + */ + public function getStart(): ?Date { return $this->start; } /** - * @return Date - **/ - public function getEnd() + * @return Date|null + */ + public function getEnd(): ?Date { return $this->end; } - public function toDateString( - $internalDelimiter = '-', - $dateDelimiter = ' - ' - ) + /** + * @param string $internalDelimiter + * @param string $dateDelimiter + * @return string|null + */ + public function toDateString(string $internalDelimiter = '-', string $dateDelimiter = ' - '): ?string { - if ($this->start && $this->end) - return - "{$this->start->toDate($internalDelimiter)}" - .$dateDelimiter - ."{$this->end->toDate($internalDelimiter)}"; - elseif ($this->start) + if ( + $this->start instanceof Date + && $this->end instanceof Date + ) { + return $this->start->toDate($internalDelimiter) + . $dateDelimiter + . $this->end->toDate($internalDelimiter); + } + + if ($this->start instanceof Date) { return $this->start->toDate($internalDelimiter); - elseif ($this->end) + } + + if ($this->end instanceof Date) { return $this->end->toDate($internalDelimiter); + } return null; } - public function toString($delimiter = ' - ') + /** + * @param string $delimiter + * @return string|null + */ + public function toString(string $delimiter = ' - '): ?string { - if ($this->start && $this->end) + if ( + $this->start instanceof Date + && $this->end instanceof Date + ) { return $this->start->toString() - .$delimiter - .$this->end->toString(); - elseif ($this->start) + . $delimiter + . $this->end->toString(); + } + + if ($this->start instanceof Date) { return $this->start->toString(); - elseif ($this->end) + } + + if ($this->end instanceof Date) { return $this->end->toString(); + } return null; } - public function overlaps(DateRange $range) + /** + * @param DateRange $range + * @return bool + */ + public function overlaps(DateRange $range): bool { if ($this->isEmpty() || $range->isEmpty()) return true; @@ -245,51 +390,28 @@ public function overlaps(DateRange $range) $min = $range->getStartStamp(); $max = $range->getEndStamp(); - return ( + return ( - $min - && $max - && ( - ( - $left - && $right - && ( + $min && $max && ( + ( $left && $right && ( (($left <= $min) && ($min <= $right)) || (($min <= $left) && ($left <= $max)) ) - ) || ( - !$left - && ($min <= $right) - ) || ( - !$right - && ($left <= $max) - ) - ) - ) || ( - $min - && !$max - && ( - !$right - || ( - $right - && ($min <= $right) - ) - ) - ) || ( - !$min - && $max - && ( - !$left - || ( - $left - && ($left <= $max) ) + || ( !$left && ($min <= $right) ) || ( !$right && ($left <= $max) ) ) ) - ); + || ( $min && !$max && ( !$right || ($min <= $right) ) ) + || ( !$min && $max && ( !$left || ($left <= $max) ) ) + ; } - public function contains(/* Timestamp */ $date) + /** + * @param Date $date + * @return bool + * @throws WrongArgumentException + */ + public function contains(object $date): bool { $this->checkType($date); @@ -297,28 +419,24 @@ public function contains(/* Timestamp */ $date) $end = $this->getEndStamp(); $probe = $date->toStamp(); - if ( - (!$start && !$end) - || (!$start && $end >= $probe) - || (!$end && $start <= $probe) + return + (null === $start && null === $end) + || (null === $start && $end >= $probe) + || (null === $end && $start <= $probe) || ($start <= $probe && $end >= $probe) - ) - return true; - - return false; + ; } - public function split() + /** + * @return Date[] + * @throws WrongArgumentException + */ + public function split(): array { - Assert::isFalse( - $this->isOpen(), - "open range can't be splitted" - ); + Assert::isFalse($this->isOpen(), "can't split open range"); $dates = array(); - $start = new Date($this->start->getDayStartStamp()); - $endStamp = $this->end->getDayEndStamp(); for ( @@ -332,31 +450,16 @@ public function split() return $dates; } - public static function merge($array /* of DateRanges */) - { - $out = array(); - - foreach ($array as $range) { - $accepted = false; - - foreach ($out as $outRange) - if ($outRange->isNeighbour($range)) { - $outRange->enlarge($range); - $accepted = true; - } - - if (!$accepted) - $out[] = clone $range; - } - - return $out; - } - - public function isNeighbour(DateRange $range) + /** + * @param DateRange $range + * @return bool + * @throws WrongArgumentException + */ + public function isNeighbour(DateRange $range): bool { Assert::isTrue(!$this->isOpen() && !$range->isOpen()); - if ( + return $this->overlaps($range) || ( $this->start->spawn('-1 day')->getDayStartStamp() @@ -365,112 +468,98 @@ public function isNeighbour(DateRange $range) $this->end->spawn('+1 day')->getDayStartStamp() == $range->start->getDayStartStamp() ) - ) - return true; - - return false; + ; } - public function isOpen() + /** + * @return bool + */ + public function isOpen(): bool { - return !$this->start || !$this->end; + return + !$this->start instanceof Date + || !$this->end instanceof Date; } /** * enlarges $this by given $range, if last one is wider - * - * @return DateRange - **/ - public function enlarge(DateRange $range) + * NB! Be careful if DateRange 01 Mar 2000 - 31 Mar 2000 + * enlarge with DateRange 01 Jan 2000 - 31 Jan 2000 new + * DateRange will be 01 Jan 2000 - 31 Mar 2000. Will be + * included center range 01 Feb 2000 - 28 Feb 2000 + * @param DateRange $range + * @return static + * @throws WrongArgumentException + */ + public function enlarge(DateRange $range): DateRange { - if (!$range->start) - $this->start = null; - elseif ( - $this->start + if (!$range->start instanceof Date) { + $this->dropStart(); + } elseif ( + $this->start instanceof Date && $this->start->toStamp() > $range->start->toStamp() - ) - $this->start = clone $range->start; + ) { + $this->setStart(clone $range->start); + } - if (!$range->end) - $this->end = null; - elseif ( - $this->end + if (!$range->end instanceof Date) { + $this->dropEnd(); + } elseif ( + $this->end instanceof Date && $this->end->toStamp() < $range->end->toStamp() - ) - $this->end = clone $range->end; + ) { + $this->setEnd(clone $range->end); + } return $this; } /** * intersection of $this and given $range - * - * @return DateRange - **/ - public function clip(DateRange $range) + * @return static + * @throws WrongArgumentException + */ + public function clip(DateRange $range): DateRange { Assert::isTrue($this->overlaps($range)); if ( - $range->start + $range->start instanceof Date && ( - $this->start - && $range->start->toStamp() > $this->start->toStamp() - || !$this->start + !$this->start instanceof Date + || $range->start->toStamp() > $this->start->toStamp() ) - ) + ) { $this->start = clone $range->start; + } if ( - $range->end + $range->end instanceof Date && ( - $this->end - && $range->end->toStamp() < $this->end->toStamp() - || !$this->end + !$this->end instanceof Date + || $range->end->toStamp() < $this->end->toStamp() ) - ) + ) { $this->end = clone $range->end; + } return $this; } /** - * result is read-only, no error checking - * - * @return DateRange - **/ - public function lightCopyOnClip(DateRange $range) + * @param DateRange $range + * @return static + * @throws WrongArgumentException + */ + public function lightCopyOnClip(DateRange $range): DateRange { - $copy = DateRange::create(); - - if ( - $range->start - && ( - $this->start - && $range->start->toStamp() > $this->start->toStamp() - || !$this->start - ) - ) - $copy->start = $range->start; - else - $copy->start = $this->start; - - if ( - $range->end - && ( - $this->end - && $range->end->toStamp() < $this->end->toStamp() - || !$this->end - ) - ) - $copy->end = $range->end; - else - $copy->end = $this->end; - - return $copy; + return (clone $this)->clip($range); } - public function getStartStamp() // null if start is null + /** + * @return int|null + */ + public function getStartStamp(): ?int { if ($this->start) { if (!$this->dayStartStamp) { @@ -483,7 +572,10 @@ public function getStartStamp() // null if start is null return null; } - public function getEndStamp() // null if end is null + /** + * @return int|null + */ + public function getEndStamp(): ?int { if ($this->end) { if (!$this->dayEndStamp) { @@ -496,76 +588,45 @@ public function getEndStamp() // null if end is null return null; } - public static function compare(DateRange $left, DateRange $right) - { - if ($left->isEmpty() && $right->isEmpty()) - return 0; - elseif ($left->isEmpty()) - return 1; - elseif ($right->isEmpty()) - return -1; - - $leftStart = $left->getStartStamp(); - $leftEnd = $left->getEndStamp(); - - $rightStart = $right->getStartStamp(); - $rightEnd = $right->getEndStamp(); - - if ( - !$leftStart && !$rightStart - || $leftStart && $rightStart && ($leftStart == $rightStart) - ) { - if ( - !$leftEnd && !$rightEnd - || $leftEnd && $rightEnd && ($leftEnd == $rightEnd) - ) - return 0; - elseif (!$leftEnd && $rightEnd) - return 1; - elseif ($leftEnd && !$rightEnd) - return -1; - elseif ($leftEnd < $rightEnd) - return -1; - else - return 1; - } elseif (!$leftStart && $rightStart) - return -1; - elseif ($leftStart && !$rightStart) - return 1; - elseif ($leftStart < $rightStart) - return -1; - else - return 1; - } - - public function isOneDay() + /** + * @return bool + */ + public function isOneDay(): bool { - return (!$this->isOpen()) - && ($this->start->toDate() == $this->end->toDate()); + return + !$this->isOpen() + && $this->start->toDate() == $this->end->toDate(); } /** * @return TimestampRange - **/ - public function toTimestampRange() + * @throws WrongArgumentException + */ + public function toTimestampRange(): TimestampRange { return TimestampRange::create( - $this->getStart()->toTimestamp(), - $this->getEnd()->toTimestamp() + $this->getStart() ? $this->getStart()->toTimestamp() : null, + $this->getEnd() ? $this->getEnd()->toTimestamp() : null ); } - protected function checkType($value) + /** + * @param $value + * @throws WrongArgumentException + */ + protected function checkType($value): void { Assert::isTrue( ClassUtils::isInstanceOf($value, $this->getObjectName()) ); } - protected function getObjectName() + /** + * @return string + */ + protected function getObjectName(): string { return Date::class; } -} -?> +} \ No newline at end of file diff --git a/src/Main/Base/SingleRange.php b/src/Main/Base/SingleRange.php index 377e01ab4b..ee870f123a 100644 --- a/src/Main/Base/SingleRange.php +++ b/src/Main/Base/SingleRange.php @@ -16,9 +16,8 @@ **/ interface SingleRange { - public function getStart(); - public function getEnd(); + public function getStart(): ?object; + public function getEnd(): ?object; - public function contains($probe); -} -?> \ No newline at end of file + public function contains(object $probe): bool; +} \ No newline at end of file diff --git a/src/Main/Base/TimestampRange.php b/src/Main/Base/TimestampRange.php index 03cbfc0ba5..799d92b9b8 100644 --- a/src/Main/Base/TimestampRange.php +++ b/src/Main/Base/TimestampRange.php @@ -19,15 +19,7 @@ **/ class TimestampRange extends DateRange { - /** - * @return TimestampRange - **/ - public static function create($start = null, $end = null) - { - return new self($start, $end); - } - - public function getStartStamp() // null if start is null + public function getStartStamp(): ?int // null if start is null { if ($start = $this->getStart()) { return $start->toStamp(); @@ -36,7 +28,7 @@ public function getStartStamp() // null if start is null return null; } - public function getEndStamp() // null if end is null + public function getEndStamp(): ?int // null if end is null { if ($end = $this->getEnd()) { return $end->toStamp(); @@ -46,16 +38,18 @@ public function getEndStamp() // null if end is null } /** - * @return TimestampRange - **/ - public function toTimestampRange() + * @return static + */ + public function toTimestampRange(): TimestampRange { return $this; } - protected function getObjectName() + /** + * @return string + */ + protected function getObjectName(): string { - return '\OnPHP\Core\Base\Timestamp'; + return Timestamp::class; } -} -?> \ No newline at end of file +} \ No newline at end of file diff --git a/src/Main/Net/Ip/IpNetwork.php b/src/Main/Net/Ip/IpNetwork.php index 12563fb499..5682ad8d40 100644 --- a/src/Main/Net/Ip/IpNetwork.php +++ b/src/Main/Net/Ip/IpNetwork.php @@ -61,7 +61,7 @@ public function getMask() /** * @return IpAddress **/ - public function getStart() + public function getStart(): ?IpAddress { return $this->ip; } @@ -69,7 +69,7 @@ public function getStart() /** * @return IpAddress **/ - public function getEnd() + public function getEnd(): ?IpAddress { if (!$this->end) { $this->end = @@ -81,7 +81,12 @@ public function getEnd() return $this->end; } - public function contains(/* IpAddress */ $probe) + /** + * @param IpAddress $probe + * @return bool + * @throws WrongArgumentException + */ + public function contains(object $probe): bool { Assert::isInstance($probe, IpAddress::class); diff --git a/src/Main/Net/Ip/IpRange.php b/src/Main/Net/Ip/IpRange.php index f2131f777a..36b8fdad39 100644 --- a/src/Main/Net/Ip/IpRange.php +++ b/src/Main/Net/Ip/IpRange.php @@ -64,7 +64,7 @@ public function __construct(/**/) /** * @return IpAddress **/ - public function getStart() + public function getStart(): ?IpAddress { return $this->startIp; } @@ -82,7 +82,7 @@ public function setStart(IpAddress $startIp) /** * @return IpAddress **/ - public function getEnd() + public function getEnd(): ?IpAddress { return $this->endIp; } @@ -97,7 +97,12 @@ public function setEnd(IpAddress $endIp) return $this; } - public function contains(/* IpAddress */ $probe) + /** + * @param IpAddress $probe + * @return bool + * @throws WrongArgumentException + */ + public function contains(object $probe): bool { Assert::isInstance($probe, IpAddress::class); diff --git a/src/Meta/Builder/BusinessClassBuilder.php b/src/Meta/Builder/BusinessClassBuilder.php index 749a506be5..c5ba7d7da9 100644 --- a/src/Meta/Builder/BusinessClassBuilder.php +++ b/src/Meta/Builder/BusinessClassBuilder.php @@ -79,7 +79,7 @@ public static function dao() EOT; if (!$type || $type->getId() !== MetaClassType::CLASS_ABSTRACT) { - $customCreate = null; + $buildCreate = true; if ( $class->getFinalParent()->getPattern() @@ -90,55 +90,22 @@ public static function dao() while ($parent = $parent->getParent()) { $info = new \ReflectionClass($parent->getNameWithNS()); - if ( - $info->hasMethod('create') - && ($info->getMethod('create')->getParameters() > 0) - ) { - $customCreate = true; + if ($info->hasMethod('create')) { + $buildCreate = false; break; } } } - if ($customCreate) { - $creator = $info->getMethod('create'); - - $declaration = array(); - - foreach ($creator->getParameters() as $parameter) { - $declaration[] = - '$'.$parameter->getName() - // no one can live without default value @ ::create - .' = ' - .( - $parameter->getDefaultValue() - ? $parameter->getDefaultValue() - : 'null' - ); - } - - $declaration = implode(', ', $declaration); - - $out .= <<getName()} - **/ - public static function create({$declaration}) - { - return new self({$declaration}); - } - -EOT; - } else { + if ($buildCreate) { $out .= <<getName()} + * @return static **/ - public static function create() + public static function create(): {$class->getName()} { - return new self; + return new static; } EOT; diff --git a/tests/Core/DateRangeTest.php b/tests/Core/DateRangeTest.php index 173cf85248..17775e91c3 100644 --- a/tests/Core/DateRangeTest.php +++ b/tests/Core/DateRangeTest.php @@ -3,7 +3,10 @@ namespace OnPHP\Tests\Core; use OnPHP\Core\Base\Date; +use OnPHP\Core\Base\Timestamp; +use OnPHP\Core\Exception\WrongArgumentException; use OnPHP\Main\Base\DateRange; +use OnPHP\Main\Base\TimestampRange; use OnPHP\Tests\TestEnvironment\TestCase; /** @@ -12,6 +15,799 @@ */ final class DateRangeTest extends TestCase { + public function testCreate() + { + $dateRange = DateRange::create(); + $this->assertInstanceOf(DateRange::class, $dateRange); + $this->assertNull($dateRange->getStart()); + $this->assertNull($dateRange->getEnd()); + + $date = Date::create('2007-01-01'); + $dateRange = DateRange::create($date); + $this->assertInstanceOf(DateRange::class, $dateRange); + $this->assertInstanceOf(Date::class, $dateRange->getStart()); + $this->assertEquals($date->toDate(), $dateRange->getStart()->toDate()); + $this->assertNull($dateRange->getEnd()); + + $date = Date::create('2008-01-01'); + $dateRange = DateRange::create(null, $date); + $this->assertInstanceOf(DateRange::class, $dateRange); + $this->assertNull($dateRange->getStart()); + $this->assertInstanceOf(Date::class, $dateRange->getEnd()); + $this->assertEquals($date->toDate(), $dateRange->getEnd()->toDate()); + + $start = Date::create('2007-01-01'); + $end = Date::create('2008-01-01'); + $dateRange = DateRange::create($start, $end); + $this->assertInstanceOf(DateRange::class, $dateRange); + $this->assertInstanceOf(Date::class, $dateRange->getStart()); + $this->assertInstanceOf(Date::class, $dateRange->getEnd()); + $this->assertEquals($start->toDate(), $dateRange->getStart()->toDate()); + $this->assertEquals($end->toDate(), $dateRange->getEnd()->toDate()); + + $start = Date::create('2007-01-01'); + $end = Date::create('2008-01-01'); + try { + DateRange::create($end, $start); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + } + + public function testMerge() + { + try { + DateRange::merge([DateRange::create()]); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + try { + DateRange::merge([DateRange::create(Date::create('2007-01-01'))]); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + try { + DateRange::merge([DateRange::create(null, Date::create('2007-12-31'))]); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + try { + DateRange::merge([ + DateRange::create(Date::create('2007-01-01'), Date::create('2007-12-31')), + DateRange::create() + ]); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + + $output = DateRange::merge([DateRange::create(Date::create('2007-01-01'), Date::create('2007-12-31'))]); + $this->assertCount(1, $output); + + $output = DateRange::merge([ + DateRange::create(Date::create('2007-01-01'), Date::create('2007-01-31')), + DateRange::create(Date::create('2007-03-01'), Date::create('2007-03-31')), + DateRange::create(Date::create('2007-05-01'), Date::create('2007-05-31')), + ]); + $this->assertCount(3, $output); + + $output = DateRange::merge([ + DateRange::create(Date::create('2007-01-01'), Date::create('2007-01-31')), + DateRange::create(Date::create('2007-02-20'), Date::create('2007-02-28')), + DateRange::create(Date::create('2007-05-01'), Date::create('2007-05-31')), + DateRange::create(Date::create('2007-03-01'), Date::create('2007-03-31')), + ]); + $this->assertCount(3, $output); + $this->assertEquals($output[0]->getStart()->toDate(), Date::create('2007-01-01')->toDate()); + $this->assertEquals($output[0]->getEnd()->toDate(), Date::create('2007-01-31')->toDate()); + $this->assertEquals($output[1]->getStart()->toDate(), Date::create('2007-02-20')->toDate()); + $this->assertEquals($output[1]->getEnd()->toDate(), Date::create('2007-03-31')->toDate()); + $this->assertEquals($output[2]->getStart()->toDate(), Date::create('2007-05-01')->toDate()); + $this->assertEquals($output[2]->getEnd()->toDate(), Date::create('2007-05-31')->toDate()); + + $output = DateRange::merge([ + DateRange::create(Date::create('2007-01-01'), Date::create('2007-01-31')), + DateRange::create(Date::create('2007-02-20'), Date::create('2007-02-28')), + DateRange::create(Date::create('2007-04-01'), Date::create('2007-04-30')), + DateRange::create(Date::create('2007-05-01'), Date::create('2007-05-31')), + DateRange::create(Date::create('2007-03-01'), Date::create('2007-03-31')), + ]); + $this->assertCount(3, $output); + $this->assertEquals($output[0]->getStart()->toDate(), Date::create('2007-01-01')->toDate()); + $this->assertEquals($output[0]->getEnd()->toDate(), Date::create('2007-01-31')->toDate()); + $this->assertEquals($output[1]->getStart()->toDate(), Date::create('2007-02-20')->toDate()); + $this->assertEquals($output[1]->getEnd()->toDate(), Date::create('2007-03-31')->toDate()); + $this->assertEquals($output[2]->getStart()->toDate(), Date::create('2007-03-01')->toDate()); + $this->assertEquals($output[2]->getEnd()->toDate(), Date::create('2007-05-31')->toDate()); + } + + public function testCompare() + { + $this->assertEquals(0, + DateRange::compare( + DateRange::create(), DateRange::create() + ) + ); + $this->assertEquals(1, + DateRange::compare( + DateRange::create(), + DateRange::create(Date::makeToday()) + ) + ); + $this->assertEquals(1, + DateRange::compare( + DateRange::create(), + DateRange::create(null, Date::makeToday()) + ) + ); + $this->assertEquals(1, + DateRange::compare( + DateRange::create(), + DateRange::create(Date::makeToday(), Date::create("+1 week")) + ) + ); + $this->assertEquals(-1, + DateRange::compare( + DateRange::create(Date::makeToday()), + DateRange::create() + ) + ); + $this->assertEquals(-1, + DateRange::compare( + DateRange::create(null, Date::makeToday()), + DateRange::create() + ) + ); + $this->assertEquals(-1, + DateRange::compare( + DateRange::create(Date::makeToday(), Date::create("+1 week")), + DateRange::create() + ) + ); + + $this->assertEquals(1, + DateRange::compare( + DateRange::create(null, Date::create('2006-01-01')), + DateRange::create(null, Date::create('2005-01-01')) + ) + ); + $this->assertEquals(0, + DateRange::compare( + DateRange::create(null, Date::create('2006-01-01')), + DateRange::create(null, Date::create('2006-01-01')) + ) + ); + $this->assertEquals(-1, + DateRange::compare( + DateRange::create(null, Date::create('2006-01-01')), + DateRange::create(null, Date::create('2007-01-01')) + ) + ); + $this->assertEquals(-1, + DateRange::compare( + DateRange::create(null, Date::create('2006-01-01')), + DateRange::create(Date::create('2007-01-01')) + ) + ); + $this->assertEquals(0, + DateRange::compare( + DateRange::create(null, Date::create('2006-01-01')), + DateRange::create(null, Date::create('2006-01-01')) + ) + ); + $this->assertEquals(1, + DateRange::compare( + DateRange::create(null, Date::create('2006-01-01')), + DateRange::create(null, Date::create('2005-01-01')) + ) + ); + + $this->assertEquals(1, + DateRange::compare( + DateRange::create(Date::create('2006-01-01')), + DateRange::create(null, Date::create('2005-01-01')) + ) + ); + $this->assertEquals(1, + DateRange::compare( + DateRange::create(Date::create('2006-01-01')), + DateRange::create(null, Date::create('2006-01-01')) + ) + ); + $this->assertEquals(1, + DateRange::compare( + DateRange::create(Date::create('2006-01-01')), + DateRange::create(null, Date::create('2007-01-01')) + ) + ); + $this->assertEquals(-1, + DateRange::compare( + DateRange::create(Date::create('2006-01-01')), + DateRange::create(Date::create('2007-01-01')) + ) + ); + $this->assertEquals(1, + DateRange::compare( + DateRange::create(Date::create('2006-01-01')), + DateRange::create(null, Date::create('2006-01-01')) + ) + ); + $this->assertEquals(1, + DateRange::compare( + DateRange::create(Date::create('2006-01-01')), + DateRange::create(null, Date::create('2005-01-01')) + ) + ); + + $this->assertEquals(1, + DateRange::compare( + DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01')), + DateRange::create(null, Date::create('2005-01-01')) + ) + ); + $this->assertEquals(1, + DateRange::compare( + DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01')), + DateRange::create(null, Date::create('2006-01-01')) + ) + ); + $this->assertEquals(1, + DateRange::compare( + DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01')), + DateRange::create(null, Date::create('2006-06-01')) + ) + ); + $this->assertEquals(1, + DateRange::compare( + DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01')), + DateRange::create(null, Date::create('2007-01-01')) + ) + ); + $this->assertEquals(1, + DateRange::compare( + DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01')), + DateRange::create(null, Date::create('2008-01-01')) + ) + ); + $this->assertEquals(1, + DateRange::compare( + DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01')), + DateRange::create(Date::create('2005-01-01')) + ) + ); + $this->assertEquals(-1, + DateRange::compare( + DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01')), + DateRange::create(Date::create('2006-01-01')) + ) + ); + $this->assertEquals(-1, + DateRange::compare( + DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01')), + DateRange::create(Date::create('2006-06-01')) + ) + ); + $this->assertEquals(-1, + DateRange::compare( + DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01')), + DateRange::create(Date::create('2007-01-01')) + ) + ); + $this->assertEquals(-1, + DateRange::compare( + DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01')), + DateRange::create(Date::create('2008-01-01')) + ) + ); + $this->assertEquals(1, + DateRange::compare( + DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01')), + DateRange::create(Date::create('2005-01-01'), Date::create('2005-06-01')) + ) + ); + $this->assertEquals(1, + DateRange::compare( + DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01')), + DateRange::create(Date::create('2005-01-01'), Date::create('2006-01-01')) + ) + ); + $this->assertEquals(1, + DateRange::compare( + DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01')), + DateRange::create(Date::create('2005-01-01'), Date::create('2006-06-01')) + ) + ); + $this->assertEquals(1, + DateRange::compare( + DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01')), + DateRange::create(Date::create('2005-01-01'), Date::create('2007-01-01')) + ) + ); + $this->assertEquals(1, + DateRange::compare( + DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01')), + DateRange::create(Date::create('2005-01-01'), Date::create('2008-01-01')) + ) + ); + $this->assertEquals(1, + DateRange::compare( + DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01')), + DateRange::create(Date::create('2006-01-01'), Date::create('2006-06-01')) + ) + ); + $this->assertEquals(0, + DateRange::compare( + DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01')), + DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01')) + ) + ); + $this->assertEquals(-1, + DateRange::compare( + DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01')), + DateRange::create(Date::create('2006-01-01'), Date::create('2008-01-01')) + ) + ); + $this->assertEquals(-1, + DateRange::compare( + DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01')), + DateRange::create(Date::create('2006-06-01'), Date::create('2006-07-01')) + ) + ); + $this->assertEquals(-1, + DateRange::compare( + DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01')), + DateRange::create(Date::create('2006-06-01'), Date::create('2007-01-01')) + ) + ); + $this->assertEquals(-1, + DateRange::compare( + DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01')), + DateRange::create(Date::create('2006-06-01'), Date::create('2008-01-01')) + ) + ); + $this->assertEquals(-1, + DateRange::compare( + DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01')), + DateRange::create(Date::create('2007-01-01'), Date::create('2008-01-01')) + ) + ); + $this->assertEquals(-1, + DateRange::compare( + DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01')), + DateRange::create(Date::create('2008-01-01'), Date::create('2009-01-01')) + ) + ); + } + + public function testConstructor() + { + $dateRange = new DateRange; + $this->assertInstanceOf(DateRange::class, $dateRange); + $this->assertNull($dateRange->getStart()); + $this->assertNull($dateRange->getEnd()); + + $date = Date::create('2007-01-01'); + $dateRange = new DateRange($date); + $this->assertInstanceOf(DateRange::class, $dateRange); + $this->assertInstanceOf(Date::class, $dateRange->getStart()); + $this->assertEquals($date->toDate(), $dateRange->getStart()->toDate()); + $this->assertNull($dateRange->getEnd()); + + $date = Date::create('2008-01-01'); + $dateRange = new DateRange(null, $date); + $this->assertInstanceOf(DateRange::class, $dateRange); + $this->assertNull($dateRange->getStart()); + $this->assertInstanceOf(Date::class, $dateRange->getEnd()); + $this->assertEquals($date->toDate(), $dateRange->getEnd()->toDate()); + + $start = Date::create('2007-01-01'); + $end = Date::create('2008-01-01'); + $dateRange = new DateRange($start, $end); + $this->assertInstanceOf(DateRange::class, $dateRange); + $this->assertInstanceOf(Date::class, $dateRange->getStart()); + $this->assertInstanceOf(Date::class, $dateRange->getEnd()); + $this->assertEquals($start->toDate(), $dateRange->getStart()->toDate()); + $this->assertEquals($end->toDate(), $dateRange->getEnd()->toDate()); + + $start = Date::create('2007-01-01'); + $end = Date::create('2008-01-01'); + try { + new DateRange($end, $start); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + } + + public function testClone() + { + $dateRange = DateRange::create(); + $dateRangeClone = clone $dateRange; + $this->assertInstanceOf(DateRange::class, $dateRangeClone); + $this->assertNull($dateRangeClone->getStart()); + $this->assertNull($dateRangeClone->getEnd()); + + $date = Date::create('2007-01-01'); + $dateRange = DateRange::create($date); + $dateRangeClone = clone $dateRange; + $this->assertInstanceOf(DateRange::class, $dateRangeClone); + $this->assertInstanceOf(Date::class, $dateRangeClone->getStart()); + $this->assertEquals($date->toDate(), $dateRangeClone->getStart()->toDate()); + $this->assertNull($dateRangeClone->getEnd()); + $dateRange->dropStart(); + $this->assertInstanceOf(Date::class, $dateRangeClone->getStart()); + + $date = Date::create('2008-01-01'); + $dateRange = DateRange::create(null, $date); + $dateRangeClone = clone $dateRange; + $this->assertInstanceOf(DateRange::class, $dateRangeClone); + $this->assertNull($dateRangeClone->getStart()); + $this->assertInstanceOf(Date::class, $dateRangeClone->getEnd()); + $this->assertEquals($date->toDate(), $dateRangeClone->getEnd()->toDate()); + $dateRange->dropEnd(); + $this->assertInstanceOf(Date::class, $dateRangeClone->getEnd()); + + $start = Date::create('2007-01-01'); + $end = Date::create('2008-01-01'); + $dateRange = DateRange::create($start, $end); + $dateRangeClone = clone $dateRange; + $this->assertInstanceOf(DateRange::class, $dateRangeClone); + $this->assertInstanceOf(Date::class, $dateRangeClone->getStart()); + $this->assertInstanceOf(Date::class, $dateRangeClone->getEnd()); + $this->assertEquals($start->toDate(), $dateRangeClone->getStart()->toDate()); + $this->assertEquals($end->toDate(), $dateRangeClone->getEnd()->toDate()); + $dateRange->dropStart()->dropEnd(); + $this->assertInstanceOf(Date::class, $dateRangeClone->getStart()); + $this->assertInstanceOf(Date::class, $dateRangeClone->getEnd()); + } + + public function testSetStart() + { + $dateRange = DateRange::create(); + $start = Date::create('2007-01-01'); + $end = Date::create('2008-01-01'); + + $dateRange->setStart($end); + $this->assertInstanceOf(Date::class, $dateRange->getStart()); + $this->assertEquals($end->toDate(), $dateRange->getStart()->toDate()); + $dateRange->setStart($start); + $this->assertInstanceOf(Date::class, $dateRange->getStart()); + $this->assertEquals($start->toDate(), $dateRange->getStart()->toDate()); + $dateRange->setEnd($start); + try { + $dateRange->setStart($end); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + } + + public function testSafeSetStart() + { + $dateRange = DateRange::create(); + $start = Date::create('2007-01-01'); + $end = Date::create('2008-01-01'); + + $dateRange->safeSetStart($start); + $this->assertInstanceOf(Date::class, $dateRange->getStart()); + $this->assertEquals($start->toDate(), $dateRange->getStart()->toDate()); + + $dateRange = DateRange::create(null, $start); + $dateRange->safeSetStart($end); + $this->assertInstanceOf(Date::class, $dateRange->getStart()); + $this->assertInstanceOf(Date::class, $dateRange->getEnd()); + $this->assertEquals($dateRange->getEnd()->toDate(), $dateRange->getStart()->toDate()); + $this->assertEquals($start->toDate(), $dateRange->getStart()->toDate()); + + $dateRange = DateRange::create(null, $end); + $dateRange->safeSetStart($start); + $this->assertInstanceOf(Date::class, $dateRange->getStart()); + $this->assertEquals($start->toDate(), $dateRange->getStart()->toDate()); + } + + public function testSafeSetEnd() + { + $dateRange = DateRange::create(); + $start = Date::create('2007-01-01'); + $end = Date::create('2008-01-01'); + + $dateRange->safeSetEnd($end); + $this->assertInstanceOf(Date::class, $dateRange->getEnd()); + $this->assertEquals($end->toDate(), $dateRange->getEnd()->toDate()); + + $dateRange = DateRange::create($end); + $dateRange->safeSetEnd($start); + $this->assertInstanceOf(Date::class, $dateRange->getStart()); + $this->assertInstanceOf(Date::class, $dateRange->getEnd()); + $this->assertEquals($dateRange->getEnd()->toDate(), $dateRange->getStart()->toDate()); + $this->assertEquals($end->toDate(), $dateRange->getEnd()->toDate()); + + $dateRange = DateRange::create($start); + $dateRange->safeSetEnd($end); + $this->assertInstanceOf(Date::class, $dateRange->getEnd()); + $this->assertEquals($end->toDate(), $dateRange->getEnd()->toDate()); + } + + public function testSetEnd() + { + $dateRange = DateRange::create(); + $start = Date::create('2007-01-01'); + $end = Date::create('2008-01-01'); + + $dateRange->setEnd($start); + $this->assertInstanceOf(Date::class, $dateRange->getEnd()); + $this->assertEquals($start->toDate(), $dateRange->getEnd()->toDate()); + $dateRange->setEnd($end); + $this->assertInstanceOf(Date::class, $dateRange->getEnd()); + $this->assertEquals($end->toDate(), $dateRange->getEnd()->toDate()); + $dateRange->setStart($end); + try { + $dateRange->setEnd($start); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + } + + public function testLazySet() + { + $dateRange = DateRange::create()->lazySet(); + $this->assertNull($dateRange->getStart()); + $this->assertNull($dateRange->getEnd()); + + $date = Date::create('2007-01-01'); + $dateRange = DateRange::create()->lazySet($date); + $this->assertInstanceOf(Date::class, $dateRange->getStart()); + $this->assertEquals($date->toDate(), $dateRange->getStart()->toDate()); + $this->assertNull($dateRange->getEnd()); + $dateRange = DateRange::create()->lazySet(null, $date); + $this->assertInstanceOf(Date::class, $dateRange->getEnd()); + $this->assertEquals($date->toDate(), $dateRange->getEnd()->toDate()); + $this->assertNull($dateRange->getStart()); + + $start = Date::create('2007-01-01'); + $end = Date::create('2008-01-01'); + $dateRange = DateRange::create()->lazySet($start, $end); + $this->assertInstanceOf(Date::class, $dateRange->getStart()); + $this->assertInstanceOf(Date::class, $dateRange->getEnd()); + $this->assertEquals($start->toDate(), $dateRange->getStart()->toDate()); + $this->assertEquals($end->toDate(), $dateRange->getEnd()->toDate()); + $dateRange = DateRange::create()->lazySet($end, $start); + $this->assertInstanceOf(Date::class, $dateRange->getStart()); + $this->assertInstanceOf(Date::class, $dateRange->getEnd()); + $this->assertEquals($start->toDate(), $dateRange->getStart()->toDate()); + $this->assertEquals($end->toDate(), $dateRange->getEnd()->toDate()); + } + + public function testDropStart() + { + $dateRange = DateRange::create(); + $start = Date::create('2007-01-01'); + $dateRange->dropStart(); + + $dateRange->setStart($start); + $dateRange->dropStart(); + $this->assertNull($dateRange->getStart()); + $this->assertNull($dateRange->getStartStamp()); + } + + public function testDropEnd() + { + $dateRange = DateRange::create(); + $end = Date::create('2008-01-01'); + $dateRange->dropEnd(); + + $dateRange->setEnd($end); + $dateRange->dropEnd(); + $this->assertNull($dateRange->getEnd()); + $this->assertNull($dateRange->getEndStamp()); + } + + public function testIsEmpty() + { + $this->assertTrue(DateRange::create()->isEmpty()); + $this->assertFalse(DateRange::create(Date::create('2007-01-01'), null)->isEmpty()); + $this->assertFalse(DateRange::create(null, Date::create('2008-01-01'))->isEmpty()); + $this->assertFalse( + DateRange::create(Date::create('2007-01-01'), Date::create('2008-01-01'))->isEmpty() + ); + } + + public function testGetStart() + { + $dateRange = DateRange::create(); + $this->assertNull($dateRange->getStart()); + + $date = Date::create('2007-01-01'); + $dateRange = DateRange::create($date); + $this->assertInstanceOf(Date::class, $dateRange->getStart()); + $this->assertEquals($date->toDate(), $dateRange->getStart()->toDate()); + $dateRange->dropStart(); + $this->assertNull($dateRange->getStart()); + } + + public function testGetEnd() + { + $dateRange = DateRange::create(); + $this->assertNull($dateRange->getEnd()); + + $date = Date::create('2007-12-31'); + $dateRange = DateRange::create(null, $date); + $this->assertInstanceOf(Date::class, $dateRange->getEnd()); + $this->assertEquals($date->toDate(), $dateRange->getEnd()->toDate()); + $dateRange->dropEnd(); + $this->assertNull($dateRange->getEnd()); + } + + public function testToDateString() + { + $start = Date::create('2007-01-01'); + $end = Date::create('2007-12-31'); + $methodParams = [ + 'internalDelimiter' => '-', + 'dateDelimiter' => ' - ', + ]; + + $dateRangeReflection = new \ReflectionClass(DateRange::class); + $toDateStringMethod = $dateRangeReflection->getMethod('toDateString'); + $this->assertCount($toDateStringMethod->getNumberOfParameters(), $methodParams); + foreach ($toDateStringMethod->getParameters() as $param) { + $this->assertArrayHasKey($param->getName(), $methodParams); + $this->assertEquals($methodParams[$param->getName()], $param->getDefaultValue()); + } + + $this->assertNull(DateRange::create()->toDateString()); + $this->assertEquals( + $start->toDate($methodParams['internalDelimiter']) . $methodParams['dateDelimiter'] . $end->toDate($methodParams['internalDelimiter']), + DateRange::create($start, $end)->toDateString() + ); + $this->assertEquals($start->toDate($methodParams['internalDelimiter']), DateRange::create($start)->toDateString()); + $this->assertEquals($end->toDate($methodParams['internalDelimiter']), DateRange::create(null, $end)->toDateString()); + } + + public function testToString() + { + $start = Date::create('2007-01-01'); + $end = Date::create('2007-12-31'); + $methodParams = [ + 'delimiter' => ' - ', + ]; + + $dateRangeReflection = new \ReflectionClass(DateRange::class); + $toDateStringMethod = $dateRangeReflection->getMethod('toString'); + $this->assertCount($toDateStringMethod->getNumberOfParameters(), $methodParams); + foreach ($toDateStringMethod->getParameters() as $param) { + $this->assertArrayHasKey($param->getName(), $methodParams); + $this->assertEquals($methodParams[$param->getName()], $param->getDefaultValue()); + } + + $this->assertNull(DateRange::create()->toString()); + $this->assertEquals( + $start->toDate() . $methodParams['delimiter'] . $end->toDate(), + DateRange::create($start, $end)->toDateString() + ); + $this->assertEquals($start->toDate(), DateRange::create($start)->toDateString()); + $this->assertEquals($end->toDate(), DateRange::create(null, $end)->toDateString()); + } + + public function testOverlaps() + { + $dataRange = DateRange::create()->lazySet(Date::create('2007-01-01'), Date::create('2007-12-31')); + + $this->assertTrue($dataRange->overlaps(DateRange::create())); + + $this->assertTrue($dataRange->overlaps(DateRange::create()->setStart(Date::create('2006-12-31')))); + $this->assertFalse( + $dataRange + ->overlaps( + DateRange::create() + ->setStart(Date::create('2006-12-01')) + ->setEnd(Date::create('2006-12-31')) + ) + ); + $this->assertFalse($dataRange->overlaps(DateRange::create()->setEnd(Date::create('2006-12-31')))); + + $this->assertTrue( + $dataRange + ->overlaps( + DateRange::create() + ->setStart(Date::create('2006-01-01')) + ->setEnd(Date::create('2007-01-01')) + ) + ); + $this->assertTrue( + $dataRange + ->overlaps( + DateRange::create() + ->setStart(Date::create('2007-12-31')) + ->setEnd(Date::create('2008-12-31')) + ) + ); + $this->assertTrue( + $dataRange + ->overlaps( + DateRange::create() + ->setStart(Date::create('2007-01-01')) + ->setEnd(Date::create('2007-12-31')) + ) + ); + $this->assertTrue($dataRange->overlaps(DateRange::create()->setStart(Date::create('2007-12-31')))); + $this->assertTrue($dataRange->overlaps(DateRange::create()->setEnd(Date::create('2007-01-01')))); + $this->assertTrue( + $dataRange + ->overlaps( + DateRange::create() + ->setStart(Date::create('2007-02-01')) + ->setEnd(Date::create('2007-03-01')) + ) + ); + $this->assertTrue($dataRange->overlaps(DateRange::create()->setStart(Date::create('2007-06-12')))); + $this->assertTrue($dataRange->overlaps(DateRange::create()->setEnd(Date::create('2007-06-01')))); + + $this->assertFalse($dataRange->overlaps(DateRange::create()->setStart(Date::create('2008-01-01')))); + $this->assertFalse( + $dataRange + ->overlaps( + DateRange::create() + ->setStart(Date::create('2008-01-01')) + ->setEnd(Date::create('2008-12-31')) + ) + ); + $this->assertTrue( + $dataRange + ->overlaps( + DateRange::create() + ->setEnd(Date::create('2006-12-31')) + ->setEnd(Date::create('2008-01-01')) + ) + ); + $this->assertTrue( + $dataRange->overlaps( + DateRange::create()->lazySet(Date::create('2007-05-14'), Date::create('2008-03-29')) + ) + ); + $this->assertTrue( + $dataRange->overlaps( + DateRange::create()->lazySet(Date::create('2006-05-14'), Date::create('2007-03-29')) + ) + ); + + $this->assertTrue(DateRange::create()->overlaps(DateRange::create())); + $this->assertTrue( + DateRange::create() + ->overlaps( + DateRange::create()->lazySet(Date::create('2007-03-28'), Date::create('2008-03-27')) + ) + ); + } + + public function testContains() + { + $this->assertTrue(DateRange::create()->contains(Date::create('2007-06-01'))); + + $dataRange = DateRange::create()->lazySet(Date::create('2007-01-01'), Date::create('2007-12-31')); + $this->assertTrue($dataRange->contains(Date::create('2007-06-01'))); + $this->assertTrue($dataRange->contains(Date::create('2007-01-01'))); + $this->assertTrue($dataRange->contains(Date::create('2007-12-31'))); + $this->assertFalse($dataRange->contains(Date::create('2006-06-01'))); + $this->assertFalse($dataRange->contains(Date::create('2008-06-01'))); + + $dataRange = DateRange::create()->setStart(Date::create('2007-01-01')); + $this->assertTrue($dataRange->contains(Date::create('2007-06-01'))); + $this->assertTrue($dataRange->contains(Date::create('2007-01-01'))); + $this->assertTrue($dataRange->contains(Date::create('2007-12-31'))); + $this->assertFalse($dataRange->contains(Date::create('2006-06-01'))); + + $dataRange = DateRange::create()->setEnd(Date::create('2007-12-31')); + $this->assertTrue($dataRange->contains(Date::create('2007-06-01'))); + $this->assertTrue($dataRange->contains(Date::create('2007-12-31'))); + $this->assertFalse($dataRange->contains(Date::create('2008-06-01'))); + } + public function testSplit() { $start = new Date('2007-03-26'); @@ -21,39 +817,1075 @@ public function testSplit() $dates = $range->split(); - $this->assertEquals(count($dates), 21); + $this->assertCount(21, $dates); $this->assertEquals(reset($dates), $start); $this->assertEquals(end($dates), $end); + + try { + DateRange::create()->split(); + $this->fail('expected WrongArgumentException exception'); + } catch (\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + try { + DateRange::create()->setStart(Date::create('2007-01-01'))->split(); + $this->fail('expected WrongArgumentException exception'); + } catch (\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + try { + DateRange::create()->setEnd(Date::create('2006-12-31'))->split(); + $this->fail('expected WrongArgumentException exception'); + } catch (\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + + $start = $end = Date::create('2006-01-01'); + $ranges = DateRange::create($start, $end)->split(); + $this->assertCount(1, $ranges); + $rangeDate = current($ranges); + $this->assertEquals($rangeDate, $start); + $this->assertEquals($rangeDate, $end); } - public function testOverlaps() + public function testIsNeighbour() { - $this->assertTrue( - DateRange::create()->lazySet( - Date::create('2007-03-28'), - Date::create('2008-03-27') - )-> - overlaps( - DateRange::create()->lazySet( - Date::create('2007-05-14'), - Date::create('2008-03-29') - ) - ) - ); + $dateRangeEmpty = DateRange::create(); + $dateRange = DateRange::create(Date::create('2007-01-01'), Date::create('2007-12-31')); + + try { + $dateRangeEmpty->isNeighbour($dateRangeEmpty); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + + try { + $dateRangeEmpty->isNeighbour($dateRange); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + try { + $dateRangeEmpty->isNeighbour(DateRange::create()->setStart(Date::create('2007-01-01'))); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + try { + $dateRangeEmpty->isNeighbour(DateRange::create()->setEnd(Date::create('2007-12-31'))); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + + try { + $dateRange->isNeighbour($dateRangeEmpty); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + try { + $dateRange->isNeighbour(DateRange::create()->setStart(Date::create('2007-01-01'))); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + try { + $dateRange->isNeighbour(DateRange::create()->setEnd(Date::create('2007-12-31'))); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + + try { + DateRange::create() + ->setStart(Date::create('2007-01-01')) + ->isNeighbour($dateRange); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + try { + DateRange::create() + ->setStart(Date::create('2007-01-01')) + ->isNeighbour($dateRangeEmpty); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + try { + DateRange::create() + ->setStart(Date::create('2007-01-01')) + ->isNeighbour(DateRange::create()->setStart(Date::create('2007-01-01'))); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + try { + DateRange::create() + ->setStart(Date::create('2007-01-01')) + ->isNeighbour(DateRange::create()->setEnd(Date::create('2007-12-31'))); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + + try { + DateRange::create() + ->setEnd(Date::create('2007-12-31')) + ->isNeighbour($dateRange); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + try { + DateRange::create() + ->setEnd(Date::create('2007-12-31')) + ->isNeighbour($dateRangeEmpty); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + try { + DateRange::create() + ->setEnd(Date::create('2007-12-31')) + ->isNeighbour(DateRange::create()->setStart(Date::create('2007-01-01'))); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + try { + DateRange::create() + ->setEnd(Date::create('2007-12-31')) + ->isNeighbour(DateRange::create()->setEnd(Date::create('2007-12-31'))); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } $this->assertFalse( - DateRange::create()->lazySet( - Date::create('2007-03-28'), - Date::create('2008-03-27') - )-> - overlaps( - DateRange::create()->lazySet( - Date::create('2005-05-14'), - Date::create('2006-03-29') - ) - ) + $dateRange + ->isNeighbour(DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-01'))) + ); + $this->assertFalse( + $dateRange + ->isNeighbour(DateRange::create(Date::create('2008-02-01'), Date::create('2008-12-31'))) + ); + $this->assertTrue( + $dateRange + ->isNeighbour(DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31'))) + ); + $this->assertTrue( + $dateRange + ->isNeighbour(DateRange::create(Date::create('2008-01-01'), Date::create('2008-12-31'))) + ); + $this->assertTrue( + $dateRange + ->isNeighbour(DateRange::create(Date::create('2007-12-31'), Date::create('2008-12-31'))) ); + $this->assertTrue( + $dateRange + ->isNeighbour(DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31'))) + ); + $this->assertTrue( + $dateRange + ->isNeighbour(DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01'))) + ); + $this->assertTrue( + $dateRange + ->isNeighbour(DateRange::create(Date::create('2006-01-01'), Date::create('2007-06-01'))) + ); + $this->assertTrue( + $dateRange + ->isNeighbour(DateRange::create(Date::create('2007-06-01'), Date::create('2008-06-01'))) + ); + $this->assertTrue( + $dateRange + ->isNeighbour(DateRange::create(Date::create('2007-06-01'), Date::create('2007-07-01'))) + ); + } + + public function testIsOpen() + { + $this->assertTrue(DateRange::create()->isOpen()); + $this->assertTrue(DateRange::create(Date::create('2007-06-01'))->isOpen()); + $this->assertTrue(DateRange::create()->setEnd(Date::create('2007-06-01'))->isOpen()); + $this->assertFalse(DateRange::create(Date::create('2007-06-01'), Date::create('2007-06-01'))->isOpen()); + } + + public function testEnlarge() + { + $dateRange = DateRange::create()->enlarge(DateRange::create()); + $this->assertNull($dateRange->getStart()); + $this->assertNull($dateRange->getEnd()); + + $dateRange = DateRange::create()->enlarge(DateRange::create(Date::create('2007-01-01'))); + $this->assertNull($dateRange->getStart()); + $this->assertNull($dateRange->getEnd()); + $dateRange = DateRange::create()->enlarge(DateRange::create(null, Date::create('2007-01-01'))); + $this->assertNull($dateRange->getStart()); + $this->assertNull($dateRange->getEnd()); + $dateRange = DateRange::create()->enlarge(DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01'))); + $this->assertNull($dateRange->getStart()); + $this->assertNull($dateRange->getEnd()); + + $dateRange = DateRange::create(Date::create('2007-01-01'))->enlarge(DateRange::create()); + $this->assertNull($dateRange->getStart()); + $this->assertNull($dateRange->getEnd()); + $dateRange = DateRange::create(Date::create('2007-01-01')) + ->enlarge(DateRange::create(Date::create('2006-01-01'))); + $this->assertEquals($dateRange->getStart()->toDate(), Date::create('2006-01-01')->toDate()); + $this->assertNull($dateRange->getEnd()); + $dateRange = DateRange::create(Date::create('2007-01-01')) + ->enlarge(DateRange::create(Date::create('2007-01-01'))); + $this->assertEquals($dateRange->getStart()->toDate(), Date::create('2007-01-01')->toDate()); + $this->assertNull($dateRange->getEnd()); + $dateRange = DateRange::create(Date::create('2007-01-01')) + ->enlarge(DateRange::create(Date::create('2008-01-01'))); + $this->assertEquals($dateRange->getStart()->toDate(), Date::create('2007-01-01')->toDate()); + $this->assertNull($dateRange->getEnd()); + $dateRange = DateRange::create(Date::create('2007-01-01')) + ->enlarge(DateRange::create(null, Date::create('2006-01-01'))); + $this->assertNull($dateRange->getStart()); + $this->assertNull($dateRange->getEnd()); + $dateRange = DateRange::create(Date::create('2007-01-01')) + ->enlarge(DateRange::create(null, Date::create('2007-01-01'))); + $this->assertNull($dateRange->getStart()); + $this->assertNull($dateRange->getEnd()); + $dateRange = DateRange::create(Date::create('2007-01-01')) + ->enlarge(DateRange::create(null, Date::create('2008-01-01'))); + $this->assertNull($dateRange->getStart()); + $this->assertNull($dateRange->getEnd()); + $dateRange = DateRange::create(Date::create('2007-01-01')) + ->enlarge(DateRange::create(Date::create('2006-01-01'), Date::create('2006-06-01'))); + $this->assertEquals($dateRange->getStart()->toDate(), Date::create('2006-01-01')->toDate()); + $this->assertNull($dateRange->getEnd()); + $dateRange = DateRange::create(Date::create('2007-01-01')) + ->enlarge(DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01'))); + $this->assertEquals($dateRange->getStart()->toDate(), Date::create('2006-01-01')->toDate()); + $this->assertNull($dateRange->getEnd()); + $dateRange = DateRange::create(Date::create('2007-01-01')) + ->enlarge(DateRange::create(Date::create('2006-01-01'), Date::create('2008-01-01'))); + $this->assertEquals($dateRange->getStart()->toDate(), Date::create('2006-01-01')->toDate()); + $this->assertNull($dateRange->getEnd()); + $dateRange = DateRange::create(Date::create('2007-01-01')) + ->enlarge(DateRange::create(Date::create('2007-01-01'), Date::create('2008-01-01'))); + $this->assertEquals($dateRange->getStart()->toDate(), Date::create('2007-01-01')->toDate()); + $this->assertNull($dateRange->getEnd()); + $dateRange = DateRange::create(Date::create('2007-01-01')) + ->enlarge(DateRange::create(Date::create('2008-01-01'), Date::create('2008-06-01'))); + $this->assertEquals($dateRange->getStart()->toDate(), Date::create('2007-01-01')->toDate()); + $this->assertNull($dateRange->getEnd()); + + $dateRange = DateRange::create(null, Date::create('2007-01-01'))->enlarge(DateRange::create()); + $this->assertNull($dateRange->getStart()); + $this->assertNull($dateRange->getEnd()); + $dateRange = DateRange::create(null, Date::create('2007-01-01')) + ->enlarge(DateRange::create(Date::create('2006-01-01'))); + $this->assertNull($dateRange->getStart()); + $this->assertNull($dateRange->getEnd()); + $dateRange = DateRange::create(null, Date::create('2007-01-01')) + ->enlarge(DateRange::create(Date::create('2007-01-01'))); + $this->assertNull($dateRange->getStart()); + $this->assertNull($dateRange->getEnd()); + $dateRange = DateRange::create(null, Date::create('2007-01-01')) + ->enlarge(DateRange::create(Date::create('2008-01-01'))); + $this->assertNull($dateRange->getStart()); + $this->assertNull($dateRange->getEnd()); + $dateRange = DateRange::create(null, Date::create('2007-01-01')) + ->enlarge(DateRange::create(null, Date::create('2006-01-01'))); + $this->assertNull($dateRange->getStart()); + $this->assertEquals($dateRange->getEnd()->toDate(), Date::create('2007-01-01')->toDate()); + $dateRange = DateRange::create(null, Date::create('2007-01-01')) + ->enlarge(DateRange::create(null, Date::create('2007-01-01'))); + $this->assertNull($dateRange->getStart()); + $this->assertEquals($dateRange->getEnd()->toDate(), Date::create('2007-01-01')->toDate()); + $dateRange = DateRange::create(null, Date::create('2007-01-01')) + ->enlarge(DateRange::create(null, Date::create('2008-01-01'))); + $this->assertNull($dateRange->getStart()); + $this->assertEquals($dateRange->getEnd()->toDate(), Date::create('2008-01-01')->toDate()); + $dateRange = DateRange::create(null, Date::create('2007-01-01')) + ->enlarge(DateRange::create(Date::create('2006-01-01'), Date::create('2006-06-01'))); + $this->assertNull($dateRange->getStart()); + $this->assertEquals($dateRange->getEnd()->toDate(), Date::create('2007-01-01')->toDate()); + $dateRange = DateRange::create(null, Date::create('2007-01-01')) + ->enlarge(DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01'))); + $this->assertNull($dateRange->getStart()); + $this->assertEquals($dateRange->getEnd()->toDate(), Date::create('2007-01-01')->toDate()); + $dateRange = DateRange::create(null, Date::create('2007-01-01')) + ->enlarge(DateRange::create(Date::create('2006-01-01'), Date::create('2008-01-01'))); + $this->assertNull($dateRange->getStart()); + $this->assertEquals($dateRange->getEnd()->toDate(), Date::create('2008-01-01')->toDate()); + $dateRange = DateRange::create(null, Date::create('2007-01-01')) + ->enlarge(DateRange::create(Date::create('2007-01-01'), Date::create('2008-01-01'))); + $this->assertNull($dateRange->getStart()); + $this->assertEquals($dateRange->getEnd()->toDate(), Date::create('2008-01-01')->toDate()); + $dateRange = DateRange::create(null, Date::create('2007-01-01')) + ->enlarge(DateRange::create(Date::create('2008-01-01'), Date::create('2008-06-01'))); + $this->assertNull($dateRange->getStart()); + $this->assertEquals($dateRange->getEnd()->toDate(), Date::create('2008-06-01')->toDate()); + + $dateRange = DateRange::create(Date::create('2007-01-01'), Date::create('2007-12-31')) + ->enlarge(DateRange::create()); + $this->assertNull($dateRange->getStart()); + $this->assertNull($dateRange->getEnd()); + $dateRange = DateRange::create(Date::create('2007-01-01'), Date::create('2007-12-31')) + ->enlarge(DateRange::create(Date::create('2006-01-01'))); + $this->assertEquals($dateRange->getStart()->toDate(), Date::create('2006-01-01')->toDate()); + $this->assertNull($dateRange->getEnd()); + $dateRange = DateRange::create(Date::create('2007-01-01'), Date::create('2007-12-31')) + ->enlarge(DateRange::create(Date::create('2007-01-01'))); + $this->assertEquals($dateRange->getStart()->toDate(), Date::create('2007-01-01')->toDate()); + $this->assertNull($dateRange->getEnd()); + $dateRange = DateRange::create(Date::create('2007-01-01'), Date::create('2007-12-31')) + ->enlarge(DateRange::create(Date::create('2007-06-01'))); + $this->assertEquals($dateRange->getStart()->toDate(), Date::create('2007-01-01')->toDate()); + $this->assertNull($dateRange->getEnd()); + $dateRange = DateRange::create(Date::create('2007-01-01'), Date::create('2007-12-31')) + ->enlarge(DateRange::create(Date::create('2007-12-31'))); + $this->assertEquals($dateRange->getStart()->toDate(), Date::create('2007-01-01')->toDate()); + $this->assertNull($dateRange->getEnd()); + $dateRange = DateRange::create(Date::create('2007-01-01'), Date::create('2007-12-31')) + ->enlarge(DateRange::create(Date::create('2008-01-01'))); + $this->assertEquals($dateRange->getStart()->toDate(), Date::create('2007-01-01')->toDate()); + $this->assertNull($dateRange->getEnd()); + $dateRange = DateRange::create(Date::create('2007-01-01'), Date::create('2007-12-31')) + ->enlarge(DateRange::create(null, Date::create('2006-01-01'))); + $this->assertNull($dateRange->getStart()); + $this->assertEquals($dateRange->getEnd()->toDate(), Date::create('2007-12-31')->toDate()); + $dateRange = DateRange::create(Date::create('2007-01-01'), Date::create('2007-12-31')) + ->enlarge(DateRange::create(null, Date::create('2007-01-01'))); + $this->assertNull($dateRange->getStart()); + $this->assertEquals($dateRange->getEnd()->toDate(), Date::create('2007-12-31')->toDate()); + $dateRange = DateRange::create(Date::create('2007-01-01'), Date::create('2007-12-31')) + ->enlarge(DateRange::create(null, Date::create('2007-06-01'))); + $this->assertNull($dateRange->getStart()); + $this->assertEquals($dateRange->getEnd()->toDate(), Date::create('2007-12-31')->toDate()); + $dateRange = DateRange::create(Date::create('2007-01-01'), Date::create('2007-12-31')) + ->enlarge(DateRange::create(null, Date::create('2007-12-31'))); + $this->assertNull($dateRange->getStart()); + $this->assertEquals($dateRange->getEnd()->toDate(), Date::create('2007-12-31')->toDate()); + $dateRange = DateRange::create(Date::create('2007-01-01'), Date::create('2007-12-31')) + ->enlarge(DateRange::create(null, Date::create('2008-12-31'))); + $this->assertNull($dateRange->getStart()); + $this->assertEquals($dateRange->getEnd()->toDate(), Date::create('2008-12-31')->toDate()); + $dateRange = DateRange::create(Date::create('2007-01-01'), Date::create('2007-12-31')) + ->enlarge(DateRange::create(Date::create('2006-01-01'), Date::create('2006-06-01'))); + $this->assertEquals($dateRange->getStart()->toDate(), Date::create('2006-01-01')->toDate()); + $this->assertEquals($dateRange->getEnd()->toDate(), Date::create('2007-12-31')->toDate()); + $dateRange = DateRange::create(Date::create('2007-01-01'), Date::create('2007-12-31')) + ->enlarge(DateRange::create(Date::create('2006-01-01'), Date::create('2007-01-01'))); + $this->assertEquals($dateRange->getStart()->toDate(), Date::create('2006-01-01')->toDate()); + $this->assertEquals($dateRange->getEnd()->toDate(), Date::create('2007-12-31')->toDate()); + $dateRange = DateRange::create(Date::create('2007-01-01'), Date::create('2007-12-31')) + ->enlarge(DateRange::create(Date::create('2006-01-01'), Date::create('2007-06-01'))); + $this->assertEquals($dateRange->getStart()->toDate(), Date::create('2006-01-01')->toDate()); + $this->assertEquals($dateRange->getEnd()->toDate(), Date::create('2007-12-31')->toDate()); + $dateRange = DateRange::create(Date::create('2007-01-01'), Date::create('2007-12-31')) + ->enlarge(DateRange::create(Date::create('2007-01-01'), Date::create('2007-06-01'))); + $this->assertEquals($dateRange->getStart()->toDate(), Date::create('2007-01-01')->toDate()); + $this->assertEquals($dateRange->getEnd()->toDate(), Date::create('2007-12-31')->toDate()); + $dateRange = DateRange::create(Date::create('2007-01-01'), Date::create('2007-12-31')) + ->enlarge(DateRange::create(Date::create('2007-01-01'), Date::create('2007-12-31'))); + $this->assertEquals($dateRange->getStart()->toDate(), Date::create('2007-01-01')->toDate()); + $this->assertEquals($dateRange->getEnd()->toDate(), Date::create('2007-12-31')->toDate()); + $dateRange = DateRange::create(Date::create('2007-01-01'), Date::create('2007-12-31')) + ->enlarge(DateRange::create(Date::create('2007-02-01'), Date::create('2007-10-01'))); + $this->assertEquals($dateRange->getStart()->toDate(), Date::create('2007-01-01')->toDate()); + $this->assertEquals($dateRange->getEnd()->toDate(), Date::create('2007-12-31')->toDate()); + $dateRange = DateRange::create(Date::create('2007-01-01'), Date::create('2007-12-31')) + ->enlarge(DateRange::create(Date::create('2007-02-01'), Date::create('2007-12-31'))); + $this->assertEquals($dateRange->getStart()->toDate(), Date::create('2007-01-01')->toDate()); + $this->assertEquals($dateRange->getEnd()->toDate(), Date::create('2007-12-31')->toDate()); + $dateRange = DateRange::create(Date::create('2007-01-01'), Date::create('2007-12-31')) + ->enlarge(DateRange::create(Date::create('2007-02-01'), Date::create('2008-12-31'))); + $this->assertEquals($dateRange->getStart()->toDate(), Date::create('2007-01-01')->toDate()); + $this->assertEquals($dateRange->getEnd()->toDate(), Date::create('2008-12-31')->toDate()); + $dateRange = DateRange::create(Date::create('2007-01-01'), Date::create('2007-12-31')) + ->enlarge(DateRange::create(Date::create('2007-12-31'), Date::create('2008-12-31'))); + $this->assertEquals($dateRange->getStart()->toDate(), Date::create('2007-01-01')->toDate()); + $this->assertEquals($dateRange->getEnd()->toDate(), Date::create('2008-12-31')->toDate()); + $dateRange = DateRange::create(Date::create('2007-01-01'), Date::create('2007-12-31')) + ->enlarge(DateRange::create(Date::create('2008-06-01'), Date::create('2008-12-31'))); + $this->assertEquals($dateRange->getStart()->toDate(), Date::create('2007-01-01')->toDate()); + $this->assertEquals($dateRange->getEnd()->toDate(), Date::create('2008-12-31')->toDate()); + } + + public function testClip() + { + $clip = DateRange::create()->clip(DateRange::create()); + $this->assertInstanceOf(DateRange::class, $clip); + $this->assertNull($clip->getStart()); + $this->assertNull($clip->getEnd()); + + $clip = DateRange::create(null, Date::create('2006-01-01')) + ->clip(DateRange::create()); + $this->assertNull($clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(null, Date::create('2006-01-01')) + ->clip(DateRange::create(null, Date::create('2005-01-01'))); + $this->assertNull($clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2005-01-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(null, Date::create('2006-01-01')) + ->clip(DateRange::create(null, Date::create('2006-01-01'))); + $this->assertNull($clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(null, Date::create('2006-01-01')) + ->clip(DateRange::create(null, Date::create('2007-01-01'))); + $this->assertNull($clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(null, Date::create('2006-01-01')) + ->clip(DateRange::create(Date::create('2005-01-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2005-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(null, Date::create('2006-01-01')) + ->clip(DateRange::create(Date::create('2006-01-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getEnd()->toDate()); + try { + DateRange::create(null, Date::create('2006-01-01')) + ->clip(DateRange::create(Date::create('2007-01-01'))); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + $clip = DateRange::create(null, Date::create('2006-01-01')) + ->clip(DateRange::create(Date::create('2005-01-01'), Date::create('2005-02-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2005-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2005-02-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(null, Date::create('2006-01-01')) + ->clip(DateRange::create(Date::create('2005-06-01'), Date::create('2006-01-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2005-06-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(null, Date::create('2006-01-01')) + ->clip(DateRange::create(Date::create('2005-06-01'), Date::create('2006-06-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2005-06-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(null, Date::create('2006-01-01')) + ->clip(DateRange::create(Date::create('2006-01-01'), Date::create('2006-06-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getEnd()->toDate()); + try { + DateRange::create(null, Date::create('2006-01-01')) + ->clip(DateRange::create(Date::create('2006-05-01'), Date::create('2006-06-01'))); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + + $clip = DateRange::create(Date::create('2006-01-01')) + ->clip(DateRange::create()); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertNull($clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + try { + DateRange::create(Date::create('2006-01-01')) + ->clip(DateRange::create(null, Date::create('2005-06-01'))); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + $clip = DateRange::create(Date::create('2006-01-01')) + ->clip(DateRange::create(null, Date::create('2006-01-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01')) + ->clip(DateRange::create(null, Date::create('2007-01-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2007-01-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01')) + ->clip(DateRange::create(Date::create('2005-01-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertNull($clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01')) + ->clip(DateRange::create(Date::create('2006-01-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertNull($clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01')) + ->clip(DateRange::create(Date::create('2007-01-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertNull($clip->getEnd()); + $this->assertEquals(Date::create('2007-01-01')->toDate(), $clip->getStart()->toDate()); + try { + DateRange::create(Date::create('2006-01-01')) + ->clip(DateRange::create(Date::create('2005-01-01'), Date::create('2005-06-01'))); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + $clip = DateRange::create(Date::create('2006-01-01')) + ->clip(DateRange::create(Date::create('2005-01-01'), Date::create('2006-01-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01')) + ->clip(DateRange::create(Date::create('2005-06-01'), Date::create('2006-06-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-06-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01')) + ->clip(DateRange::create(Date::create('2006-01-01'), Date::create('2006-06-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-06-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01')) + ->clip(DateRange::create(Date::create('2007-01-01'), Date::create('2007-06-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2007-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2007-06-01')->toDate(), $clip->getEnd()->toDate()); + + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->clip(DateRange::create()); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getEnd()->toDate()); + try { + DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->clip(DateRange::create(null, Date::create('2005-06-01'))); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->clip(DateRange::create(null, Date::create('2006-01-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->clip(DateRange::create(null, Date::create('2006-06-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-06-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->clip(DateRange::create(null, Date::create('2006-12-31'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->clip(DateRange::create(null, Date::create('2007-12-31'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->clip(DateRange::create(Date::create('2005-01-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->clip(DateRange::create(Date::create('2006-06-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-06-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->clip(DateRange::create(Date::create('2006-12-31'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getEnd()->toDate()); + try { + DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->clip(DateRange::create(Date::create('2007-06-01'))); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->clip(DateRange::create(Date::create('2005-01-01'), Date::create('2007-12-31'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getEnd()->toDate()); + try { + DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->clip(DateRange::create(Date::create('2005-01-01'), Date::create('2005-06-01'))); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->clip(DateRange::create(Date::create('2005-01-01'), Date::create('2006-01-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->clip(DateRange::create(Date::create('2005-01-01'), Date::create('2006-06-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-06-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->clip(DateRange::create(Date::create('2005-01-01'), Date::create('2006-12-31'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->clip(DateRange::create(Date::create('2006-01-01'), Date::create('2006-06-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-06-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->clip(DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->clip(DateRange::create(Date::create('2006-01-01'), Date::create('2007-12-31'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->clip(DateRange::create(Date::create('2006-06-01'), Date::create('2006-07-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-06-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-07-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->clip(DateRange::create(Date::create('2006-06-01'), Date::create('2006-12-31'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-06-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->clip(DateRange::create(Date::create('2006-06-01'), Date::create('2007-12-31'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-06-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->clip(DateRange::create(Date::create('2006-12-31'), Date::create('2007-12-31'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getEnd()->toDate()); + try { + DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->clip(DateRange::create(Date::create('2007-06-01'), Date::create('2007-12-31'))); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + } + + public function testLightCopyOnClip() + { + $clip = DateRange::create()->lightCopyOnClip(DateRange::create()); + $this->assertInstanceOf(DateRange::class, $clip); + $this->assertNull($clip->getStart()); + $this->assertNull($clip->getEnd()); + + $clip = DateRange::create(null, Date::create('2006-01-01')) + ->lightCopyOnClip(DateRange::create()); + $this->assertNull($clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(null, Date::create('2006-01-01')) + ->lightCopyOnClip(DateRange::create(null, Date::create('2005-01-01'))); + $this->assertNull($clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2005-01-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(null, Date::create('2006-01-01')) + ->lightCopyOnClip(DateRange::create(null, Date::create('2006-01-01'))); + $this->assertNull($clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(null, Date::create('2006-01-01')) + ->lightCopyOnClip(DateRange::create(null, Date::create('2007-01-01'))); + $this->assertNull($clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(null, Date::create('2006-01-01')) + ->lightCopyOnClip(DateRange::create(Date::create('2005-01-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2005-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(null, Date::create('2006-01-01')) + ->lightCopyOnClip(DateRange::create(Date::create('2006-01-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getEnd()->toDate()); + try { + $clip = DateRange::create(null, Date::create('2006-01-01')) + ->lightCopyOnClip(DateRange::create(Date::create('2007-01-01'))); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + $clip = DateRange::create(null, Date::create('2006-01-01')) + ->lightCopyOnClip(DateRange::create(Date::create('2005-01-01'), Date::create('2005-02-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2005-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2005-02-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(null, Date::create('2006-01-01')) + ->lightCopyOnClip(DateRange::create(Date::create('2005-06-01'), Date::create('2006-01-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2005-06-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(null, Date::create('2006-01-01')) + ->lightCopyOnClip(DateRange::create(Date::create('2005-06-01'), Date::create('2006-06-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2005-06-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(null, Date::create('2006-01-01')) + ->lightCopyOnClip(DateRange::create(Date::create('2006-01-01'), Date::create('2006-06-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getEnd()->toDate()); + try { + DateRange::create(null, Date::create('2006-01-01')) + ->lightCopyOnClip(DateRange::create(Date::create('2006-05-01'), Date::create('2006-06-01'))); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + + $clip = DateRange::create(Date::create('2006-01-01')) + ->lightCopyOnClip(DateRange::create()); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertNull($clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + try { + DateRange::create(Date::create('2006-01-01')) + ->lightCopyOnClip(DateRange::create(null, Date::create('2005-06-01'))); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + $clip = DateRange::create(Date::create('2006-01-01')) + ->lightCopyOnClip(DateRange::create(null, Date::create('2006-01-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01')) + ->lightCopyOnClip(DateRange::create(null, Date::create('2007-01-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2007-01-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01')) + ->lightCopyOnClip(DateRange::create(Date::create('2005-01-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertNull($clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01')) + ->lightCopyOnClip(DateRange::create(Date::create('2006-01-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertNull($clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01')) + ->lightCopyOnClip(DateRange::create(Date::create('2007-01-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertNull($clip->getEnd()); + $this->assertEquals(Date::create('2007-01-01')->toDate(), $clip->getStart()->toDate()); + try { + DateRange::create(Date::create('2006-01-01')) + ->lightCopyOnClip(DateRange::create(Date::create('2005-01-01'), Date::create('2005-06-01'))); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + $clip = DateRange::create(Date::create('2006-01-01')) + ->lightCopyOnClip(DateRange::create(Date::create('2005-01-01'), Date::create('2006-01-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01')) + ->lightCopyOnClip(DateRange::create(Date::create('2005-06-01'), Date::create('2006-06-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-06-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01')) + ->lightCopyOnClip(DateRange::create(Date::create('2006-01-01'), Date::create('2006-06-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-06-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01')) + ->lightCopyOnClip(DateRange::create(Date::create('2007-01-01'), Date::create('2007-06-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2007-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2007-06-01')->toDate(), $clip->getEnd()->toDate()); + + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->lightCopyOnClip(DateRange::create()); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getEnd()->toDate()); + try { + DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->lightCopyOnClip(DateRange::create(null, Date::create('2005-06-01'))); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->lightCopyOnClip(DateRange::create(null, Date::create('2006-01-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->lightCopyOnClip(DateRange::create(null, Date::create('2006-06-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-06-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->lightCopyOnClip(DateRange::create(null, Date::create('2006-12-31'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->lightCopyOnClip(DateRange::create(null, Date::create('2007-12-31'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->lightCopyOnClip(DateRange::create(Date::create('2005-01-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->lightCopyOnClip(DateRange::create(Date::create('2006-06-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-06-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->lightCopyOnClip(DateRange::create(Date::create('2006-12-31'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getEnd()->toDate()); + try { + DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->lightCopyOnClip(DateRange::create(Date::create('2007-06-01'))); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->lightCopyOnClip(DateRange::create(Date::create('2005-01-01'), Date::create('2007-12-31'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getEnd()->toDate()); + try { + DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->lightCopyOnClip(DateRange::create(Date::create('2005-01-01'), Date::create('2005-06-01'))); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->lightCopyOnClip(DateRange::create(Date::create('2005-01-01'), Date::create('2006-01-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->lightCopyOnClip(DateRange::create(Date::create('2005-01-01'), Date::create('2006-06-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-06-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->lightCopyOnClip(DateRange::create(Date::create('2005-01-01'), Date::create('2006-12-31'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->lightCopyOnClip(DateRange::create(Date::create('2006-01-01'), Date::create('2006-06-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-06-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->lightCopyOnClip(DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->lightCopyOnClip(DateRange::create(Date::create('2006-01-01'), Date::create('2007-12-31'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-01-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->lightCopyOnClip(DateRange::create(Date::create('2006-06-01'), Date::create('2006-07-01'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-06-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-07-01')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->lightCopyOnClip(DateRange::create(Date::create('2006-06-01'), Date::create('2006-12-31'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-06-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->lightCopyOnClip(DateRange::create(Date::create('2006-06-01'), Date::create('2007-12-31'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-06-01')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getEnd()->toDate()); + $clip = DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->lightCopyOnClip(DateRange::create(Date::create('2006-12-31'), Date::create('2007-12-31'))); + $this->assertInstanceOf(Date::class, $clip->getStart()); + $this->assertInstanceOf(Date::class, $clip->getEnd()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getStart()->toDate()); + $this->assertEquals(Date::create('2006-12-31')->toDate(), $clip->getEnd()->toDate()); + try { + DateRange::create(Date::create('2006-01-01'), Date::create('2006-12-31')) + ->lightCopyOnClip(DateRange::create(Date::create('2007-06-01'), Date::create('2007-12-31'))); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + } + + public function testGetStartStamp() + { + $date = Date::makeToday(); + $dateNew = $date->spawn("+1 week"); + $dateRange = DateRange::create(); + $this->assertNull($dateRange->getStartStamp()); + + $dateRange->setStart($date); + $this->assertIsInt($dateRange->getStartStamp()); + $this->assertEquals($date->getDayStartStamp(), $dateRange->getStartStamp()); + $dateRange->setStart($dateNew); + $this->assertIsInt($dateRange->getStartStamp()); + $this->assertEquals($dateNew->getDayStartStamp(), $dateRange->getStartStamp()); + $dateRange->dropStart(); + $this->assertNull($dateRange->getStartStamp()); + } + + public function testGetEndStamp() + { + $date = Date::makeToday(); + $dateNew = $date->spawn("+1 week"); + $dateRange = DateRange::create(); + $this->assertNull($dateRange->getEndStamp()); + + $dateRange->setEnd($date); + $this->assertIsInt($dateRange->getEndStamp()); + $this->assertEquals($date->getDayEndStamp(), $dateRange->getEndStamp()); + $dateRange->setEnd($dateNew); + $this->assertIsInt($dateRange->getEndStamp()); + $this->assertEquals($dateNew->getDayEndStamp(), $dateRange->getEndStamp()); + $dateRange->dropEnd(); + $this->assertNull($dateRange->getEndStamp()); + } + + public function testIsOneDay() + { + $this->assertFalse(DateRange::create()->isOneDay()); + $this->assertFalse(DateRange::create(Date::makeToday())->isOneDay()); + $this->assertFalse(DateRange::create(null, Date::makeToday())->isOneDay()); + $this->assertFalse(DateRange::create(Date::makeToday(), Date::create("+1 week"))->isOneDay()); + $this->assertTrue(DateRange::create(Date::create("+1 week"), Date::create("+1 week"))->isOneDay()); + } + + public function testToTimestampRange() + { + $tsRange = DateRange::create()->toTimestampRange(); + $this->assertInstanceOf(TimestampRange::class, $tsRange); + $this->assertNull($tsRange->getStart()); + $this->assertNull($tsRange->getEnd()); + + $start = Date::makeToday(); + $end = $start->spawn("+1 week"); + $tsRange = DateRange::create($start)->toTimestampRange(); + $this->assertInstanceOf(Timestamp::class, $tsRange->getStart()); + $this->assertNull($tsRange->getEnd()); + $this->assertEquals($start->getDayStartStamp(), $tsRange->getStartStamp()); + + $tsRange = DateRange::create($start, $end)->toTimestampRange(); + $this->assertInstanceOf(Timestamp::class, $tsRange->getStart()); + $this->assertInstanceOf(Timestamp::class, $tsRange->getEnd()); + $this->assertEquals($start->getDayStartStamp(), $tsRange->getStartStamp()); + /** use day start stamp because Date to Timestamp - result time 00:00:00 */ + $this->assertEquals($end->getDayStartStamp(), $tsRange->getEndStamp()); + + $tsRange = DateRange::create(null, $end)->toTimestampRange(); + $this->assertNull($tsRange->getStart()); + $this->assertInstanceOf(Timestamp::class, $tsRange->getEnd()); + /** use day start stamp because Date to Timestamp - result time 00:00:00 */ + $this->assertEquals($end->getDayStartStamp(), $tsRange->getEndStamp()); + } + + public function testCheckType() + { + $dateRange = new \OnPHP\Tests\TestEnvironment\Main\Base\DateRange(); + $dateRange->checkType(Date::class); + $dateRange->checkType(Date::makeToday()); + try { + $dateRange->checkType(DateRange::class); + $this->fail('expected WrongArgumentException exception'); + } catch(\Throwable $exception) { + $this->assertInstanceOf(WrongArgumentException::class, $exception); + } + } + + public function testGetObjectName() + { + $dateRange = new \OnPHP\Tests\TestEnvironment\Main\Base\DateRange(); + $this->assertEquals($dateRange->getObjectName(), Date::class); } -} -?> \ No newline at end of file +} \ No newline at end of file diff --git a/tests/TestEnvironment/Main/Base/DateRange.php b/tests/TestEnvironment/Main/Base/DateRange.php new file mode 100644 index 0000000000..5a029351ff --- /dev/null +++ b/tests/TestEnvironment/Main/Base/DateRange.php @@ -0,0 +1,25 @@ +