DateFacadeTest.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <?php
  2. namespace Illuminate\Tests\Support;
  3. use Carbon\CarbonImmutable;
  4. use Carbon\Factory;
  5. use DateTime;
  6. use Illuminate\Support\Carbon;
  7. use Illuminate\Support\DateFactory;
  8. use Illuminate\Support\Facades\Date;
  9. use Illuminate\Tests\Support\Fixtures\CustomDateClass;
  10. use InvalidArgumentException;
  11. use PHPUnit\Framework\TestCase;
  12. class DateFacadeTest extends TestCase
  13. {
  14. protected function tearDown(): void
  15. {
  16. parent::tearDown();
  17. DateFactory::use(Carbon::class);
  18. }
  19. protected static function assertBetweenStartAndNow($start, $actual)
  20. {
  21. static::assertThat(
  22. $actual,
  23. static::logicalAnd(
  24. static::greaterThanOrEqual($start),
  25. static::lessThanOrEqual(Carbon::now()->getTimestamp())
  26. )
  27. );
  28. }
  29. public function testUseClosure()
  30. {
  31. $start = Carbon::now()->getTimestamp();
  32. $this->assertSame(Carbon::class, get_class(Date::now()));
  33. $this->assertBetweenStartAndNow($start, Date::now()->getTimestamp());
  34. DateFactory::use(function (Carbon $date) {
  35. return new DateTime($date->format('Y-m-d H:i:s.u'), $date->getTimezone());
  36. });
  37. $start = Carbon::now()->getTimestamp();
  38. $this->assertSame(DateTime::class, get_class(Date::now()));
  39. $this->assertBetweenStartAndNow($start, Date::now()->getTimestamp());
  40. }
  41. public function testUseClassName()
  42. {
  43. $start = Carbon::now()->getTimestamp();
  44. $this->assertSame(Carbon::class, get_class(Date::now()));
  45. $this->assertBetweenStartAndNow($start, Date::now()->getTimestamp());
  46. DateFactory::use(DateTime::class);
  47. $start = Carbon::now()->getTimestamp();
  48. $this->assertSame(DateTime::class, get_class(Date::now()));
  49. $this->assertBetweenStartAndNow($start, Date::now()->getTimestamp());
  50. }
  51. public function testCarbonImmutable()
  52. {
  53. DateFactory::use(CarbonImmutable::class);
  54. $this->assertSame(CarbonImmutable::class, get_class(Date::now()));
  55. DateFactory::use(Carbon::class);
  56. $this->assertSame(Carbon::class, get_class(Date::now()));
  57. DateFactory::use(function (Carbon $date) {
  58. return $date->toImmutable();
  59. });
  60. $this->assertSame(CarbonImmutable::class, get_class(Date::now()));
  61. DateFactory::use(function ($date) {
  62. return $date;
  63. });
  64. $this->assertSame(Carbon::class, get_class(Date::now()));
  65. DateFactory::use(new Factory([
  66. 'locale' => 'fr',
  67. ]));
  68. $this->assertSame('fr', Date::now()->locale);
  69. DateFactory::use(Carbon::class);
  70. $this->assertSame('en', Date::now()->locale);
  71. DateFactory::use(CustomDateClass::class);
  72. $this->assertInstanceOf(CustomDateClass::class, Date::now());
  73. $this->assertInstanceOf(Carbon::class, Date::now()->getOriginal());
  74. DateFactory::use(Carbon::class);
  75. }
  76. public function testUseInvalidHandler()
  77. {
  78. $this->expectException(InvalidArgumentException::class);
  79. DateFactory::use(42);
  80. }
  81. public function testMacro()
  82. {
  83. Date::macro('returnNonDate', function () {
  84. return 'string';
  85. });
  86. $this->assertSame('string', Date::returnNonDate());
  87. }
  88. }