123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510 |
- <?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\CarbonInterface;
- use Carbon\CarbonInterval;
- use Carbon\Translator as CarbonTranslator;
- use Symfony\Component\Translation\Loader\ArrayLoader;
- use Symfony\Component\Translation\Translator;
- use Tests\AbstractTestCase;
- use Tests\CarbonInterval\Fixtures\MyCarbonInterval;
- class ForHumansTest extends AbstractTestCase
- {
- protected function tearDown(): void
- {
- parent::tearDown();
- CarbonInterval::setLocale('en');
- }
- public function testGetTranslator()
- {
- /** @var CarbonTranslator $t */
- $t = CarbonInterval::getTranslator();
- $this->assertNotNull($t);
- $this->assertSame('en', $t->getLocale());
- $this->assertSame('en', CarbonInterval::day()->locale());
- }
- public function testResetTranslator()
- {
- /** @var CarbonTranslator $t */
- $t = MyCarbonInterval::getTranslator();
- $this->assertNotNull($t);
- $this->assertSame('en', $t->getLocale());
- $this->assertSame('en', CarbonInterval::day()->locale());
- }
- public function testSetTranslator()
- {
- /** @var CarbonTranslator $ori */
- $ori = CarbonInterval::getTranslator();
- $t = new Translator('fr');
- $t->addLoader('array', new ArrayLoader());
- CarbonInterval::setTranslator($t);
- /** @var CarbonTranslator $t */
- $t = CarbonInterval::getTranslator();
- $this->assertNotNull($t);
- $this->assertSame('fr', $t->getLocale());
- CarbonInterval::setTranslator($ori);
- }
- public function testDumpTranslator()
- {
- $t = new CarbonTranslator('tr_CY');
- $this->assertSame([
- 'locale' => 'tr_CY',
- ], $t->__debugInfo());
- }
- public function testGetLocale()
- {
- CarbonInterval::setLocale('en');
- $this->assertSame('en', CarbonInterval::getLocale());
- }
- public function testSetLocale()
- {
- CarbonInterval::setLocale('en');
- $this->assertSame('en', CarbonInterval::getLocale());
- CarbonInterval::setLocale('fr');
- $this->assertSame('fr', CarbonInterval::getLocale());
- }
- public function testOptions()
- {
- CarbonInterval::setLocale('en');
- $this->assertSame('1 year 2 months ago', CarbonInterval::year()->add(CarbonInterval::months(2))->forHumans(CarbonInterface::DIFF_RELATIVE_TO_NOW));
- $this->assertSame('1 year before', CarbonInterval::year()->add(CarbonInterval::months(2))->forHumans(CarbonInterface::DIFF_RELATIVE_TO_OTHER, 1));
- }
- public function testYear()
- {
- CarbonInterval::setLocale('en');
- $this->assertSame('1 year', CarbonInterval::year()->forHumans());
- }
- public function testYearToString()
- {
- CarbonInterval::setLocale('en');
- $this->assertSame('1 year:abc', CarbonInterval::year().':abc');
- }
- public function testYears()
- {
- CarbonInterval::setLocale('en');
- $this->assertSame('2 years', CarbonInterval::years(2)->forHumans());
- }
- public function testYearsAndMonth()
- {
- CarbonInterval::setLocale('en');
- $this->assertSame('2 years 1 month', CarbonInterval::create(2, 1)->forHumans());
- }
- public function testAll()
- {
- CarbonInterval::setLocale('en');
- $ci = CarbonInterval::create(11, 1, 2, 5, 22, 33, 55)->forHumans();
- $this->assertSame('11 years 1 month 2 weeks 5 days 22 hours 33 minutes 55 seconds', $ci);
- }
- public function testYearsAndMonthInFrench()
- {
- CarbonInterval::setLocale('fr');
- $this->assertSame('2 ans 1 mois', CarbonInterval::create(2, 1)->forHumans());
- }
- public function testYearsAndMonthInGerman()
- {
- CarbonInterval::setLocale('de');
- $this->assertSame('1 Jahr 1 Monat', CarbonInterval::create(1, 1)->forHumans());
- $this->assertSame('2 Jahre 1 Monat', CarbonInterval::create(2, 1)->forHumans());
- }
- public function testYearsAndMonthInBulgarian()
- {
- CarbonInterval::setLocale('bg');
- $this->assertSame('1 година 1 месец', CarbonInterval::create(1, 1)->forHumans());
- $this->assertSame('2 години 1 месец', CarbonInterval::create(2, 1)->forHumans());
- }
- public function testYearsAndMonthInCatalan()
- {
- CarbonInterval::setLocale('ca');
- $this->assertSame('1 any 1 mes', CarbonInterval::create(1, 1)->forHumans());
- $this->assertSame('2 anys 1 mes', CarbonInterval::create(2, 1)->forHumans());
- }
- public function testYearsAndMonthInCzech()
- {
- CarbonInterval::setLocale('cs');
- $this->assertSame('1 rok 1 měsíc', CarbonInterval::create(1, 1)->forHumans());
- $this->assertSame('2 roky 1 měsíc', CarbonInterval::create(2, 1)->forHumans());
- }
- public function testYearsAndMonthInGreek()
- {
- CarbonInterval::setLocale('el');
- $this->assertSame('1 χρόνος 1 μήνας', CarbonInterval::create(1, 1)->forHumans());
- $this->assertSame('2 χρόνια 1 μήνας', CarbonInterval::create(2, 1)->forHumans());
- }
- public function testYearsAndMonthsInDanish()
- {
- CarbonInterval::setLocale('da');
- $this->assertSame('1 år 1 måned', CarbonInterval::create(1, 1)->forHumans());
- $this->assertSame('2 år 1 måned', CarbonInterval::create(2, 1)->forHumans());
- }
- public function testCustomJoin()
- {
- $interval = CarbonInterval::create(1, 1, 0, 1, 1)->locale('fr');
- $this->assertSame('1 an 1 mois 1 jour 1 heure', $interval->forHumans());
- $this->assertSame('1 an, 1 mois, 1 jour et 1 heure', $interval->forHumans([
- 'join' => true,
- ]));
- $this->assertSame('တစ်နှစ် တစ်လ တစ်ရက် တစ်နာရီ', $interval->copy()->locale('my')->forHumans([
- 'join' => true,
- ]));
- $this->assertSame('un an, un mois, un jour, une heure', $interval->forHumans([
- 'join' => ', ',
- 'aUnit' => true,
- ]));
- $this->assertSame('un an et un mois et un jour et aussi une heure', $interval->forHumans([
- 'join' => [' et ', ' et aussi '],
- 'aUnit' => true,
- ]));
- $interval = CarbonInterval::create(1, 1, 0, 1, 1)->locale('en');
- $this->assertSame('1 year 1 month 1 day 1 hour', $interval->forHumans());
- $this->assertSame('1 year, 1 month, 1 day and 1 hour', $interval->forHumans([
- 'join' => true,
- ]));
- $this->assertSame('1 year, 1 month, 1 day, 1 hour', $interval->forHumans([
- 'join' => ', ',
- ]));
- $this->assertSame('a year and a month and a day and also an hour', $interval->forHumans([
- 'join' => [' and ', ' and also '],
- 'aUnit' => true,
- ]));
- $this->assertSame('[1 year;1 month;1 day;1 hour]', $interval->forHumans([
- 'join' => function ($list) {
- return '['.implode(';', $list).']';
- },
- ]));
- }
- public function testChineseJoin()
- {
- $interval = CarbonInterval::create(1, 1, 0, 1, 1)->locale('zh_Hans');
- $this->assertSame('1年1个月1天1小时', $interval->forHumans());
- $this->assertSame('1年1个月1天1小时', $interval->forHumans([
- 'join' => true,
- ]));
- $this->assertSame('1 年 1 个月 1 天 1 小时', $interval->forHumans([
- 'join' => false,
- ]));
- $this->assertSame('1年1个月1天1小时', $interval->forHumans([
- 'join' => '',
- ]));
- $this->assertSame('1 年 1 个月 1 天 1 小时', $interval->forHumans([
- 'join' => ' ',
- ]));
- $this->assertSame('1年-1个月-1天-1小时', $interval->forHumans([
- 'join' => '-',
- ]));
- }
- public function testOptionsAsArray()
- {
- $interval = CarbonInterval::create(1, 1, 0, 1, 1)->locale('fr');
- $this->assertSame('1 an', $interval->forHumans([
- 'join' => 'foo',
- 'parts' => 1,
- ]));
- $this->assertSame('il y a un an', $interval->forHumans([
- 'join' => 'foo',
- 'aUnit' => true,
- 'parts' => 1,
- 'syntax' => CarbonInterface::DIFF_RELATIVE_TO_NOW,
- ]));
- $interval = CarbonInterval::day();
- $this->assertSame('1d', $interval->forHumans([
- 'short' => true,
- ]));
- $interval = CarbonInterval::day();
- $this->assertSame('yesterday', $interval->forHumans([
- 'parts' => 1,
- 'syntax' => CarbonInterface::DIFF_RELATIVE_TO_NOW,
- 'options' => CarbonInterface::ONE_DAY_WORDS,
- ]));
- }
- public function testRoundYears()
- {
- CarbonInterval::setLocale('en');
- $interval = CarbonInterval::years(2)->months(11);
- $this->assertSame('3 years', $interval->forHumans(['parts' => 1, 'options' => CarbonInterface::ROUND]));
- $interval = CarbonInterval::years(2)->months(5)->days(70);
- $this->assertSame('3 years', $interval->forHumans(['parts' => 1, 'options' => CarbonInterface::ROUND]));
- }
- public function testRoundMonths()
- {
- CarbonInterval::setLocale('en');
- $interval = CarbonInterval::months(2)->weeks(3);
- $this->assertSame('3 months', $interval->forHumans(['parts' => 1, 'options' => CarbonInterface::ROUND]));
- }
- public function testRoundUp()
- {
- CarbonInterval::setLocale('en');
- $interval = CarbonInterval::days(2)->hours(23);
- $this->assertSame('3 days', $interval->forHumans(['parts' => 1, 'options' => CarbonInterface::ROUND]));
- }
- public function testRoundDown()
- {
- CarbonInterval::setLocale('en');
- $interval = CarbonInterval::days(2)->hours(11);
- $this->assertSame('2 days', $interval->forHumans(['parts' => 1, 'options' => CarbonInterface::ROUND]));
- }
- public function testRoundMinutes()
- {
- CarbonInterval::setLocale('en');
- $interval = CarbonInterval::days(2)->hours(11)->minutes(15);
- $this->assertSame('2 days 11 hours', $interval->forHumans(['parts' => 2, 'options' => CarbonInterface::ROUND]));
- }
- public function testRoundDownWhenNextIntervalIsNonSequential()
- {
- CarbonInterval::setLocale('en');
- $interval = CarbonInterval::days(2)->minutes(59);
- $this->assertSame('2 days', $interval->forHumans(['parts' => 1, 'options' => CarbonInterface::ROUND]));
- }
- public function testRoundMultipleParts()
- {
- CarbonInterval::setLocale('en');
- $interval = CarbonInterval::days(2)->minutes(45)->seconds(59);
- $this->assertSame('2 days 46 minutes', $interval->forHumans(['parts' => 2, 'options' => CarbonInterface::ROUND]));
- }
- public function testRoundMultiplePartsGap()
- {
- CarbonInterval::setLocale('en');
- $interval = CarbonInterval::days(2)->seconds(59);
- $this->assertSame('2 days 59 seconds', $interval->forHumans(['parts' => 2]));
- $this->assertSame('2 days 59 seconds', $interval->forHumans(['parts' => 2, 'options' => CarbonInterface::ROUND]));
- $this->assertSame('2 days', $interval->forHumans(['parts' => 1, 'options' => CarbonInterface::ROUND]));
- }
- public function testRoundWeeks()
- {
- CarbonInterval::setLocale('en');
- $interval = CarbonInterval::days(13);
- $this->assertSame('2 weeks', $interval->forHumans(['parts' => 1, 'options' => CarbonInterface::ROUND]));
- }
- public function testRoundWeeksWithMultipleParts()
- {
- CarbonInterval::setLocale('en');
- $interval = CarbonInterval::days(13);
- $this->assertSame('1 week 6 days', $interval->forHumans(['parts' => 2, 'options' => CarbonInterface::ROUND]));
- }
- public function testRoundOverflowNonSequentialRoundUp()
- {
- CarbonInterval::setLocale('en');
- $interval = CarbonInterval::years(2)->months(35);
- $this->assertSame('5 years', $interval->forHumans(['parts' => 1, 'options' => CarbonInterface::ROUND]));
- }
- public function testRoundOverflowNonSequentialRoundDown()
- {
- CarbonInterval::setLocale('en');
- $interval = CarbonInterval::years(2)->months(37);
- $this->assertSame('5 years', $interval->forHumans(['parts' => 1, 'options' => CarbonInterface::ROUND]));
- }
- public function testRoundCarryOverDoesntMatter()
- {
- CarbonInterval::setLocale('en');
- $interval = CarbonInterval::days(2)->hours(11)->minutes(59);
- $this->assertSame('2 days', $interval->forHumans(['parts' => 1, 'options' => CarbonInterface::ROUND]));
- $interval = CarbonInterval::days(2)->minutes(780);
- $this->assertSame('3 days', $interval->forHumans(['parts' => 1, 'options' => CarbonInterface::ROUND]));
- $interval = CarbonInterval::days(2)->minutes(59)->seconds(58);
- $this->assertSame('2 days 1 hour', $interval->forHumans(['parts' => 2, 'options' => CarbonInterface::ROUND]));
- $interval = CarbonInterval::days(2)->minutes(59)->seconds(1);
- $this->assertSame('2 days 1 hour', $interval->forHumans(['parts' => 2, 'options' => CarbonInterface::CEIL]));
- $interval = CarbonInterval::days(2)->minutes(59)->seconds(58);
- $this->assertSame('2 days 59 minutes', $interval->forHumans(['parts' => 2, 'options' => CarbonInterface::FLOOR]));
- // Floor is not the default behavior, see the difference below:
- $interval = CarbonInterval::days(2)->minutes(59)->seconds(62);
- $this->assertSame('2 days 1 hour', $interval->forHumans(['parts' => 2, 'options' => CarbonInterface::FLOOR]));
- $interval = CarbonInterval::days(2)->minutes(59)->seconds(62);
- $this->assertSame('2 days 59 minutes', $interval->forHumans(['parts' => 2]));
- $start = Carbon::create(2009, 9)->startOfMonth();
- $end = Carbon::create(2012, 2)->endOfMonth();
- $interval = CarbonInterval::instance($start->diff($end))->forHumans(
- Carbon::DIFF_ABSOLUTE,
- false,
- 2,
- Carbon::CEIL
- );
- $this->assertSame('2 years 6 months', $interval);
- $interval = CarbonInterval::months(2)->days(30);
- $this->assertSame('3 months', $interval->forHumans(['parts' => 1, 'options' => CarbonInterface::ROUND]));
- $interval = CarbonInterval::months(2)->days(31);
- $this->assertSame('3 months', $interval->forHumans(['parts' => 1, 'options' => CarbonInterface::ROUND]));
- $interval = CarbonInterval::months(2)->days(32);
- $this->assertSame('3 months', $interval->forHumans(['parts' => 1, 'options' => CarbonInterface::ROUND]));
- $interval = CarbonInterval::months(2)->days(30);
- $this->assertSame('3 months', $interval->forHumans(['parts' => 1, 'options' => CarbonInterface::CEIL]));
- $interval = CarbonInterval::months(2)->days(31);
- $this->assertSame('3 months', $interval->forHumans(['parts' => 1, 'options' => CarbonInterface::CEIL]));
- $interval = CarbonInterval::months(2)->days(32);
- $this->assertSame('4 months', $interval->forHumans(['parts' => 1, 'options' => CarbonInterface::CEIL]));
- }
- public function testCeilShortMonth()
- {
- Carbon::setTestNow('2022-02-08T10:27:03Z');
- $this->assertSame(
- '4 weeks ago',
- Carbon::parse('2022-01-11 15:36:29')->diffForHumans(['parts' => 1, 'options' => Carbon::CEIL])
- );
- $this->assertSame(
- '1 month ago',
- Carbon::parse('2022-01-10 16:57:38')->diffForHumans(['parts' => 1, 'options' => Carbon::CEIL])
- );
- }
- public function testSkipUnits()
- {
- CarbonInterval::setLocale('en');
- $interval = CarbonInterval::days(15)->hours(11)->minutes(15);
- $this->assertSame('15 days 11 hours', $interval->forHumans([
- 'parts' => 2,
- 'skip' => 'week',
- ]));
- $this->assertSame('15 days 675 minutes', $interval->forHumans([
- 'parts' => 2,
- 'skip' => ['weeks', 'hours'],
- ]));
- $interval = CarbonInterval::days(15)->hours(11)->minutes(15);
- $this->assertSame('15 days 675 minutes', $interval->forHumans([
- 'parts' => 2,
- 'skip' => ['weeks', 'hours'],
- ]));
- $factors = CarbonInterval::getCascadeFactors();
- CarbonInterval::setCascadeFactors(['weeks' => [5, 'days']]);
- $interval = CarbonInterval::days(15)->hours(11)->minutes(15);
- $this->assertSame('15 days 675 minutes', $interval->forHumans([
- 'parts' => 2,
- 'skip' => ['weeks', 'hours'],
- ]));
- CarbonInterval::setCascadeFactors([
- 'weeks' => [5, 'days'],
- 'hours' => [30, 'minutes'],
- ]);
- $interval = CarbonInterval::days(15)->hours(11)->minutes(15);
- $this->assertSame('15 days 345 minutes', $interval->forHumans([
- 'parts' => 2,
- 'skip' => ['weeks', 'hours'],
- ]));
- CarbonInterval::setCascadeFactors($factors);
- }
- public function testGetValuesSequence()
- {
- $this->assertSame([], CarbonInterval::days(0)->getValuesSequence());
- }
- public function testMinimumUnitDefault()
- {
- CarbonInterval::setLocale('en');
- $interval = CarbonInterval::fromString('1 second 114 milliseconds');
- $this->assertSame('1 second', $interval->forHumans(['parts' => 3]));
- }
- public function testMinimumUnitHours()
- {
- CarbonInterval::setLocale('en');
- $interval = CarbonInterval::fromString('1 hour 1 second 114 milliseconds');
- $this->assertSame('1 hour', $interval->forHumans(['parts' => 3, 'minimumUnit' => 'hour']));
- }
- public function testMinimumUnitMillisecondsShort()
- {
- CarbonInterval::setLocale('en');
- $interval = CarbonInterval::fromString('1 second 114 milliseconds');
- $this->assertSame('1s 114ms', $interval->forHumans(['parts' => 3, 'short' => true, 'minimumUnit' => 'ms']));
- }
- public function testMinimumUnitMicroseconds()
- {
- CarbonInterval::setLocale('fr');
- $interval = CarbonInterval::fromString('1s 114ms 584µs');
- $this->assertEquals(
- '1 seconde, 114 millisecondes et 584 microsecondes',
- $interval->forHumans(['parts' => 3, 'join' => true, 'minimumUnit' => 'µs'])
- );
- }
- public function testMinimumUnitMillisecondsInFrenchAndGerman()
- {
- $interval = CarbonInterval::fromString('98756 milliseconds')->cascade();
- $this->assertEquals(
- 'une minute, 38 secondes et 756 millisecondes',
- $interval->locale('fr')->forHumans(['parts' => 3, 'minimumUnit' => 'ms', 'join' => true, 'aUnit' => true])
- );
- $this->assertEquals(
- 'eine Minute, 38 Sekunden und 756 Millisekunden',
- $interval->locale('de')->forHumans(['parts' => 3, 'minimumUnit' => 'ms', 'join' => true, 'aUnit' => true])
- );
- }
- public function testMinimumUnitNoInterval()
- {
- CarbonInterval::setLocale('en');
- $interval = CarbonInterval::fromString('1 second 114 milliseconds');
- // Test with and without NO_ZERO_DIFF
- $this->assertSame('1 hour', $interval->forHumans(['parts' => 3, 'minimumUnit' => 'hour', 'options' => CarbonInterface::NO_ZERO_DIFF]));
- $this->assertSame('0 hours', $interval->forHumans(['parts' => 3, 'minimumUnit' => 'hour', 'options' => 0]));
- }
- }
|