SubTest.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  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\CarbonImmutable as Carbon;
  13. use Carbon\CarbonInterval;
  14. use DateTimeImmutable;
  15. use Tests\AbstractTestCase;
  16. class SubTest extends AbstractTestCase
  17. {
  18. public function testSubMethod()
  19. {
  20. $this->assertSame(1973, Carbon::createFromDate(1975)->sub(2, 'year')->year);
  21. $this->assertSame(1973, Carbon::createFromDate(1975)->sub('year', 2)->year);
  22. $this->assertSame(1973, Carbon::createFromDate(1975)->sub('2 years')->year);
  23. $lastNegated = null;
  24. $date = Carbon::createFromDate(1975)->sub(
  25. function (DateTimeImmutable $date, bool $negated = false) use (&$lastNegated): DateTimeImmutable {
  26. $lastNegated = $negated;
  27. return new DateTimeImmutable($date->format('Y-m-d H:i:s').' - 2 years');
  28. }
  29. );
  30. $this->assertInstanceOf(Carbon::class, $date);
  31. $this->assertSame(1973, $date->year);
  32. $this->assertTrue($lastNegated);
  33. $this->assertSame(1973, Carbon::createFromDate(1975)->subtract(2, 'year')->year);
  34. $this->assertSame(1973, Carbon::createFromDate(1975)->subtract('year', 2)->year);
  35. $this->assertSame(1973, Carbon::createFromDate(1975)->subtract('2 years')->year);
  36. $lastNegated = null;
  37. $this->assertSame(1973, Carbon::createFromDate(1975)->subtract(
  38. function (DateTimeImmutable $date, bool $negated = false) use (&$lastNegated): DateTimeImmutable {
  39. $lastNegated = $negated;
  40. return new DateTimeImmutable($date->format('Y-m-d H:i:s').' - 2 years');
  41. }
  42. )->year);
  43. $this->assertTrue($lastNegated);
  44. /** @var CarbonInterval $interval */
  45. $interval = include __DIR__.'/../Fixtures/dynamicInterval.php';
  46. $originalDate = Carbon::parse('2020-06-08');
  47. $date = $originalDate->sub($interval);
  48. $this->assertInstanceOf(Carbon::class, $date);
  49. $this->assertSame('2020-05-31', $date->format('Y-m-d'));
  50. $this->assertNotSame($originalDate, $date);
  51. $date = Carbon::parse('2020-07-16')->subtract($interval);
  52. $this->assertInstanceOf(Carbon::class, $date);
  53. $this->assertSame('2020-06-30', $date->format('Y-m-d'));
  54. }
  55. public function testSubYearsPositive()
  56. {
  57. $this->assertSame(1974, Carbon::createFromDate(1975)->subYears(1)->year);
  58. }
  59. public function testSubYearsZero()
  60. {
  61. $this->assertSame(1975, Carbon::createFromDate(1975)->subYears(0)->year);
  62. }
  63. public function testSubYearsNegative()
  64. {
  65. $this->assertSame(1976, Carbon::createFromDate(1975)->subYears(-1)->year);
  66. }
  67. public function testSubYear()
  68. {
  69. $this->assertSame(1974, Carbon::createFromDate(1975)->subYear()->year);
  70. $this->assertSame(1973, Carbon::createFromDate(1975)->sub(2, 'year')->year);
  71. $this->assertSame(1973, Carbon::createFromDate(1975)->sub(2, 'years')->year);
  72. $this->assertSame(1973, Carbon::createFromDate(1975)->sub(CarbonInterval::years(2))->year);
  73. }
  74. public function testSubMonthsPositive()
  75. {
  76. $this->assertSame(12, Carbon::createFromDate(1975, 1, 1)->subMonths(1)->month);
  77. }
  78. public function testSubMonthsZero()
  79. {
  80. $this->assertSame(1, Carbon::createFromDate(1975, 1, 1)->subMonths(0)->month);
  81. }
  82. public function testSubMonthsNegative()
  83. {
  84. $this->assertSame(2, Carbon::createFromDate(1975, 1, 1)->subMonths(-1)->month);
  85. }
  86. public function testSubMonth()
  87. {
  88. $this->assertSame(12, Carbon::createFromDate(1975, 1, 1)->subMonth()->month);
  89. }
  90. public function testSubDaysPositive()
  91. {
  92. $this->assertSame(30, Carbon::createFromDate(1975, 5, 1)->subDays(1)->day);
  93. }
  94. public function testSubDaysZero()
  95. {
  96. $this->assertSame(1, Carbon::createFromDate(1975, 5, 1)->subDays(0)->day);
  97. }
  98. public function testSubDaysNegative()
  99. {
  100. $this->assertSame(2, Carbon::createFromDate(1975, 5, 1)->subDays(-1)->day);
  101. }
  102. public function testSubDay()
  103. {
  104. $this->assertSame(30, Carbon::createFromDate(1975, 5, 1)->subDay()->day);
  105. }
  106. public function testSubWeekdaysPositive()
  107. {
  108. $this->assertSame(22, Carbon::createFromDate(2012, 1, 4)->subWeekdays(9)->day);
  109. }
  110. public function testSubWeekdaysZero()
  111. {
  112. $this->assertSame(4, Carbon::createFromDate(2012, 1, 4)->subWeekdays(0)->day);
  113. }
  114. public function testSubWeekdaysNegative()
  115. {
  116. $this->assertSame(13, Carbon::createFromDate(2012, 1, 31)->subWeekdays(-9)->day);
  117. }
  118. public function testSubWeekday()
  119. {
  120. $this->assertSame(6, Carbon::createFromDate(2012, 1, 9)->subWeekday()->day);
  121. }
  122. public function testSubWeekdayDuringWeekend()
  123. {
  124. $this->assertSame(6, Carbon::createFromDate(2012, 1, 8)->subWeekday()->day);
  125. }
  126. public function testSubWeeksPositive()
  127. {
  128. $this->assertSame(14, Carbon::createFromDate(1975, 5, 21)->subWeeks(1)->day);
  129. }
  130. public function testSubWeeksZero()
  131. {
  132. $this->assertSame(21, Carbon::createFromDate(1975, 5, 21)->subWeeks(0)->day);
  133. }
  134. public function testSubWeeksNegative()
  135. {
  136. $this->assertSame(28, Carbon::createFromDate(1975, 5, 21)->subWeeks(-1)->day);
  137. }
  138. public function testSubWeek()
  139. {
  140. $this->assertSame(14, Carbon::createFromDate(1975, 5, 21)->subWeek()->day);
  141. }
  142. public function testSubHoursPositive()
  143. {
  144. $this->assertSame(23, Carbon::createFromTime(0)->subHours(1)->hour);
  145. }
  146. public function testSubHoursZero()
  147. {
  148. $this->assertSame(0, Carbon::createFromTime(0)->subHours(0)->hour);
  149. }
  150. public function testSubHoursNegative()
  151. {
  152. $this->assertSame(1, Carbon::createFromTime(0)->subHours(-1)->hour);
  153. }
  154. public function testSubHour()
  155. {
  156. $this->assertSame(23, Carbon::createFromTime(0)->subHour()->hour);
  157. }
  158. public function testSubMinutesPositive()
  159. {
  160. $this->assertSame(59, Carbon::createFromTime(0, 0)->subMinutes(1)->minute);
  161. }
  162. public function testSubMinutesZero()
  163. {
  164. $this->assertSame(0, Carbon::createFromTime(0, 0)->subMinutes(0)->minute);
  165. }
  166. public function testSubMinutesNegative()
  167. {
  168. $this->assertSame(1, Carbon::createFromTime(0, 0)->subMinutes(-1)->minute);
  169. }
  170. public function testSubMinute()
  171. {
  172. $this->assertSame(59, Carbon::createFromTime(0, 0)->subMinute()->minute);
  173. }
  174. public function testSubSecondsPositive()
  175. {
  176. $this->assertSame(59, Carbon::createFromTime(0, 0, 0)->subSeconds(1)->second);
  177. }
  178. public function testSubSecondsZero()
  179. {
  180. $this->assertSame(0, Carbon::createFromTime(0, 0, 0)->subSeconds(0)->second);
  181. }
  182. public function testSubSecondsNegative()
  183. {
  184. $this->assertSame(1, Carbon::createFromTime(0, 0, 0)->subSeconds(-1)->second);
  185. }
  186. public function testSubSecond()
  187. {
  188. $this->assertSame(59, Carbon::createFromTime(0, 0, 0)->subSecond()->second);
  189. }
  190. public function testSubMillisecondsPositive()
  191. {
  192. $this->assertSame(999, Carbon::createFromTime(0, 0, 0)->subMilliseconds(1)->millisecond);
  193. }
  194. public function testSubMillisecondsZero()
  195. {
  196. $this->assertSame(100, Carbon::createFromTime(0, 0, 0.1)->subMilliseconds(0)->millisecond);
  197. }
  198. public function testSubMillisecondsNegative()
  199. {
  200. $this->assertSame(1, Carbon::createFromTime(0, 0, 0)->subMilliseconds(-1)->millisecond);
  201. $this->assertSame(101, Carbon::createFromTime(0, 0, 0.1)->subMilliseconds(-1)->millisecond);
  202. }
  203. public function testSubMillisecond()
  204. {
  205. $this->assertSame(99, Carbon::createFromTime(0, 0, 0.1)->subMillisecond()->millisecond);
  206. }
  207. public function testSubMicrosecondsPositive()
  208. {
  209. $this->assertSame(999999, Carbon::createFromTime(0, 0, 0)->subMicroseconds(1)->microsecond);
  210. }
  211. public function testSubMicrosecondsZero()
  212. {
  213. $this->assertSame(100000, Carbon::createFromTime(0, 0, 0.1)->subMicroseconds(0)->microsecond);
  214. }
  215. public function testSubMicrosecondsNegative()
  216. {
  217. $this->assertSame(1, Carbon::createFromTime(0, 0, 0)->subMicroseconds(-1)->microsecond);
  218. $this->assertSame(100001, Carbon::createFromTime(0, 0, 0.1)->subMicroseconds(-1)->microsecond);
  219. }
  220. public function testSubMicrosecond()
  221. {
  222. $this->assertSame(99999, Carbon::createFromTime(0, 0, 0.1)->subMicrosecond()->microsecond);
  223. }
  224. /**
  225. * Test non plural methods with non default args.
  226. */
  227. public function testSubYearPassingArg()
  228. {
  229. /** @var mixed $date */
  230. $date = Carbon::createFromDate(1975);
  231. $this->assertSame(1973, $date->subYear(2)->year);
  232. }
  233. public function testSubMonthPassingArg()
  234. {
  235. /** @var mixed $date */
  236. $date = Carbon::createFromDate(1975, 5, 1);
  237. $this->assertSame(3, $date->subMonth(2)->month);
  238. }
  239. public function testSubMonthNoOverflowPassingArg()
  240. {
  241. /** @var mixed $date */
  242. $date = Carbon::createFromDate(2011, 4, 30);
  243. $date = $date->subMonthNoOverflow(2);
  244. $this->assertSame(2, $date->month);
  245. $this->assertSame(28, $date->day);
  246. }
  247. public function testSubDayPassingArg()
  248. {
  249. /** @var mixed $date */
  250. $date = Carbon::createFromDate(1975, 5, 10);
  251. $this->assertSame(8, $date->subDay(2)->day);
  252. }
  253. public function testSubHourPassingArg()
  254. {
  255. /** @var mixed $date */
  256. $date = Carbon::createFromTime(0);
  257. $this->assertSame(22, $date->subHour(2)->hour);
  258. }
  259. public function testSubMinutePassingArg()
  260. {
  261. /** @var mixed $date */
  262. $date = Carbon::createFromTime(0);
  263. $this->assertSame(58, $date->subMinute(2)->minute);
  264. }
  265. public function testSubSecondPassingArg()
  266. {
  267. /** @var mixed $date */
  268. $date = Carbon::createFromTime(0);
  269. $this->assertSame(58, $date->subSecond(2)->second);
  270. }
  271. }