AliasTest.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  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 BadMethodCallException;
  13. use Carbon\Carbon;
  14. use Carbon\CarbonInterval;
  15. use Carbon\CarbonPeriod;
  16. use InvalidArgumentException;
  17. use Tests\AbstractTestCase;
  18. class AliasTest extends AbstractTestCase
  19. {
  20. public function testSetStartDate()
  21. {
  22. $periodClass = $this->periodClass;
  23. $period = $periodClass::start($date = '2017-09-13 12:30:45', false);
  24. $this->assertEquals(Carbon::parse($date), $period->getStartDate());
  25. $this->assertEquals(Carbon::parse($date), $period->start);
  26. $this->assertSame($periodClass::EXCLUDE_START_DATE, $period->getOptions());
  27. $period = $period->since($date = '2014-10-12 15:42:34', true);
  28. $this->assertEquals(Carbon::parse($date), $period->getStartDate());
  29. $this->assertEmpty($period->getOptions());
  30. $period = $period->sinceNow(false);
  31. $this->assertEquals(Carbon::now(), $period->getStartDate());
  32. $this->assertSame($periodClass::EXCLUDE_START_DATE, $period->getOptions());
  33. }
  34. /**
  35. * @requires PHP >= 8.0
  36. */
  37. public function testSetStartDateWithNamedParameters()
  38. {
  39. $periodClass = $this->periodClass;
  40. $date = '2017-09-13 12:30:45';
  41. $period = eval('return \\'.$periodClass.'::start(date: $date, inclusive: false);');
  42. $this->assertEquals(Carbon::parse($date), $period->getStartDate());
  43. $this->assertEquals(Carbon::parse($date), $period->start);
  44. $this->assertSame(CarbonPeriod::EXCLUDE_START_DATE, $period->getOptions());
  45. $period = eval('return \\'.$periodClass.'::start(date: $date);');
  46. $this->assertEquals(Carbon::parse($date), $period->getStartDate());
  47. $this->assertEquals(Carbon::parse($date), $period->start);
  48. $this->assertEmpty($period->getOptions());
  49. $date = '2014-10-12 15:42:34';
  50. $period = eval('return $period->since(date: $date, inclusive: true);');
  51. $this->assertEquals(Carbon::parse($date), $period->getStartDate());
  52. $this->assertEmpty($period->getOptions());
  53. $period = eval('return $period->sinceNow(inclusive: false);');
  54. $this->assertEquals(Carbon::now(), $period->getStartDate());
  55. $this->assertSame($periodClass::EXCLUDE_START_DATE, $period->getOptions());
  56. $period = $periodClass::sinceNow();
  57. $this->assertEquals(Carbon::now(), $period->getStartDate());
  58. $this->assertEmpty($period->getOptions());
  59. }
  60. public function testSetEndDate()
  61. {
  62. $periodClass = $this->periodClass;
  63. $period = $periodClass::end($date = '2017-09-13 12:30:45', false);
  64. $this->assertEquals(Carbon::parse($date), $period->getEndDate());
  65. $this->assertEquals(Carbon::parse($date), $period->end);
  66. $this->assertSame($periodClass::EXCLUDE_END_DATE, $period->getOptions());
  67. $period = $period->until($date = '2014-10-12 15:42:34', true);
  68. $this->assertEquals(Carbon::parse($date), $period->getEndDate());
  69. $this->assertEmpty($period->getOptions());
  70. $period = $period->untilNow(false);
  71. $this->assertEquals(Carbon::now(), $period->getEndDate());
  72. $this->assertSame($periodClass::EXCLUDE_END_DATE, $period->getOptions());
  73. $period = $period->end();
  74. $this->assertNull($period->getEndDate());
  75. }
  76. /**
  77. * @requires PHP >= 8.0
  78. */
  79. public function testSetEndDateWithNamedParameters()
  80. {
  81. $periodClass = $this->periodClass;
  82. $date = '2017-09-13 12:30:45';
  83. $period = eval('return \\'.$periodClass.'::end(date: $date, inclusive: false);');
  84. $this->assertEquals(Carbon::parse($date), $period->getEndDate());
  85. $this->assertEquals(Carbon::parse($date), $period->end);
  86. $this->assertSame($periodClass::EXCLUDE_END_DATE, $period->getOptions());
  87. $date = '2014-10-12 15:42:34';
  88. $period = eval('return $period->until(date: $date, inclusive: true);');
  89. $this->assertEquals(Carbon::parse($date), $period->getEndDate());
  90. $this->assertEmpty($period->getOptions());
  91. $period = eval('return $period->untilNow(inclusive: false);');
  92. $this->assertEquals(Carbon::now(), $period->getEndDate());
  93. $this->assertSame($periodClass::EXCLUDE_END_DATE, $period->getOptions());
  94. }
  95. public function testManageFilters()
  96. {
  97. $filter = function () {
  98. return true;
  99. };
  100. $periodClass = $this->periodClass;
  101. $period = $periodClass::filter($filter, 'foo');
  102. $this->assertSame([[$filter, 'foo']], $period->getFilters());
  103. $period = $period->push($filter, 'bar');
  104. $this->assertSame([[$filter, 'foo'], [$filter, 'bar']], $period->getFilters());
  105. $period = $period->prepend($filter, 'pre');
  106. $this->assertSame([[$filter, 'pre'], [$filter, 'foo'], [$filter, 'bar']], $period->getFilters());
  107. $period = $period->filters();
  108. $this->assertEmpty($period->getFilters());
  109. $period = $period->filters($filters = [[$filter, null]]);
  110. $this->assertSame($filters, $period->getFilters());
  111. }
  112. public function testSetRecurrences()
  113. {
  114. $periodClass = $this->periodClass;
  115. $period = $periodClass::recurrences(5);
  116. $this->assertSame(5, $period->getRecurrences());
  117. $this->assertSame(5, $period->recurrences);
  118. $period = $period->times(3);
  119. $this->assertSame(3, $period->getRecurrences());
  120. $period = $period->recurrences();
  121. $this->assertNull($period->getRecurrences());
  122. }
  123. public function testManageOptions()
  124. {
  125. $periodClass = $this->periodClass;
  126. $start = $periodClass::EXCLUDE_START_DATE;
  127. $end = $periodClass::EXCLUDE_END_DATE;
  128. $period = $periodClass::options($start);
  129. $this->assertSame($start, $period->getOptions());
  130. $period = $period->toggle($start | $end);
  131. $this->assertSame($start | $end, $period->getOptions());
  132. $period = $period->toggle($end, false);
  133. $this->assertSame($start, $period->getOptions());
  134. $period = $period->options();
  135. $this->assertEmpty($period->getOptions());
  136. }
  137. public function testSetDates()
  138. {
  139. $periodClass = $this->periodClass;
  140. $period = $periodClass::dates($start = '2014-10-12 15:42:34', $end = '2017-09-13 12:30:45');
  141. $this->assertEquals(Carbon::parse($start), $period->getStartDate());
  142. $this->assertEquals(Carbon::parse($end), $period->getEndDate());
  143. $period = $period->dates(Carbon::now());
  144. $this->assertEquals(Carbon::now(), $period->getStartDate());
  145. $this->assertNull($period->getEndDate());
  146. }
  147. public function testManageInterval()
  148. {
  149. $periodClass = $this->periodClass;
  150. $period = $periodClass::interval('PT6H');
  151. $this->assertEquals(CarbonInterval::create('PT6H'), $period->getDateInterval());
  152. $this->assertEquals(CarbonInterval::create('PT6H'), $period->interval);
  153. }
  154. public function testInvertInterval()
  155. {
  156. $periodClass = $this->periodClass;
  157. $period = $periodClass::invert();
  158. $this->assertEquals(CarbonInterval::create('P1D')->invert(), $period->getDateInterval());
  159. }
  160. public function testModifyIntervalPlural()
  161. {
  162. $periodClass = $this->periodClass;
  163. $period = $periodClass::weeks(2);
  164. $this->assertSame('P14D', $period->getDateInterval()->spec());
  165. $period = $period->years(2)->months(3)->days(4)->hours(5)->minutes(30)->seconds(15);
  166. $this->assertSame('P2Y3M4DT5H30M15S', $period->getDateInterval()->spec());
  167. $period = $period->years(0)->months(0)->dayz(0)->hours(0)->minutes(0)->seconds(1);
  168. $this->assertSame('PT1S', $period->getDateInterval()->spec());
  169. }
  170. public function testModifyIntervalSingular()
  171. {
  172. $periodClass = $this->periodClass;
  173. $period = $periodClass::week();
  174. $this->assertSame('P7D', $period->getDateInterval()->spec());
  175. $period = $period->year()->month()->day()->hour()->minute()->second();
  176. $this->assertSame('P1Y1M1DT1H1M1S', $period->getDateInterval()->spec());
  177. $period = $period->year(2)->month(3)->day(4)->hour(5)->minute(6)->second(7);
  178. $this->assertSame('P2Y3M4DT5H6M7S', $period->getDateInterval()->spec());
  179. }
  180. public function testChainAliases()
  181. {
  182. $periodClass = $this->periodClass;
  183. Carbon::setTestNow('2018-05-15');
  184. $period = $periodClass::days(3)->hours(5)->invert()
  185. ->sinceNow()->until(Carbon::now()->subDays(10))
  186. ->options($periodClass::EXCLUDE_START_DATE)
  187. ->times(2);
  188. $this->assertSame(
  189. $this->standardizeDates([
  190. Carbon::now()->subDays(3)->subHours(5), Carbon::now()->subDays(6)->subHours(10),
  191. ]),
  192. $this->standardizeDates($period)
  193. );
  194. }
  195. public function testCallInvalidAlias()
  196. {
  197. $this->expectExceptionObject(new BadMethodCallException(
  198. 'Method foobar does not exist.'
  199. ));
  200. $periodClass = $this->periodClass;
  201. $periodClass::foobar();
  202. }
  203. public function testOverrideDefaultInterval()
  204. {
  205. $periodClass = $this->periodClass;
  206. $period = $periodClass::hours(5);
  207. $this->assertSame('PT5H', $period->getDateInterval()->spec());
  208. $period = $periodClass::create()->hours(5);
  209. $this->assertSame('PT5H', $period->getDateInterval()->spec());
  210. $period = $periodClass::create('P1D')->hours(5);
  211. $this->assertSame('P1DT5H', $period->getDateInterval()->spec());
  212. }
  213. public function testModifyIntoEmptyDateInterval()
  214. {
  215. $this->expectExceptionObject(new InvalidArgumentException(
  216. 'Empty interval is not accepted.'
  217. ));
  218. $periodClass = $this->periodClass;
  219. $periodClass::days(0);
  220. }
  221. /**
  222. * @requires PHP >= 8.0
  223. */
  224. public function testNamedParameters()
  225. {
  226. $periodClass = $this->periodClass;
  227. $period = eval("return \\$periodClass::between(start: '2022-09-13', end: '2022-10-12');");
  228. $this->assertEquals('2022-09-13', $period->getStartDate()->format('Y-m-d'));
  229. $this->assertEquals('2022-10-12', $period->getEndDate()->format('Y-m-d'));
  230. $period = eval('return $period->years(years: 5);');
  231. $this->assertEquals('5 years', (string) $period->getDateInterval());
  232. $period = eval('return $period->interval(interval: \Carbon\CarbonInterval::year(years: 3));');
  233. $this->assertEquals('3 years', (string) $period->getDateInterval());
  234. $period = eval("return \\$periodClass::between(start: '2022-09-13', end: '2022-10-12')->months(months: 5);");
  235. $this->assertEquals('5 months', (string) $period->getDateInterval());
  236. $period = eval("return \\$periodClass::between(start: '2022-09-13', end: '2022-10-12')->weeks(weeks: 5);");
  237. $this->assertEquals('5 weeks', (string) $period->getDateInterval());
  238. $period = eval("return \\$periodClass::between(start: '2022-09-13', end: '2022-10-12')->days(days: 5);");
  239. $this->assertEquals('5 days', (string) $period->getDateInterval());
  240. $period = eval("return \\$periodClass::between(start: '2022-09-13', end: '2022-10-12')->hours(hours: 5);");
  241. $this->assertEquals('5 hours', (string) $period->getDateInterval());
  242. $period = eval("return \\$periodClass::between(start: '2022-09-13', end: '2022-10-12')->minutes(minutes: 5);");
  243. $this->assertEquals('5 minutes', (string) $period->getDateInterval());
  244. $period = eval("return \\$periodClass::between(start: '2022-09-13', end: '2022-10-12')->seconds(seconds: 5);");
  245. $this->assertEquals('5 seconds', (string) $period->getDateInterval());
  246. $period = eval("return \\$periodClass::between(start: '2022-09-13', end: '2022-10-12')
  247. ->days(days: 5)
  248. ->floorDays(precision: 2);");
  249. $this->assertEquals('4 days', (string) $period->getDateInterval());
  250. $period = eval("return \\$periodClass::between(start: '2022-09-13', end: '2022-10-12')
  251. ->days(days: 5)
  252. ->roundDays(precision: 7);");
  253. $this->assertEquals('1 week', (string) $period->getDateInterval());
  254. $period = eval("return \\$periodClass::between(start: '2022-09-13', end: '2022-10-12')
  255. ->days(days: 5)
  256. ->ceilDays(precision: 2);");
  257. $this->assertEquals('6 days', (string) $period->getDateInterval());
  258. }
  259. }