InstanceTest.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4. * This file is part of the Carbon package.
  5. *
  6. * (c) Brian Nesbitt <brian@nesbot.com>
  7. *
  8. * For the full copyright and license information, please view the LICENSE
  9. * file that was distributed with this source code.
  10. */
  11. namespace Tests\CarbonImmutable;
  12. use Carbon\Carbon as CarbonMutable;
  13. use Carbon\CarbonImmutable;
  14. use Carbon\CarbonImmutable as Carbon;
  15. use Carbon\CarbonInterface;
  16. use DateTime;
  17. use DateTimeZone;
  18. use InvalidArgumentException;
  19. use Tests\AbstractTestCase;
  20. class InstanceTest extends AbstractTestCase
  21. {
  22. public function testInstanceFromDateTime()
  23. {
  24. $dating = Carbon::instance(DateTime::createFromFormat('Y-m-d H:i:s', '1975-05-21 22:32:11'));
  25. $this->assertCarbon($dating, 1975, 5, 21, 22, 32, 11);
  26. $dating = Carbon::parse(DateTime::createFromFormat('Y-m-d H:i:s', '1975-05-21 22:32:11'));
  27. $this->assertCarbon($dating, 1975, 5, 21, 22, 32, 11);
  28. }
  29. public function testInstanceFromCarbon()
  30. {
  31. $dating = Carbon::instance(Carbon::create(1975, 5, 21, 22, 32, 11));
  32. $this->assertCarbon($dating, 1975, 5, 21, 22, 32, 11);
  33. }
  34. public function testInstanceFromDateTimeKeepsTimezoneName()
  35. {
  36. $dating = Carbon::instance(DateTime::createFromFormat('Y-m-d H:i:s', '1975-05-21 22:32:11')->setTimezone(new DateTimeZone('America/Vancouver')));
  37. $this->assertSame('America/Vancouver', $dating->tzName);
  38. }
  39. public function testInstanceFromCarbonKeepsTimezoneName()
  40. {
  41. $dating = Carbon::instance(Carbon::create(1975, 5, 21, 22, 32, 11)->setTimezone(new DateTimeZone('America/Vancouver')));
  42. $this->assertSame('America/Vancouver', $dating->tzName);
  43. }
  44. public function testInstanceFromDateTimeKeepsMicros()
  45. {
  46. $micro = 254687;
  47. $datetime = DateTime::createFromFormat('Y-m-d H:i:s.u', '2014-02-01 03:45:27.'.$micro);
  48. $carbon = Carbon::instance($datetime);
  49. $this->assertSame($micro, $carbon->micro);
  50. }
  51. public function testInstanceFromCarbonKeepsMicros()
  52. {
  53. $micro = 254687;
  54. $carbon = Carbon::createFromFormat('Y-m-d H:i:s.u', '2014-02-01 03:45:27.'.$micro);
  55. $carbon = Carbon::instance($carbon);
  56. $this->assertSame($micro, $carbon->micro);
  57. }
  58. public function testTimezoneCopy()
  59. {
  60. $carbon = new Carbon('2017-06-27 13:14:15.123456', 'Europe/Paris');
  61. $carbon = CarbonMutable::instance($carbon);
  62. $this->assertSame('2017-06-27 13:14:15.123456 Europe/Paris', $carbon->format('Y-m-d H:i:s.u e'));
  63. }
  64. public function testInstanceStateSetBySetStateMethod()
  65. {
  66. $carbon = Carbon::__set_state([
  67. 'date' => '2017-05-18 13:02:15.273420',
  68. 'timezone_type' => 3,
  69. 'timezone' => 'UTC',
  70. ]);
  71. $this->assertInstanceOf(Carbon::class, $carbon);
  72. $this->assertSame('2017-05-18 13:02:15.273420', $carbon->format('Y-m-d H:i:s.u'));
  73. }
  74. public function testInstanceStateSetBySetStateString()
  75. {
  76. $carbon = Carbon::__set_state('2017-05-18 13:02:15.273420');
  77. $this->assertInstanceOf(Carbon::class, $carbon);
  78. $this->assertSame('2017-05-18 13:02:15.273420', $carbon->format('Y-m-d H:i:s.u'));
  79. }
  80. public function testDeserializationOccursCorrectly()
  81. {
  82. $carbon = new Carbon('2017-06-27 13:14:15.000000');
  83. $serialized = 'return '.var_export($carbon, true).';';
  84. $deserialized = eval($serialized);
  85. $this->assertInstanceOf(Carbon::class, $deserialized);
  86. }
  87. public function testMutableConversions()
  88. {
  89. $carbon = new Carbon('2017-06-27 13:14:15.123456', 'Europe/Paris');
  90. $carbon = $carbon->locale('en_CA');
  91. $copy = $carbon->toImmutable();
  92. $this->assertEquals($copy, $carbon);
  93. $this->assertNotSame($copy, $carbon);
  94. $this->assertSame('en_CA', $copy->locale());
  95. $this->assertInstanceOf(CarbonImmutable::class, $copy);
  96. $this->assertTrue($copy->isImmutable());
  97. $this->assertFalse($copy->isMutable());
  98. $this->assertSame('2017-06-27 13:14:15.123456', $copy->format(CarbonInterface::MOCK_DATETIME_FORMAT));
  99. $this->assertSame('Europe/Paris', $copy->tzName);
  100. $this->assertNotSame($copy, $copy->modify('+1 day'));
  101. $copy = $carbon->toMutable();
  102. $this->assertEquals($copy, $carbon);
  103. $this->assertNotSame($copy, $carbon);
  104. $this->assertSame('en_CA', $copy->locale());
  105. $this->assertInstanceOf(CarbonMutable::class, $copy);
  106. $this->assertFalse($copy->isImmutable());
  107. $this->assertTrue($copy->isMutable());
  108. $this->assertSame('2017-06-27 13:14:15.123456', $copy->format(CarbonInterface::MOCK_DATETIME_FORMAT));
  109. $this->assertSame('Europe/Paris', $copy->tzName);
  110. $this->assertSame($copy, $copy->modify('+1 day'));
  111. }
  112. public function testInvalidCast()
  113. {
  114. $this->expectExceptionObject(new InvalidArgumentException(
  115. 'DateTimeZone has not the instance() method needed to cast the date.'
  116. ));
  117. $carbon = new Carbon('2017-06-27 13:14:15.123456', 'Europe/Paris');
  118. $carbon->cast(DateTimeZone::class);
  119. }
  120. public function testChildCast()
  121. {
  122. $class = \get_class(new class() extends Carbon {
  123. public function foo()
  124. {
  125. return 42;
  126. }
  127. });
  128. $carbon = new Carbon('2017-06-27 13:14:15.123456', 'Europe/Paris');
  129. /** @var object $casted */
  130. $casted = $carbon->cast($class);
  131. $this->assertInstanceOf($class, $casted);
  132. $this->assertInstanceOf(Carbon::class, $casted);
  133. $this->assertSame(42, $casted->foo());
  134. $this->assertSame('2017-06-27', $casted->format('Y-m-d'));
  135. }
  136. public function testSiblingCast()
  137. {
  138. $class = \get_class(new class() extends DateTime {
  139. public function foo()
  140. {
  141. return 42;
  142. }
  143. });
  144. $carbon = new Carbon('2017-06-27 13:14:15.123456', 'Europe/Paris');
  145. /** @var object $casted */
  146. $casted = $carbon->cast($class);
  147. $this->assertInstanceOf($class, $casted);
  148. $this->assertInstanceOf(DateTime::class, $casted);
  149. $this->assertSame(42, $casted->foo());
  150. $this->assertSame('2017-06-27', $casted->format('Y-m-d'));
  151. }
  152. }