GettersTest.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  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 Carbon\Exceptions\UnknownGetterException;
  17. use Carbon\Exceptions\UnreachableException;
  18. use DateTime;
  19. use Tests\AbstractTestCase;
  20. use Tests\CarbonPeriod\Fixtures\CarbonPeriodFactory;
  21. class GettersTest extends AbstractTestCase
  22. {
  23. public function testGetStartDate()
  24. {
  25. $period = CarbonPeriodFactory::withStartIntervalEnd($this->periodClass);
  26. $date = $period->getStartDate();
  27. $this->assertInstanceOfCarbon($date);
  28. $this->assertSame('2012-07-01 17:30:00', $date->format('Y-m-d H:i:s'));
  29. }
  30. public function testGetEndDate()
  31. {
  32. $period = CarbonPeriodFactory::withStartIntervalEnd($this->periodClass);
  33. $date = $period->getEndDate();
  34. $this->assertInstanceOfCarbon($date);
  35. $this->assertSame('2012-07-15 11:15:00', $date->format('Y-m-d H:i:s'));
  36. }
  37. public function testGetDateInterval()
  38. {
  39. $period = CarbonPeriodFactory::withStartIntervalEnd($this->periodClass);
  40. $interval = $period->getDateInterval();
  41. $this->assertInstanceOfCarbonInterval($interval);
  42. $this->assertSame('P3DT5H', $interval->spec());
  43. }
  44. public function testGetRecurrences()
  45. {
  46. $recurrences = CarbonPeriod::create(new DateTime(), 5)->getRecurrences();
  47. $this->assertSame(5, $recurrences);
  48. }
  49. public function testGetDefaultDateInterval()
  50. {
  51. $period = CarbonPeriod::create(Carbon::parse('2015-09-30'), Carbon::parse('2015-10-03'));
  52. $this->assertInstanceOfCarbonInterval($period->getDateInterval());
  53. $this->assertSame('P1D', $period->getDateInterval()->spec());
  54. }
  55. public function testModifyStartDate()
  56. {
  57. $period = CarbonPeriodFactory::withStartIntervalEnd($this->periodClass);
  58. $period->getStartDate()->subDays(3);
  59. $this->assertSame('2012-07-01', $period->getStartDate()->format('Y-m-d'));
  60. }
  61. public function testModifyEndDate()
  62. {
  63. $period = CarbonPeriodFactory::withStartIntervalEnd($this->periodClass);
  64. $period->getEndDate()->addDays(3);
  65. $this->assertSame('2012-07-15', $period->getEndDate()->format('Y-m-d'));
  66. }
  67. public function testModifyDateInterval()
  68. {
  69. $period = CarbonPeriodFactory::withStartIntervalEnd($this->periodClass);
  70. $period->getDateInterval()->days(5)->hours(0);
  71. $this->assertSame('P3DT5H', $period->getDateInterval()->spec());
  72. }
  73. public function testGetOptions()
  74. {
  75. $period = new CarbonPeriod();
  76. $this->assertSame(0, $period->getOptions());
  77. $this->assertTrue($period->include_start_date);
  78. $this->assertTrue($period->include_end_date);
  79. $period = new CarbonPeriod(new DateTime(), new DateTime(), $options = CarbonPeriod::EXCLUDE_START_DATE | CarbonPeriod::EXCLUDE_END_DATE);
  80. $this->assertSame($options, $period->getOptions());
  81. $this->assertFalse($period->include_start_date);
  82. $this->assertFalse($period->include_end_date);
  83. }
  84. public function testOverlaps()
  85. {
  86. $range1 = CarbonPeriod::create('2019-01-26', '2019-03-03');
  87. $range2 = CarbonPeriod::create('2019-02-15', '2019-04-01');
  88. $this->assertTrue($range1->overlaps($range2));
  89. $this->assertTrue($range2->overlaps($range1));
  90. $range1 = CarbonPeriod::create('2019-01-26', '2019-02-13');
  91. $range2 = CarbonPeriod::create('2019-02-15', '2019-04-01');
  92. $this->assertFalse($range1->overlaps($range2));
  93. $this->assertFalse($range2->overlaps($range1));
  94. $range1 = CarbonPeriod::create('2019-01-26', '2019-02-15');
  95. $range2 = CarbonPeriod::create('2019-02-15', '2019-04-01');
  96. $this->assertFalse($range1->overlaps($range2));
  97. $this->assertFalse($range2->overlaps($range1));
  98. $range1 = CarbonPeriod::create('2019-01-26', '2019-02-15 00:00:01');
  99. $range2 = CarbonPeriod::create('2019-02-15', '2019-04-01');
  100. $this->assertTrue($range1->overlaps($range2));
  101. $this->assertTrue($range2->overlaps($range1));
  102. $range1 = CarbonPeriod::create('2019-01-26', '2019-02-15 00:00:01');
  103. $range2 = CarbonPeriod::create('2019-02-15 00:00:01', '2019-04-01');
  104. $this->assertFalse($range1->overlaps($range2));
  105. $this->assertFalse($range2->overlaps($range1));
  106. $range1 = CarbonPeriod::create('2019-01-26 10:30:12', '2019-01-26 13:30:12');
  107. $range2 = CarbonPeriod::create('2019-01-26 10:30:05', '2019-01-26 13:32:12');
  108. $this->assertTrue($range1->overlaps($range2));
  109. $this->assertTrue($range2->overlaps($range1));
  110. $range1 = CarbonPeriod::create('2019-01-26 10:30:12', INF);
  111. $range2 = CarbonPeriod::create('2999-01-26 10:30:05', '2999-01-26 13:32:12');
  112. $this->assertFalse($range1->calculateEnd()->isStartOfTime());
  113. $this->assertTrue($range1->calculateEnd()->isEndOfTime());
  114. $this->assertFalse($range2->calculateEnd()->isStartOfTime());
  115. $this->assertFalse($range2->calculateEnd()->isEndOfTime());
  116. $this->assertTrue($range1->overlaps($range2));
  117. $this->assertTrue($range2->overlaps($range1));
  118. $range1 = CarbonPeriod::create('2019-01-26 10:30:12', CarbonInterval::day(-1), INF);
  119. $range2 = CarbonPeriod::create('2999-01-26 10:30:05', '2999-01-26 13:32:12');
  120. $this->assertTrue($range1->calculateEnd()->isStartOfTime());
  121. $this->assertFalse($range1->calculateEnd()->isEndOfTime());
  122. $this->assertFalse($range2->calculateEnd()->isStartOfTime());
  123. $this->assertFalse($range2->calculateEnd()->isEndOfTime());
  124. $this->assertFalse($range1->overlaps($range2));
  125. $this->assertFalse($range2->overlaps($range1));
  126. $range1 = CarbonPeriod::create('2019-01-26 10:30:12', INF);
  127. $range2 = CarbonPeriod::create('1975-01-26 10:30:05', '1975-01-26 13:32:12');
  128. $this->assertFalse($range1->overlaps($range2));
  129. $this->assertFalse($range2->overlaps($range1));
  130. $range1 = CarbonPeriod::create('2019-01-26 10:30:12', CarbonInterval::day(-1), INF);
  131. $range2 = CarbonPeriod::create('1975-01-26 10:30:05', '1975-01-26 13:32:12');
  132. $this->assertTrue($range1->overlaps($range2));
  133. $this->assertTrue($range2->overlaps($range1));
  134. $range1 = CarbonPeriod::create('2019-01-26 10:30:12', INF);
  135. $range2 = CarbonPeriod::create('2999-01-26 10:30:05', INF);
  136. $this->assertTrue($range1->overlaps($range2));
  137. $this->assertTrue($range2->overlaps($range1));
  138. $range1 = CarbonPeriod::create('2019-01-26 10:30:12', CarbonInterval::day(-1), INF);
  139. $range2 = CarbonPeriod::create('2999-01-26 10:30:05', INF);
  140. $this->assertFalse($range1->overlaps($range2));
  141. $this->assertFalse($range2->overlaps($range1));
  142. $range1 = CarbonPeriod::create('2019-01-26 10:30:12', INF);
  143. $range2 = CarbonPeriod::create('1975-01-26 10:30:05', INF);
  144. $this->assertTrue($range1->overlaps($range2));
  145. $this->assertTrue($range2->overlaps($range1));
  146. $range1 = CarbonPeriod::create('2019-01-26 10:30:12', INF);
  147. $range2 = CarbonPeriod::create('1975-01-26 10:30:05', CarbonInterval::day(-1), INF);
  148. $this->assertFalse($range1->overlaps($range2));
  149. $this->assertFalse($range2->overlaps($range1));
  150. $range1 = CarbonPeriod::create('2019-01-26 10:30:12', CarbonInterval::day(-1), INF);
  151. $range2 = CarbonPeriod::create('1975-01-26 10:30:05', INF);
  152. $this->assertTrue($range1->overlaps($range2));
  153. $this->assertTrue($range2->overlaps($range1));
  154. $range1 = CarbonPeriod::create('2019-01-26 10:30:12', CarbonInterval::day(), 365, CarbonPeriod::EXCLUDE_START_DATE);
  155. $range2 = CarbonPeriod::create('2020-01-26 10:30:05', '2020-01-27 10:30:05');
  156. $this->assertTrue($range1->overlaps($range2));
  157. $this->assertTrue($range2->overlaps($range1));
  158. $range1 = CarbonPeriod::create('2019-01-26 10:30:12', CarbonInterval::day(), 365, CarbonPeriod::EXCLUDE_START_DATE);
  159. $range2 = CarbonPeriod::create('2020-01-26 10:30:20', '2020-01-27 10:30:20');
  160. $this->assertFalse($range1->overlaps($range2));
  161. $this->assertFalse($range2->overlaps($range1));
  162. $range1 = CarbonPeriod::create('2019-01-26 10:30:12', CarbonInterval::day(), 365);
  163. $range2 = CarbonPeriod::create('2020-01-27 10:30:20', '2020-01-28 10:30:20');
  164. $this->assertFalse($range1->overlaps($range2));
  165. $this->assertFalse($range2->overlaps($range1));
  166. $range1 = CarbonPeriod::create('2019-01-26 10:30:12', CarbonInterval::day(), INF);
  167. (function () {
  168. $this->dateInterval->subDays(1);
  169. })->call($range1);
  170. $range2 = CarbonPeriod::create('2999-01-26 10:30:05', '2999-01-26 13:32:12');
  171. $this->assertFalse($range1->overlaps($range2));
  172. $this->assertFalse($range2->overlaps($range1));
  173. $range1 = CarbonPeriod::create('2019-01-26 10:30:12', CarbonInterval::day(), INF);
  174. (function () {
  175. $this->dateInterval->subDays(1);
  176. })->call($range1);
  177. $range2 = CarbonPeriod::create('2018-01-26 10:30:05', '2019-01-26 13:32:12');
  178. $this->assertTrue($range1->overlaps($range2));
  179. $this->assertTrue($range2->overlaps($range1));
  180. }
  181. public function testOverlapsErrorForNullEnd()
  182. {
  183. $this->expectExceptionObject(new UnreachableException(
  184. "Could not calculate period end without either explicit end or recurrences.\n".
  185. "If you're looking for a forever-period, use ->setRecurrences(INF)."
  186. ));
  187. CarbonPeriod::create('2019-01-26 10:30:12', null)->overlaps('R2/2019-01-31T10:30:45Z/P2D');
  188. }
  189. public function testOverlapsErrorForMaxAttempts()
  190. {
  191. $this->expectExceptionObject(new UnreachableException(
  192. 'Could not calculate period end after iterating 10000 times.'
  193. ));
  194. $period = CarbonPeriod::create('2019-01-26 10:30:12', CarbonInterval::minute(), 98282828);
  195. $period->addFilter(function ($date) {
  196. return $date->minute % 2;
  197. });
  198. $period->overlaps('R2/2019-01-31T10:30:45Z/P2D');
  199. }
  200. public function testOverlapsCalculated()
  201. {
  202. $this->assertTrue(CarbonPeriod::create('2019-01-27', '2019-02-02')->overlaps('R2/2019-01-31T10:30:45Z/P2D'));
  203. $this->assertTrue(CarbonPeriod::create('2019-01-27', '2019-02-02')->overlaps('2018-12-31/2019-02-01'));
  204. $this->assertFalse(CarbonPeriod::create('2019-01-27', '2019-02-02')->overlaps('R6/2018-12-31/P3D'));
  205. $this->assertTrue(CarbonPeriod::create('2019-01-27', '2019-02-02')->overlaps('R6/2018-12-31/P6D'));
  206. $this->assertFalse(CarbonPeriod::create('R6/2018-12-31/P1D')->overlaps('R3/2019-01-05/PT3H'));
  207. $this->assertTrue(CarbonPeriod::create('R7/2018-12-31/P1D')->overlaps('R3/2019-01-05/PT3H'));
  208. }
  209. public function testOverlapsWithDatesCouple()
  210. {
  211. $this->assertTrue(Carbon::parse('2019-01-26')->toPeriod('2019-03-03')->overlaps('2019-02-15', '2019-04-01'));
  212. $this->assertTrue(Carbon::parse('2019-02-15')->toPeriod('2019-04-01')->overlaps('2019-02-15', '2019-04-01'));
  213. $this->assertTrue(CarbonPeriod::create('2019-01-26', '2019-03-03')->overlaps('2019-02-15', '2019-04-01'));
  214. $this->assertTrue(CarbonPeriod::create('2019-01-26', '2019-03-03')->overlaps(Carbon::parse('2019-02-15')->toPeriod('2019-04-01')));
  215. $this->assertTrue(Carbon::parse('2019-01-26')->toPeriod('2019-03-03')->overlaps(Carbon::parse('2019-02-15'), '2019-04-01'));
  216. $this->assertTrue(Carbon::parse('2019-02-15')->toPeriod('2019-04-01')->overlaps('2019-02-15', CarbonImmutable::parse('2019-04-01')));
  217. $this->assertTrue(CarbonPeriod::create('2019-01-26', '2019-03-03')->overlaps(new DateTime('2019-02-15'), new DateTime('2019-04-01')));
  218. $this->assertFalse(Carbon::parse('2018-01-26')->toPeriod('2018-03-03')->overlaps('2019-02-15', '2019-04-01'));
  219. $this->assertFalse(Carbon::parse('2018-02-15')->toPeriod('2018-04-01')->overlaps('2019-02-15', '2019-04-01'));
  220. $this->assertFalse(CarbonPeriod::create('2018-01-26', '2018-02-13')->overlaps('2019-02-15', '2019-04-01'));
  221. $this->assertFalse(CarbonPeriod::create('2018-01-26', '2018-02-13')->overlaps(Carbon::parse('2019-02-15')->toPeriod('2019-04-01')));
  222. $this->assertFalse(Carbon::parse('2018-01-26')->toPeriod('2018-03-03')->overlaps(Carbon::parse('2019-02-15'), '2019-04-01'));
  223. $this->assertFalse(Carbon::parse('2018-02-15')->toPeriod('2018-04-01')->overlaps('2019-02-15', CarbonImmutable::parse('2019-04-01')));
  224. $this->assertFalse(CarbonPeriod::create('2018-01-26', '2018-02-13')->overlaps(new DateTime('2019-02-15'), new DateTime('2019-04-01')));
  225. }
  226. public function testIsStarted()
  227. {
  228. Carbon::setTestNow('2019-08-03 11:47:00');
  229. $this->assertFalse(CarbonPeriod::create('2019-08-03 11:47:01', '2019-08-03 12:00:00')->isStarted());
  230. $this->assertFalse(CarbonPeriod::create('2020-01-01', '2020-07-01')->isStarted());
  231. $this->assertTrue(CarbonPeriod::create('2019-08-03 01:00:00', '2019-08-03 09:00:00')->isStarted());
  232. $this->assertTrue(CarbonPeriod::create('2019-01-01', '2019-07-01')->isStarted());
  233. $this->assertTrue(CarbonPeriod::create('2019-08-01', '2019-08-15')->isStarted());
  234. $this->assertTrue(CarbonPeriod::create('2019-08-03 11:47:00', '2019-08-15 11:47:00')->isStarted());
  235. }
  236. public function testIsEnded()
  237. {
  238. Carbon::setTestNow('2019-08-03 11:47:00');
  239. $this->assertFalse(CarbonPeriod::create('2019-08-03 11:47:01', '2019-08-03 12:00:00')->isEnded());
  240. $this->assertFalse(CarbonPeriod::create('2020-01-01', '2020-07-01')->isEnded());
  241. $this->assertFalse(CarbonPeriod::create('2019-08-01', '2019-08-15')->isEnded());
  242. $this->assertFalse(CarbonPeriod::create('2019-08-03 11:47:00', '2019-08-15 11:47:00')->isEnded());
  243. $this->assertTrue(CarbonPeriod::create('2019-08-03 01:00:00', '2019-08-03 09:00:00')->isEnded());
  244. $this->assertTrue(CarbonPeriod::create('2019-01-01', '2019-07-01')->isEnded());
  245. $this->assertTrue(CarbonPeriod::create('2019-08-02 11:47:00', '2019-08-03 11:47:00')->isEnded());
  246. }
  247. public function testIsInProgress()
  248. {
  249. Carbon::setTestNow('2019-08-03 11:47:00');
  250. $this->assertFalse(CarbonPeriod::create('2019-08-03 11:47:01', '2019-08-03 12:00:00')->isInProgress());
  251. $this->assertFalse(CarbonPeriod::create('2020-01-01', '2020-07-01')->isInProgress());
  252. $this->assertFalse(CarbonPeriod::create('2019-08-03 01:00:00', '2019-08-03 09:00:00')->isInProgress());
  253. $this->assertFalse(CarbonPeriod::create('2019-01-01', '2019-07-01')->isInProgress());
  254. $this->assertFalse(CarbonPeriod::create('2019-08-02 11:47:00', '2019-08-03 11:47:00')->isInProgress());
  255. $this->assertTrue(CarbonPeriod::create('2019-08-03 11:47:00', '2019-08-15 11:47:00')->isInProgress());
  256. $this->assertTrue(CarbonPeriod::create('2019-08-01', '2019-08-15')->isInProgress());
  257. }
  258. public function testIsset()
  259. {
  260. $this->assertTrue(isset(CarbonPeriod::create('2019-08-01', '2019-08-15')->start));
  261. $this->assertFalse(isset(CarbonPeriod::create('2019-08-01', '2019-08-15')->middle));
  262. }
  263. public function testGet()
  264. {
  265. $this->assertSame(
  266. '2019-08-01',
  267. CarbonPeriod::create('2019-08-01', '2019-08-15')->get('start')->format('Y-m-d')
  268. );
  269. }
  270. public function testUnknownGetter()
  271. {
  272. $this->expectExceptionObject(new UnknownGetterException('middle'));
  273. CarbonPeriod::create('2019-08-01', '2019-08-15')->get('middle');
  274. }
  275. }