Simple problems require simple solutions
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123 lines
4.5 KiB

  1. <?php
  2. namespace Tests\Unit;
  3. use App\Enums\DurationModifier;
  4. use App\Services\CalculateDuration;
  5. use DateTimeImmutable;
  6. use DateTimeInterface;
  7. use PHPUnit\Framework\TestCase;
  8. class CalculateDurationTest extends TestCase
  9. {
  10. public function testCanCalculateDurationBetweenTwoDates(): void
  11. {
  12. $start = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2024-08-01T00:00:00+00:00');
  13. $end = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2024-08-17T00:00:00+00:00');
  14. $calculateDuration = new CalculateDuration($start, $end);
  15. $result = $calculateDuration->result();
  16. $this->assertSame(17, $result->days);
  17. $this->assertSame(2, $result->weeks);
  18. $this->assertSame(12, $result->weekDays);
  19. }
  20. public function testCanCalculateDurationBetweenTwoDatesCloseToOverThreeWeeks(): void
  21. {
  22. $start = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2024-08-01T00:00:00+00:00');
  23. $end = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2024-08-21T00:00:00+00:00');
  24. $calculateDuration = new CalculateDuration($start, $end);
  25. $result = $calculateDuration->result();
  26. $this->assertSame(21, $result->days);
  27. $this->assertSame(2, $result->weeks);
  28. $this->assertSame(15, $result->weekDays);
  29. }
  30. public function testCanCalculateDurationBetweenTwoDatesInDifferentTimezones(): void
  31. {
  32. $start = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2024-08-01T00:00:00-12:00');
  33. $end = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2024-08-21T00:00:00+14:00');
  34. $calculateDuration = new CalculateDuration($start, $end);
  35. $result = $calculateDuration->result();
  36. $this->assertSame(20, $result->days);
  37. $this->assertSame(2, $result->weeks);
  38. $this->assertSame(14, $result->weekDays);
  39. }
  40. public function testCanCalculateDurationBetweenAndDisplayAsSeconds(): void
  41. {
  42. $start = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2024-08-01T00:00:00+00:00');
  43. $end = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2024-08-8T00:00:00+00:00');
  44. $calculateDuration = new CalculateDuration($start, $end);
  45. $result = $calculateDuration->result(DurationModifier::Second);
  46. // 8 * 60 * 60 * 24
  47. $this->assertSame(691200, $result->days);
  48. // 5 * 60 * 60 * 24
  49. $this->assertSame(518400, $result->weekDays);
  50. // 1 * 7 * 60 * 60 * 24
  51. $this->assertSame(604800, $result->weeks);
  52. }
  53. public function testCanCalculateDurationBetweenAndDisplayAsMinutes(): void
  54. {
  55. $start = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2024-08-01T00:00:00+00:00');
  56. $end = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2024-08-8T00:00:00+00:00');
  57. $calculateDuration = new CalculateDuration($start, $end);
  58. $result = $calculateDuration->result(DurationModifier::Minute);
  59. // 8 * 60 * 24
  60. $this->assertSame(11520, $result->days);
  61. // 5 * 60 * 24
  62. $this->assertSame(8640, $result->weekDays);
  63. // 1 * 7 * 60 * 24
  64. $this->assertSame(10080, $result->weeks);
  65. }
  66. public function testCanCalculateDurationBetweenAndDisplayAsHours(): void
  67. {
  68. $start = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2024-08-01T00:00:00+00:00');
  69. $end = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2024-08-8T00:00:00+00:00');
  70. $calculateDuration = new CalculateDuration($start, $end);
  71. $result = $calculateDuration->result(DurationModifier::Hour);
  72. // 8 * 24
  73. $this->assertSame(192, $result->days);
  74. // 5 * 24
  75. $this->assertSame(144, $result->weekDays);
  76. // 1 * 7 * 24
  77. $this->assertSame(168, $result->weeks);
  78. }
  79. public function testCanCalculateDurationBetweenAndDisplayAsYears(): void
  80. {
  81. $start = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2024-08-01T00:00:00+00:00');
  82. $end = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2024-08-8T00:00:00+00:00');
  83. $calculateDuration = new CalculateDuration($start, $end);
  84. $result = $calculateDuration->result(DurationModifier::Year);
  85. // 8 * 0.00273973
  86. $this->assertSame(0.02192, $result->days);
  87. // 5 * 0.00273973
  88. $this->assertSame(0.01644, $result->weekDays);
  89. // 1 * 7 * 0.00273973
  90. $this->assertSame(0.01918, $result->weeks);
  91. }
  92. }