Skip to content

Commit 71187af

Browse files
committed
Change how to stringify DateTimeInterface objects
DateTime and DateTimeImmutable are clearly date/time objects. Therefore, the prefix "[date-time]" is entirely unnecessary. Besides, I want to represent objects with "{}," which is more intuitive since we declare classes with them. Signed-off-by: Henrique Moody <[email protected]>
1 parent 6243066 commit 71187af

File tree

4 files changed

+26
-54
lines changed

4 files changed

+26
-54
lines changed

src/Stringifiers/ClusterStringifier.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
namespace Respect\Stringifier\Stringifiers;
1212

13+
use DateTimeInterface;
1314
use Respect\Stringifier\Quoters\CodeQuoter;
1415
use Respect\Stringifier\Stringifier;
1516

@@ -38,7 +39,7 @@ public static function createDefault(): self
3839
$stringifier = new self();
3940
$stringifier->setStringifiers([
4041
new TraversableStringifier($stringifier, $quoter),
41-
new DateTimeStringifier($stringifier, $quoter, 'c'),
42+
new DateTimeStringifier($quoter, DateTimeInterface::ATOM),
4243
new ThrowableStringifier($stringifier, $quoter),
4344
new StringableObjectStringifier($stringifier),
4445
new JsonSerializableStringifier($stringifier, $quoter),

src/Stringifiers/DateTimeStringifier.php

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
final class DateTimeStringifier implements Stringifier
2020
{
2121
public function __construct(
22-
private readonly Stringifier $stringifier,
2322
private readonly Quoter $quoter,
2423
private readonly string $format
2524
) {
@@ -31,13 +30,6 @@ public function stringify(mixed $raw, int $depth): ?string
3130
return null;
3231
}
3332

34-
return $this->quoter->quote(
35-
sprintf(
36-
'[date-time] (%s: %s)',
37-
$raw::class,
38-
$this->stringifier->stringify($raw->format($this->format), $depth + 1)
39-
),
40-
$depth
41-
);
33+
return $this->quoter->quote(sprintf('%s { %s }', $raw::class, $raw->format($this->format)), $depth);
4234
}
4335
}

tests/integration/stringify-object-dateTime.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@ outputMultiple(
1111
);
1212
?>
1313
--EXPECT--
14-
`[date-time] (DateTime: "2017-12-31T23:59:59+00:00")`
15-
`[date-time] (DateTimeImmutable: "2017-12-31T23:59:59+00:00")`
14+
`DateTime { 2017-12-31T23:59:59+00:00 }`
15+
`DateTimeImmutable { 2017-12-31T23:59:59+00:00 }`

tests/unit/Stringifiers/DateTimeStringifierTest.php

Lines changed: 21 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
declare(strict_types=1);
1010

11-
namespace Respect\Stringifier\Test\Stringifiers;
11+
namespace Respect\Stringifier\Test\Unit\Stringifiers;
1212

1313
use DateTime;
1414
use DateTimeImmutable;
@@ -17,73 +17,52 @@
1717
use PHPUnit\Framework\Attributes\DataProvider;
1818
use PHPUnit\Framework\Attributes\Test;
1919
use PHPUnit\Framework\TestCase;
20-
use Respect\Stringifier\Quoter;
21-
use Respect\Stringifier\Stringifier;
2220
use Respect\Stringifier\Stringifiers\DateTimeStringifier;
21+
use Respect\Stringifier\Test\Double\FakeQuoter;
2322

2423
#[CoversClass(DateTimeStringifier::class)]
2524
final class DateTimeStringifierTest extends TestCase
2625
{
26+
private const DEPTH = 0;
27+
2728
#[Test]
28-
public function shouldNotConvertWhenNotInstanceOfDateTimeInterface(): void
29+
public function itShouldNotStringifyRawValueWhenItIsNotInstanceOfDateTimeInterface(): void
2930
{
30-
$stringifierMock = $this->createMock(Stringifier::class);
31-
$stringifierMock
32-
->expects($this->never())
33-
->method('stringify');
34-
35-
$quoterMock = $this->createMock(Quoter::class);
36-
$quoterMock
37-
->expects($this->never())
38-
->method('quote');
39-
40-
$dateTimeStringifier = new DateTimeStringifier($stringifierMock, $quoterMock, 'c');
31+
$sut = new DateTimeStringifier(new FakeQuoter(), 'c');
4132

42-
self::assertNull($dateTimeStringifier->stringify('NotDateTimeInterface', 0));
33+
self::assertNull($sut->stringify('NotDateTimeInterface', self::DEPTH));
4334
}
4435

4536
#[Test]
46-
#[DataProvider('validValuesProvider')]
47-
public function shouldConvertDateTimeInterfaceToString(
37+
#[DataProvider('stringableRawValuesProvider')]
38+
public function itShouldStringifyRawValueWhenItIsInstanceOfDateTimeInterface(
4839
DateTimeInterface $raw,
4940
string $format,
50-
string $expected
41+
string $string
5142
): void {
52-
$depth = 0;
53-
54-
$formattedDateTime = $raw->format($format);
55-
56-
$stringifierMock = $this->createMock(Stringifier::class);
57-
$stringifierMock
58-
->expects($this->once())
59-
->method('stringify')
60-
->with($formattedDateTime, $depth + 1)
61-
->willReturn($formattedDateTime);
43+
$quoter = new FakeQuoter();
6244

63-
$quoterMock = $this->createMock(Quoter::class);
64-
$quoterMock
65-
->expects($this->once())
66-
->method('quote')
67-
->with($expected)
68-
->willReturn($expected);
45+
$sut = new DateTimeStringifier($quoter, $format);
6946

70-
$dateTimeStringifier = new DateTimeStringifier($stringifierMock, $quoterMock, $format);
47+
$actual = $sut->stringify($raw, self::DEPTH);
48+
$expected = $quoter->quote($string, self::DEPTH);
7149

72-
self::assertSame($expected, $dateTimeStringifier->stringify($raw, $depth));
50+
self::assertSame($expected, $actual);
7351
}
7452

7553
/**
76-
* @return mixed[][]
54+
* @return array<int, array{0: DateTimeInterface, 1: string, 2: string}>
7755
*/
78-
public static function validValuesProvider(): array
56+
public static function stringableRawValuesProvider(): array
7957
{
8058
$dateTime = new DateTime('2017-12-31T23:59:59+00:00');
8159
$dateTimeImmutable = DateTimeImmutable::createFromMutable($dateTime);
8260

8361
return [
84-
[$dateTime, 'd/m/Y', '[date-time] (DateTime: 31/12/2017)'],
85-
[$dateTime, 'c', '[date-time] (DateTime: 2017-12-31T23:59:59+00:00)'],
86-
[$dateTimeImmutable, 'Y-m-d H:i:s', '[date-time] (DateTimeImmutable: 2017-12-31 23:59:59)'],
62+
[$dateTime, 'd/m/Y', 'DateTime { 31/12/2017 }'],
63+
[$dateTime, 'c', 'DateTime { 2017-12-31T23:59:59+00:00 }'],
64+
[$dateTime, DateTimeInterface::ATOM, 'DateTime { 2017-12-31T23:59:59+00:00 }'],
65+
[$dateTimeImmutable, 'Y-m-d H:i:s', 'DateTimeImmutable { 2017-12-31 23:59:59 }'],
8766
];
8867
}
8968
}

0 commit comments

Comments
 (0)