ToStringTest.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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\CarbonPeriod;
  12. use Carbon\Carbon;
  13. use Carbon\CarbonImmutable;
  14. use Carbon\CarbonInterval;
  15. use Carbon\CarbonPeriod;
  16. use Generator;
  17. use Tests\AbstractTestCase;
  18. class ToStringTest extends AbstractTestCase
  19. {
  20. /**
  21. * @dataProvider \Tests\CarbonPeriod\ToStringTest::dataForToString
  22. */
  23. public function testToString($period, $expected)
  24. {
  25. $this->assertSame(
  26. $expected,
  27. $period->toString()
  28. );
  29. }
  30. public function dataForToString(): Generator
  31. {
  32. $periodClass = $this->periodClass;
  33. Carbon::setTestNowAndTimezone(new Carbon('2015-09-01', 'America/Toronto'));
  34. yield [
  35. $periodClass::create('R4/2012-07-01T12:00:00/P7D'),
  36. '4 times every 1 week from 2012-07-01 12:00:00',
  37. ];
  38. yield [
  39. $periodClass::create(
  40. Carbon::parse('2015-09-30'),
  41. Carbon::parse('2015-10-03')
  42. ),
  43. 'Every 1 day from 2015-09-30 to 2015-10-03',
  44. ];
  45. yield [
  46. $periodClass::create(
  47. Carbon::parse('2015-09-30 12:50'),
  48. CarbonInterval::days(3)->hours(5),
  49. Carbon::parse('2015-10-03 19:00')
  50. ),
  51. 'Every 3 days and 5 hours from 2015-09-30 12:50:00 to 2015-10-03 19:00:00',
  52. ];
  53. yield [
  54. $periodClass::create('2015-09-30 17:30'),
  55. 'Every 1 day from 2015-09-30 17:30:00',
  56. ];
  57. yield [
  58. $periodClass::create('P1M14D'),
  59. 'Every 1 month and 2 weeks from 2015-09-01',
  60. ];
  61. yield [
  62. $periodClass::create('2015-09-30 13:30', 'P17D')->setRecurrences(1),
  63. 'Once every 2 weeks and 3 days from 2015-09-30 13:30:00',
  64. ];
  65. yield [
  66. $periodClass::create('2015-10-01', '2015-10-05', 'PT30M'),
  67. 'Every 30 minutes from 2015-10-01 to 2015-10-05',
  68. ];
  69. Carbon::setTestNowAndTimezone();
  70. }
  71. public function testMagicToString()
  72. {
  73. $periodClass = $this->periodClass;
  74. $period = $periodClass::create(
  75. Carbon::parse('2015-09-30 12:50'),
  76. CarbonInterval::days(3)->hours(5),
  77. Carbon::parse('2015-10-03 19:00')
  78. );
  79. $this->assertSame(
  80. 'Every 3 days and 5 hours from 2015-09-30 12:50:00 to 2015-10-03 19:00:00',
  81. (string) $period
  82. );
  83. }
  84. /**
  85. * @dataProvider \Tests\CarbonPeriod\ToStringTest::dataForToIso8601String
  86. */
  87. public function testToIso8601String($period, $expected)
  88. {
  89. $this->assertSame(
  90. $expected,
  91. $period->toIso8601String()
  92. );
  93. }
  94. public function dataForToIso8601String(): Generator
  95. {
  96. $periodClass = $this->periodClass;
  97. Carbon::setTestNowAndTimezone(new Carbon('2015-09-01', 'America/Toronto'));
  98. yield [
  99. $periodClass::create('R4/2012-07-01T00:00:00-04:00/P7D'),
  100. 'R4/2012-07-01T00:00:00-04:00/P7D',
  101. ];
  102. yield [
  103. $periodClass::create(
  104. Carbon::parse('2015-09-30', 'America/Toronto'),
  105. Carbon::parse('2015-10-03', 'America/Toronto')
  106. ),
  107. '2015-09-30T00:00:00-04:00/P1D/2015-10-03T00:00:00-04:00',
  108. ];
  109. yield [
  110. $periodClass::create(
  111. Carbon::parse('2015-09-30 12:50', 'America/Toronto'),
  112. CarbonInterval::days(3)->hours(5),
  113. Carbon::parse('2015-10-03 19:00', 'America/Toronto')
  114. ),
  115. '2015-09-30T12:50:00-04:00/P3DT5H/2015-10-03T19:00:00-04:00',
  116. ];
  117. yield [
  118. $periodClass::create(
  119. Carbon::parse('2015-09-30 12:50', 'America/Toronto'),
  120. CarbonInterval::days(3)
  121. ),
  122. '2015-09-30T12:50:00-04:00/P3D',
  123. ];
  124. yield [
  125. $periodClass::create(),
  126. '2015-09-01T00:00:00-04:00/P1D',
  127. ];
  128. }
  129. public function testSpec()
  130. {
  131. $periodClass = $this->periodClass;
  132. $period = $periodClass::create(
  133. Carbon::parse('2015-09-30'),
  134. CarbonInterval::days(3)->hours(5),
  135. Carbon::parse('2015-10-03')
  136. );
  137. $this->assertSame(
  138. '2015-09-30T00:00:00-04:00/P3DT5H/2015-10-03T00:00:00-04:00',
  139. $period->spec()
  140. );
  141. }
  142. public function testStartOfWeekForPeriod()
  143. {
  144. $periodClass = $this->periodClass;
  145. $sunday = CarbonImmutable::parse('2019-12-01');
  146. $period = $periodClass::create($sunday->startOfWeek(), '1 week', $sunday->endOfWeek())->toArray();
  147. $formattedSunday = $sunday->startOfWeek()->format('Y-m-d H:i:s');
  148. $this->assertSame(
  149. '2019-11-25 00:00:00',
  150. $formattedSunday
  151. );
  152. $this->assertSame(
  153. $formattedSunday,
  154. $period[0]->toImmutable()->startOfWeek()->format('Y-m-d H:i:s')
  155. );
  156. }
  157. public function testToStringCustomization()
  158. {
  159. $periodClass = $this->periodClass;
  160. $sunday = CarbonImmutable::parse('2019-12-01');
  161. $period = $periodClass::create($sunday->startOfWeek(), '1 week', $sunday->endOfWeek());
  162. $this->assertSame(
  163. 'Every 1 week from 2019-11-25 00:00:00 to 2019-12-01 23:59:59!!',
  164. $period.'!!'
  165. );
  166. $periodClass::setToStringFormat('m/d');
  167. $this->assertSame(
  168. 'Every 1 week from 11/25 to 12/01!!',
  169. $period.'!!'
  170. );
  171. $period->settings(['toStringFormat' => static function (CarbonPeriod $period) {
  172. return $period->toIso8601String();
  173. }]);
  174. $this->assertSame(
  175. '2019-11-25T00:00:00-05:00/P7D/2019-12-01T23:59:59-05:00!!',
  176. $period.'!!'
  177. );
  178. $periodClass::resetToStringFormat();
  179. }
  180. }