123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- <?php
- declare(strict_types=1);
- /**
- * This file is part of the Carbon package.
- *
- * (c) Brian Nesbitt <brian@nesbot.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Tests\CarbonInterval;
- use Carbon\Carbon;
- use Carbon\CarbonInterval;
- use DateInterval;
- use DateTime;
- use DateTimeImmutable;
- use Generator;
- use InvalidArgumentException;
- use Tests\AbstractTestCase;
- class AddTest extends AbstractTestCase
- {
- public function testAdd()
- {
- $ci = CarbonInterval::create(4, 3, 6, 7, 8, 10, 11)->add(new DateInterval('P2Y1M5DT22H33M44S'));
- $this->assertCarbonInterval($ci, 6, 4, 54, 30, 43, 55);
- }
- /**
- * @requires PHP >= 8.0
- */
- public function testNamedParameters()
- {
- $ci = eval("return \Carbon\CarbonInterval::years(years: 3)->addYears(years: 4);");
- $this->assertCarbonInterval($ci, 7);
- $ci = eval("return \Carbon\CarbonInterval::months(months: 3)->addMonths(months: 4);");
- $this->assertCarbonInterval($ci, 0, 7);
- $ci = eval("return \Carbon\CarbonInterval::weeks(weeks: 3)->addWeeks(weeks: 4);");
- $this->assertCarbonInterval($ci, 0, 0, 7 * 7);
- $ci = eval("return \Carbon\CarbonInterval::days(days: 3)->addDays(days: 4);");
- $this->assertCarbonInterval($ci, 0, 0, 7);
- $ci = eval("return \Carbon\CarbonInterval::hours(hours: 3)->addHours(hours: 4);");
- $this->assertCarbonInterval($ci, 0, 0, 0, 7);
- $ci = eval("return \Carbon\CarbonInterval::minutes(minutes: 3)->addMinutes(minutes: 4);");
- $this->assertCarbonInterval($ci, 0, 0, 0, 0, 7);
- $ci = eval("return \Carbon\CarbonInterval::seconds(seconds: 3)->addSeconds(seconds: 4);");
- $this->assertCarbonInterval($ci, 0, 0, 0, 0, 0, 7);
- $ci = eval("return \Carbon\CarbonInterval::milliseconds(milliseconds: 3)->addMilliseconds(milliseconds: 4);");
- $this->assertCarbonInterval($ci, 0, 0, 0, 0, 0, 0, 7000);
- $ci = eval("return \Carbon\CarbonInterval::microseconds(microseconds: 3)->addMicroseconds(microseconds: 4);");
- $this->assertCarbonInterval($ci, 0, 0, 0, 0, 0, 0, 7);
- }
- public function testAddWithDiffDateInterval()
- {
- $diff = Carbon::now()->diff(Carbon::now()->addWeeks(3));
- $ci = CarbonInterval::create(4, 3, 6, 7, 8, 10, 11)->add($diff);
- $this->assertCarbonInterval($ci, 4, 3, 70, 8, 10, 11);
- }
- public function testAddWithNegativeDiffDateInterval()
- {
- $diff = Carbon::now()->diff(Carbon::now()->subWeeks(3));
- $ci = CarbonInterval::create(4, 3, 6, 7, 8, 10, 11)->add($diff);
- $this->assertCarbonInterval($ci, 4, 3, 28, 8, 10, 11);
- }
- public function testAddMicroseconds()
- {
- $diff = Carbon::now()->diff(Carbon::now()->addDays(3)->addMicroseconds(111222));
- $ci = CarbonInterval::create(1, 0, 0, 2, 0, 0, 0, 222333)->add($diff);
- if ($ci->seconds === 1) {
- $ci->seconds--;
- $ci->microseconds += 1000000;
- }
- $this->assertCarbonInterval($ci, 1, 0, 5, 0, 0, 0, 333555);
- $diff = Carbon::now()->diff(Carbon::now()->addDays(3));
- $ci = CarbonInterval::create(1, 0, 0, 2, 0, 0, 0, 222333)->add($diff);
- $this->assertCarbonInterval($ci, 1, 0, 5, 0, 0, 0, 222333);
- $diff = Carbon::now()->diff(Carbon::now()->addDays(3)->addMicroseconds(111222));
- $ci = CarbonInterval::create(1, 0, 0, 2, 0, 0, 0)->add($diff);
- if ($ci->seconds === 1) {
- $ci->seconds--;
- $ci->microseconds += 1000000;
- }
- $this->assertCarbonInterval($ci, 1, 0, 5, 0, 0, 0, 111222);
- }
- public function testAddWithRawDiffDateInterval()
- {
- date_default_timezone_set('UTC');
- $date = new DateTime();
- $diff = $date->diff((clone $date)->modify('3 weeks'));
- $ci = CarbonInterval::create(4, 3, 6, 7, 8, 10, 11)->add($diff);
- $this->assertCarbonInterval($ci, 4, 3, 70, 8, 10, 11);
- }
- public function testAddWithRawNegativeDiffDateInterval()
- {
- date_default_timezone_set('UTC');
- $date = new DateTime();
- $diff = $date->diff((clone $date)->modify('-3 weeks'));
- $ci = CarbonInterval::create(4, 3, 6, 7, 8, 10, 11)->add($diff);
- $this->assertCarbonInterval($ci, 4, 3, 28, 8, 10, 11);
- }
- public static function dataForAddsResults(): Generator
- {
- yield [5, 2, 7];
- yield [-5, -2, -7];
- yield [-5, 2, -3];
- yield [5, -2, 3];
- yield [2, 5, 7];
- yield [-2, -5, -7];
- yield [-2, 5, 3];
- yield [2, -5, -3];
- }
- /**
- * @dataProvider \Tests\CarbonInterval\AddTest::dataForAddsResults
- *
- * @param int $base
- * @param int $increment
- * @param int $expectedResult
- */
- public function testAddSign($base, $increment, $expectedResult)
- {
- $interval = new CarbonInterval();
- $interval->hours(abs($base));
- if ($base < 0) {
- $interval->invert();
- }
- $add = new CarbonInterval();
- $add->hours(abs($increment));
- if ($increment < 0) {
- $add->invert();
- }
- $interval->add($add);
- $this->assertGreaterThanOrEqual(0, $interval->hours);
- $actualResult = ($interval->invert ? -1 : 1) * $interval->hours;
- $this->assertSame($expectedResult, $actualResult);
- }
- public function testAddAndSubMultipleFormats()
- {
- $this->assertCarbonInterval(CarbonInterval::day()->add('hours', 3), 0, 0, 1, 3, 0, 0);
- $this->assertCarbonInterval(CarbonInterval::day()->add(5, 'hours'), 0, 0, 1, 5, 0, 0);
- $this->assertCarbonInterval(CarbonInterval::day()->add(3, '4 hours'), 0, 0, 1, 12, 0, 0);
- $this->assertCarbonInterval(CarbonInterval::day()->add(-5, 'hours'), 0, 0, 1, -5, 0, 0);
- $this->assertCarbonInterval(CarbonInterval::hours(4)->add('hour'), 0, 0, 0, 5, 0, 0);
- $this->assertCarbonInterval(CarbonInterval::hours(4)->add(new DateInterval('P5D')), 0, 0, 5, 4, 0, 0);
- $this->assertCarbonInterval(CarbonInterval::hours(4)->add(CarbonInterval::minutes(30)), 0, 0, 0, 4, 30, 0);
- $this->assertCarbonInterval(CarbonInterval::day()->sub('hours', 3), 0, 0, 1, -3, 0, 0);
- $this->assertCarbonInterval(CarbonInterval::day()->subtract(5, 'hours'), 0, 0, 1, -5, 0, 0);
- $this->assertCarbonInterval(CarbonInterval::day()->subtract(3, '4 hours'), 0, 0, 1, -12, 0, 0);
- $this->assertCarbonInterval(CarbonInterval::day()->subtract(-5, 'hours'), 0, 0, 1, 5, 0, 0);
- $this->assertCarbonInterval(CarbonInterval::hours(4)->sub('hour'), 0, 0, 0, 3, 0, 0);
- $this->assertCarbonInterval(CarbonInterval::hours(4)->subtract(new DateInterval('P5D')), 0, 0, -5, 4, 0, 0);
- $this->assertCarbonInterval(CarbonInterval::hours(4)->sub(CarbonInterval::minutes(30)), 0, 0, 0, 4, -30, 0);
- }
- public function testAddWrongFormat()
- {
- $this->expectExceptionObject(new InvalidArgumentException(
- 'This type of data cannot be added/subtracted.'
- ));
- CarbonInterval::day()->add(Carbon::now());
- }
- public function testConvertDate()
- {
- $this->assertCarbon(CarbonInterval::days(3)->convertDate(new DateTime('2020-06-14')), 2020, 6, 17, 0, 0, 0);
- $this->assertCarbon(CarbonInterval::days(3)->convertDate(new DateTimeImmutable('2020-06-14')), 2020, 6, 17, 0, 0, 0);
- $this->assertCarbon(CarbonInterval::days(3)->convertDate(new DateTime('2020-06-14'), true), 2020, 6, 11, 0, 0, 0);
- $this->assertCarbon(CarbonInterval::days(3)->convertDate(new DateTimeImmutable('2020-06-14'), true), 2020, 6, 11, 0, 0, 0);
- }
- public function testMagicAddAndSubMethods()
- {
- $this->assertCarbonInterval(CarbonInterval::days(3)->addWeeks(2), 0, 0, 17, 0, 0, 0);
- $this->assertCarbonInterval(CarbonInterval::weeks(3)->addDays(2), 0, 0, 23, 0, 0, 0);
- $this->assertCarbonInterval(CarbonInterval::weeks(3)->subDays(2), 0, 0, 19, 0, 0, 0);
- $this->assertCarbonInterval(CarbonInterval::hours(2)->subMinutes(15), 0, 0, 0, 2, -15, 0);
- $this->assertCarbonInterval(CarbonInterval::hours(2)->subMinutes(15)->cascade(), 0, 0, 0, 1, 45, 0);
- }
- public function testPlus()
- {
- $this->assertCarbonInterval(CarbonInterval::days(3)->plus(0, 0, 2, 0, 26), 0, 0, 17, 26, 0, 0);
- $this->assertCarbonInterval(CarbonInterval::days(3)->plus(0, 0, 0.25), 0, 0, 4, 18, 0, 0);
- $interval = CarbonInterval::days(3)->plus(0, 0, 0.25)->plus(0, 0, 0.25)->cascade();
- $this->assertCarbonInterval($interval, 0, 0, 6, 12, 0, 0);
- }
- /**
- * @requires PHP >= 8.0
- */
- public function testPlusWithPHP8Syntax()
- {
- $interval = eval('use Carbon\CarbonInterval;return CarbonInterval::days(3)->plus(weeks: 2, hours: 26);');
- $this->assertCarbonInterval($interval, 0, 0, 17, 26, 0, 0);
- }
- public function testMinus()
- {
- $this->assertCarbonInterval(CarbonInterval::days(3)->minus(0, 0, 2, 0, 26), 0, 0, 11, 26, 0, 0, 0, true);
- }
- /**
- * @requires PHP >= 8.0
- */
- public function testMinusWithPHP8Syntax()
- {
- $interval = eval('use Carbon\CarbonInterval;return CarbonInterval::days(3)->minus(weeks: 2, hours: 26);');
- $this->assertCarbonInterval($interval, 0, 0, 11, 26, 0, 0, 0, true);
- }
- }
|