fix sunday being first day of week (#2483)

This commit is contained in:
Kevin Papst
2021-04-19 18:32:21 +02:00
committed by GitHub
parent b6462b406d
commit 7ddcde62dd
17 changed files with 136 additions and 71 deletions

View File

@@ -21,13 +21,13 @@ class DateTimeFactoryTest extends TestCase
{
public const TEST_TIMEZONE = 'Europe/London';
protected function createDateTimeFactory(?string $timezone = null): DateTimeFactory
protected function createDateTimeFactory(?string $timezone = null, bool $sunday = false): DateTimeFactory
{
if (null === $timezone) {
return new DateTimeFactory();
return new DateTimeFactory(null, $sunday);
}
return new DateTimeFactory(new DateTimeZone($timezone));
return new DateTimeFactory(new DateTimeZone($timezone), $sunday);
}
public function testGetTimezone()
@@ -72,19 +72,28 @@ class DateTimeFactoryTest extends TestCase
$this->assertEquals(self::TEST_TIMEZONE, $dateTime->getTimezone()->getName());
}
public function testGetStartOfWeek()
public function getStartOfWeekData()
{
yield [$this->createDateTimeFactory(self::TEST_TIMEZONE), 'Monday', 23, 1];
yield [$this->createDateTimeFactory(self::TEST_TIMEZONE, false), 'Monday', 23, 1];
yield [$this->createDateTimeFactory(self::TEST_TIMEZONE, true), 'Sunday', 22, 7];
}
/**
* @dataProvider getStartOfWeekData
*/
public function testGetStartOfWeek(DateTimeFactory $sut, string $dayName, int $dayNum, int $day)
{
$expected = new DateTime('2018-07-26 16:47:31', new DateTimeZone(self::TEST_TIMEZONE));
$sut = $this->createDateTimeFactory(self::TEST_TIMEZONE);
$dateTime = $sut->getStartOfWeek($expected);
$this->assertEquals(0, $dateTime->format('H'));
$this->assertEquals(0, $dateTime->format('i'));
$this->assertEquals(0, $dateTime->format('s'));
$this->assertEquals(23, $dateTime->format('d'));
$this->assertEquals(1, $dateTime->format('N'));
$this->assertEquals('Monday', $dateTime->format('l'));
$this->assertEquals($dayNum, $dateTime->format('d'));
$this->assertEquals($day, $dateTime->format('N'));
$this->assertEquals($dayName, $dateTime->format('l'));
$this->assertEquals($expected->format('m'), $dateTime->format('m'));
$this->assertEquals($expected->format('Y'), $dateTime->format('Y'));
$this->assertEquals(self::TEST_TIMEZONE, $dateTime->getTimezone()->getName());
@@ -94,25 +103,34 @@ class DateTimeFactoryTest extends TestCase
$this->assertEquals(0, $dateTime->format('H'));
$this->assertEquals(0, $dateTime->format('i'));
$this->assertEquals(0, $dateTime->format('s'));
$this->assertEquals(1, $dateTime->format('N'));
$this->assertEquals('Monday', $dateTime->format('l'));
$this->assertEquals($day, $dateTime->format('N'));
$this->assertEquals($dayName, $dateTime->format('l'));
// month and year can be different when the week started at the end of the month
$this->assertEquals(self::TEST_TIMEZONE, $dateTime->getTimezone()->getName());
}
public function testGetEndOfWeek()
public function getEndOfWeekData()
{
yield [$this->createDateTimeFactory(self::TEST_TIMEZONE), 'Sunday', 29, 7];
yield [$this->createDateTimeFactory(self::TEST_TIMEZONE, false), 'Sunday', 29, 7];
yield [$this->createDateTimeFactory(self::TEST_TIMEZONE, true), 'Saturday', 28, 6];
}
/**
* @dataProvider getEndOfWeekData
*/
public function testGetEndOfWeek(DateTimeFactory $sut, string $dayName, int $dayNum, int $day)
{
$expected = new DateTime('2018-07-26 16:47:31', new DateTimeZone(self::TEST_TIMEZONE));
$sut = $this->createDateTimeFactory(self::TEST_TIMEZONE);
$dateTime = $sut->getEndOfWeek($expected);
$this->assertEquals(23, $dateTime->format('H'));
$this->assertEquals(59, $dateTime->format('i'));
$this->assertEquals(59, $dateTime->format('s'));
$this->assertEquals(29, $dateTime->format('d'));
$this->assertEquals(7, $dateTime->format('N'));
$this->assertEquals('Sunday', $dateTime->format('l'));
$this->assertEquals($dayNum, $dateTime->format('d'));
$this->assertEquals($day, $dateTime->format('N'));
$this->assertEquals($dayName, $dateTime->format('l'));
$this->assertEquals('07', $dateTime->format('m'));
$this->assertEquals('2018', $dateTime->format('Y'));
$this->assertEquals(self::TEST_TIMEZONE, $dateTime->getTimezone()->getName());
@@ -122,8 +140,8 @@ class DateTimeFactoryTest extends TestCase
$this->assertEquals(23, $dateTime->format('H'));
$this->assertEquals(59, $dateTime->format('i'));
$this->assertEquals(59, $dateTime->format('s'));
$this->assertEquals(7, $dateTime->format('N'));
$this->assertEquals('Sunday', $dateTime->format('l'));
$this->assertEquals($day, $dateTime->format('N'));
$this->assertEquals($dayName, $dateTime->format('l'));
// month and year can be different when the week started at the end of the month
$this->assertEquals(self::TEST_TIMEZONE, $dateTime->getTimezone()->getName());
}