From f7e2c04b1c80783d65006b524181f3f728b868fa Mon Sep 17 00:00:00 2001 From: Oliver Klee Date: Sun, 26 Apr 2026 10:43:11 +0200 Subject: [PATCH 1/3] [TASK] Implement `(At)RuleSet::getArrayRepresentation()` Part of #1440. --- src/RuleSet/RuleSet.php | 17 +++++++++- tests/Unit/RuleSet/AtRuleSetTest.php | 43 ++++++++++++++++++++++-- tests/Unit/RuleSet/RuleSetTest.php | 50 ++++++++++++++++++++++++++-- 3 files changed, 103 insertions(+), 7 deletions(-) diff --git a/src/RuleSet/RuleSet.php b/src/RuleSet/RuleSet.php index 334e2e37..ef2fb7ab 100644 --- a/src/RuleSet/RuleSet.php +++ b/src/RuleSet/RuleSet.php @@ -14,6 +14,7 @@ use Sabberworm\CSS\Position\Position; use Sabberworm\CSS\Position\Positionable; use Sabberworm\CSS\Property\Declaration; +use Sabberworm\CSS\ShortClassNameProvider; /** * This class is a container for individual `Declaration`s. @@ -31,6 +32,7 @@ class RuleSet implements CSSElement, CSSListItem, Positionable, DeclarationList use CommentContainer; use LegacyDeclarationListMethods; use Position; + use ShortClassNameProvider; /** * the declarations in this rule set, using the property name as the key, @@ -344,7 +346,20 @@ static function () use ($declaration, $nextLevelFormat): string { */ public function getArrayRepresentation(): array { - throw new \BadMethodCallException('`getArrayRepresentation` is not yet implemented for `' . self::class . '`'); + $declarationsArrayRepresentation = []; + foreach ($this->declarations as $propertyName => $declarationForOneProperty) { + $declarationsArrayRepresentation[$propertyName] = \array_map( + function (Declaration $declaration): array { + return $declaration->getArrayRepresentation(); + }, + $declarationForOneProperty + ); + } + + return [ + 'class' => $this->getShortClassName(), + 'declarations' => $declarationsArrayRepresentation, + ]; } /** diff --git a/tests/Unit/RuleSet/AtRuleSetTest.php b/tests/Unit/RuleSet/AtRuleSetTest.php index 74c60a04..3eb8b7ca 100644 --- a/tests/Unit/RuleSet/AtRuleSetTest.php +++ b/tests/Unit/RuleSet/AtRuleSetTest.php @@ -6,6 +6,7 @@ use PHPUnit\Framework\TestCase; use Sabberworm\CSS\CSSList\CSSListItem; +use Sabberworm\CSS\Property\Declaration; use Sabberworm\CSS\RuleSet\AtRuleSet; /** @@ -34,10 +35,46 @@ public function implementsCSSListItem(): void /** * @test */ - public function getArrayRepresentationThrowsException(): void + public function getArrayRepresentationIncludesClassName(): void { - $this->expectException(\BadMethodCallException::class); + $subject = new AtRuleSet('supports'); - $this->subject->getArrayRepresentation(); + $result = $subject->getArrayRepresentation(); + + self::assertSame('AtRuleSet', $result['class']); + } + + /** + * @test + */ + public function getArrayRepresentationIncludesDeclarations(): void + { + $subject = new AtRuleSet('supports'); + $subject->addDeclaration(new Declaration('display')); + $subject->addDeclaration(new Declaration('transform-origin')); + + $result = $subject->getArrayRepresentation(); + + self::assertSame( + [ + 'display' => [ + [ + 'class' => 'Declaration', + 'propertyName' => 'display', + 'propertyValue' => null, + 'important' => false, + ], + ], + 'transform-origin' => [ + [ + 'class' => 'Declaration', + 'propertyName' => 'transform-origin', + 'propertyValue' => null, + 'important' => false, + ], + ], + ], + $result['declarations'] + ); } } diff --git a/tests/Unit/RuleSet/RuleSetTest.php b/tests/Unit/RuleSet/RuleSetTest.php index 6ba574de..03ebd0fd 100644 --- a/tests/Unit/RuleSet/RuleSetTest.php +++ b/tests/Unit/RuleSet/RuleSetTest.php @@ -7,6 +7,7 @@ use PHPUnit\Framework\TestCase; use Sabberworm\CSS\CSSElement; use Sabberworm\CSS\CSSList\CSSListItem; +use Sabberworm\CSS\Property\Declaration; use Sabberworm\CSS\RuleSet\RuleSet; /** @@ -83,10 +84,53 @@ public function getLineNumberReturnsLineNumberPassedToConstructor(?int $lineNumb /** * @test */ - public function getArrayRepresentationThrowsException(): void + public function getArrayRepresentationIncludesClassName(): void { - $this->expectException(\BadMethodCallException::class); + $subject = new RuleSet(); - $this->subject->getArrayRepresentation(); + $result = $subject->getArrayRepresentation(); + + self::assertSame('RuleSet', $result['class']); + } + + /** + * @test + */ + public function getArrayRepresentationIncludesDeclarations(): void + { + $subject = new RuleSet(); + $subject->addDeclaration(new Declaration('line-height')); + $subject->addDeclaration(new Declaration('line-height')); + $subject->addDeclaration(new Declaration('color')); + + $result = $subject->getArrayRepresentation(); + + self::assertSame( + [ + 'line-height' => [ + [ + 'class' => 'Declaration', + 'propertyName' => 'line-height', + 'propertyValue' => null, + 'important' => false, + ], + [ + 'class' => 'Declaration', + 'propertyName' => 'line-height', + 'propertyValue' => null, + 'important' => false, + ], + ], + 'color' => [ + [ + 'class' => 'Declaration', + 'propertyName' => 'color', + 'propertyValue' => null, + 'important' => false, + ], + ], + ], + $result['declarations'] + ); } } From e15d52383ae7ca6dc03789f6e2fef941b5761367 Mon Sep 17 00:00:00 2001 From: Oliver Klee Date: Wed, 29 Apr 2026 09:17:59 +0200 Subject: [PATCH 2/3] Pluralize it! Co-authored-by: JakeQZ --- src/RuleSet/RuleSet.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/RuleSet/RuleSet.php b/src/RuleSet/RuleSet.php index ef2fb7ab..35b6d6b8 100644 --- a/src/RuleSet/RuleSet.php +++ b/src/RuleSet/RuleSet.php @@ -347,12 +347,12 @@ static function () use ($declaration, $nextLevelFormat): string { public function getArrayRepresentation(): array { $declarationsArrayRepresentation = []; - foreach ($this->declarations as $propertyName => $declarationForOneProperty) { + foreach ($this->declarations as $propertyName => $declarationsForOneProperty) { $declarationsArrayRepresentation[$propertyName] = \array_map( function (Declaration $declaration): array { return $declaration->getArrayRepresentation(); }, - $declarationForOneProperty + $declarationsForOneProperty ); } From 779d500d3ccc331b7945802a7fcb0702e08c5c5e Mon Sep 17 00:00:00 2001 From: Oliver Klee Date: Wed, 29 Apr 2026 09:22:35 +0200 Subject: [PATCH 3/3] Add properties specific to at-rules --- src/RuleSet/AtRuleSet.php | 14 ++++++++++++++ tests/Unit/RuleSet/AtRuleSetTest.php | 26 ++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/RuleSet/AtRuleSet.php b/src/RuleSet/AtRuleSet.php index 7307193d..b696aca4 100644 --- a/src/RuleSet/AtRuleSet.php +++ b/src/RuleSet/AtRuleSet.php @@ -65,4 +65,18 @@ public function render(OutputFormat $outputFormat): string $result .= '}'; return $result; } + + /** + * @return array|null> + * + * @internal + */ + public function getArrayRepresentation(): array + { + $arrayRepresentation = parent::getArrayRepresentation(); + $arrayRepresentation['atRuleName'] = $this->type; + $arrayRepresentation['arguments'] = $this->arguments; + + return $arrayRepresentation; + } } diff --git a/tests/Unit/RuleSet/AtRuleSetTest.php b/tests/Unit/RuleSet/AtRuleSetTest.php index 3eb8b7ca..dda78519 100644 --- a/tests/Unit/RuleSet/AtRuleSetTest.php +++ b/tests/Unit/RuleSet/AtRuleSetTest.php @@ -77,4 +77,30 @@ public function getArrayRepresentationIncludesDeclarations(): void $result['declarations'] ); } + + /** + * @test + */ + public function getArrayRepresentationIncludesAtRuleName(): void + { + $atRuleName = 'supports'; + $subject = new AtRuleSet($atRuleName); + + $result = $subject->getArrayRepresentation(); + + self::assertSame($atRuleName, $result['atRuleName']); + } + + /** + * @test + */ + public function getArrayRepresentationIncludesArguments(): void + { + $arguments = 'foo'; + $subject = new AtRuleSet('supports', $arguments); + + $result = $subject->getArrayRepresentation(); + + self::assertSame($arguments, $result['arguments']); + } }