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