oldTimezone = date_default_timezone_get(); date_default_timezone_set('Europe/Vienna'); } protected function tearDown(): void { if ($this->oldTimezone !== null) { date_default_timezone_set($this->oldTimezone); } $this->oldTimezone = null; } public function testDurationFormattingWithTimesheet(): void { $sut = $this->getSut('en'); $timesheet = (new Timesheet()) ->setBegin(new \DateTime('2020-07-09 08:00:00', new \DateTimeZone('Europe/Vienna'))) ->setEnd(new \DateTime('2020-07-09 10:37:17', new \DateTimeZone('Europe/Vienna'))) ->setDuration(9437); self::assertSame('2:37', $sut->duration($timesheet)); self::assertSame('2.62', $sut->duration($timesheet, true)); self::assertSame('2.62', $sut->durationDecimal($timesheet)); } public function testDurationDecimalWorksAfterAmountFormatting(): void { $sut = $this->getSut('de'); self::assertSame('1.234,5', $sut->amount(1234.5)); self::assertSame('2,62', $sut->durationDecimal(9437)); } public function testAmountAndMoneyFormatting(): void { $sut = $this->getSut('en'); self::assertSame('0', $sut->amount(null)); self::assertSame('2,345.009', $sut->amount(2345.009)); self::assertSame('€2,345.01', $sut->money(2345.009, 'EUR')); self::assertSame('2,345.01', $sut->money(2345.009, 'EUR', false)); } public function testCurrencyFormattingFallsBackToInput(): void { $sut = $this->getSut('de'); self::assertSame('', $sut->currency(null)); self::assertSame('€', $sut->currency('eur')); self::assertSame('INVALID', $sut->currency('INVALID')); } public function testDateAndTimeFormatting(): void { $sut = $this->getSut('de'); $date = new \DateTimeImmutable('1980-12-14 13:27:55', new \DateTimeZone('Europe/Vienna')); self::assertSame('14.12.1980', $sut->dateShort($date)); self::assertSame('14.12.1980 13:27:55', $sut->dateTime($date)); self::assertSame('1980-12-14T13:27:55+01:00', $sut->dateFormat($date, 'c')); self::assertSame('13:27:55', $sut->time($date)); } public function testInvalidDateInputReturnsNull(): void { $sut = $this->getSut('en'); self::assertNull($sut->dateShort('not-a-date')); self::assertNull($sut->dateTime('not-a-date')); self::assertNull($sut->dateFormat('not-a-date', 'c')); self::assertNull($sut->time('not-a-date')); } public function testLocalizedNames(): void { $sut = $this->getSut('en'); $date = new \DateTimeImmutable('2020-07-09 12:00:00', new \DateTimeZone('Europe/Vienna')); self::assertSame('July', $sut->monthName($date)); self::assertSame('July 2020', $sut->monthName($date, true)); self::assertSame('Q3', $sut->quarterName($date)); self::assertSame('Q3 2020', $sut->quarterName($date, true)); self::assertSame('Thursday', $sut->dayName($date)); self::assertSame('Thu', $sut->dayName($date, true)); } private function getSut(string $locale): LocaleFormatter { return new LocaleFormatter(new LocaleService([ 'de' => array_merge(LocaleService::DEFAULT_SETTINGS, ['date' => 'dd.MM.Y', 'time' => 'HH:mm:ss']), 'en' => array_merge(LocaleService::DEFAULT_SETTINGS, ['date' => 'Y-MM-dd', 'time' => 'HH:mm']), ]), $locale); } }