p2 project
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

510 lines
19 KiB

<?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]));
}
}