|
<?php
|
|
|
|
namespace Tests\Unit;
|
|
|
|
use App\Enums\DurationModifier;
|
|
use App\Services\CalculateDuration;
|
|
use DateTimeImmutable;
|
|
use DateTimeInterface;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
class CalculateDurationTest extends TestCase
|
|
{
|
|
public function testCanCalculateDurationBetweenTwoDates(): void
|
|
{
|
|
$start = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2024-08-01T00:00:00+00:00');
|
|
$end = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2024-08-17T00:00:00+00:00');
|
|
|
|
$calculateDuration = new CalculateDuration($start, $end);
|
|
$result = $calculateDuration->result();
|
|
|
|
$this->assertSame(17, $result->days);
|
|
$this->assertSame(2, $result->weeks);
|
|
$this->assertSame(12, $result->weekDays);
|
|
}
|
|
|
|
public function testCanCalculateDurationBetweenTwoDatesCloseToOverThreeWeeks(): void
|
|
{
|
|
$start = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2024-08-01T00:00:00+00:00');
|
|
$end = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2024-08-21T00:00:00+00:00');
|
|
|
|
$calculateDuration = new CalculateDuration($start, $end);
|
|
$result = $calculateDuration->result();
|
|
|
|
$this->assertSame(21, $result->days);
|
|
$this->assertSame(2, $result->weeks);
|
|
$this->assertSame(15, $result->weekDays);
|
|
}
|
|
|
|
public function testCanCalculateDurationBetweenTwoDatesInDifferentTimezones(): void
|
|
{
|
|
$start = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2024-08-01T00:00:00-12:00');
|
|
$end = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2024-08-21T00:00:00+14:00');
|
|
|
|
$calculateDuration = new CalculateDuration($start, $end);
|
|
$result = $calculateDuration->result();
|
|
|
|
$this->assertSame(20, $result->days);
|
|
$this->assertSame(2, $result->weeks);
|
|
$this->assertSame(14, $result->weekDays);
|
|
}
|
|
|
|
public function testCanCalculateDurationBetweenAndDisplayAsSeconds(): void
|
|
{
|
|
$start = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2024-08-01T00:00:00+00:00');
|
|
$end = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2024-08-8T00:00:00+00:00');
|
|
|
|
$calculateDuration = new CalculateDuration($start, $end);
|
|
$result = $calculateDuration->result(DurationModifier::Second);
|
|
|
|
// 8 * 60 * 60 * 24
|
|
$this->assertSame(691200, $result->days);
|
|
|
|
// 5 * 60 * 60 * 24
|
|
$this->assertSame(518400, $result->weekDays);
|
|
|
|
// 1 * 7 * 60 * 60 * 24
|
|
$this->assertSame(604800, $result->weeks);
|
|
}
|
|
|
|
public function testCanCalculateDurationBetweenAndDisplayAsMinutes(): void
|
|
{
|
|
$start = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2024-08-01T00:00:00+00:00');
|
|
$end = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2024-08-8T00:00:00+00:00');
|
|
|
|
$calculateDuration = new CalculateDuration($start, $end);
|
|
$result = $calculateDuration->result(DurationModifier::Minute);
|
|
|
|
// 8 * 60 * 24
|
|
$this->assertSame(11520, $result->days);
|
|
|
|
// 5 * 60 * 24
|
|
$this->assertSame(8640, $result->weekDays);
|
|
|
|
// 1 * 7 * 60 * 24
|
|
$this->assertSame(10080, $result->weeks);
|
|
}
|
|
|
|
public function testCanCalculateDurationBetweenAndDisplayAsHours(): void
|
|
{
|
|
$start = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2024-08-01T00:00:00+00:00');
|
|
$end = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2024-08-8T00:00:00+00:00');
|
|
|
|
$calculateDuration = new CalculateDuration($start, $end);
|
|
$result = $calculateDuration->result(DurationModifier::Hour);
|
|
|
|
// 8 * 24
|
|
$this->assertSame(192, $result->days);
|
|
|
|
// 5 * 24
|
|
$this->assertSame(144, $result->weekDays);
|
|
|
|
// 1 * 7 * 24
|
|
$this->assertSame(168, $result->weeks);
|
|
}
|
|
|
|
public function testCanCalculateDurationBetweenAndDisplayAsYears(): void
|
|
{
|
|
$start = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2024-08-01T00:00:00+00:00');
|
|
$end = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2024-08-8T00:00:00+00:00');
|
|
|
|
$calculateDuration = new CalculateDuration($start, $end);
|
|
$result = $calculateDuration->result(DurationModifier::Year);
|
|
|
|
// 8 * 0.00273973
|
|
$this->assertSame(0.02192, $result->days);
|
|
|
|
// 5 * 0.00273973
|
|
$this->assertSame(0.01644, $result->weekDays);
|
|
|
|
// 1 * 7 * 0.00273973
|
|
$this->assertSame(0.01918, $result->weeks);
|
|
}
|
|
}
|