diff --git a/src/Property/CSSNamespace.php b/src/Property/CSSNamespace.php index 1801904a..6046bdf9 100644 --- a/src/Property/CSSNamespace.php +++ b/src/Property/CSSNamespace.php @@ -8,6 +8,7 @@ use Sabberworm\CSS\OutputFormat; use Sabberworm\CSS\Position\Position; use Sabberworm\CSS\Position\Positionable; +use Sabberworm\CSS\ShortClassNameProvider; use Sabberworm\CSS\Value\CSSString; use Sabberworm\CSS\Value\URL; @@ -18,6 +19,7 @@ class CSSNamespace implements AtRule, Positionable { use CommentContainer; use Position; + use ShortClassNameProvider; /** * @var CSSString|URL @@ -102,6 +104,11 @@ public function atRuleArgs(): array */ public function getArrayRepresentation(): array { - throw new \BadMethodCallException('`getArrayRepresentation` is not yet implemented for `' . self::class . '`'); + return [ + 'class' => $this->getShortClassName(), + // We're using `uri` here instead of `url` to better match the spec. + 'uri' => $this->url->getArrayRepresentation(), + 'prefix' => $this->prefix, + ]; } } diff --git a/tests/Unit/Property/CSSNamespaceTest.php b/tests/Unit/Property/CSSNamespaceTest.php index 44f5c7d1..b00f4848 100644 --- a/tests/Unit/Property/CSSNamespaceTest.php +++ b/tests/Unit/Property/CSSNamespaceTest.php @@ -8,6 +8,7 @@ use Sabberworm\CSS\CSSList\CSSListItem; use Sabberworm\CSS\Property\CSSNamespace; use Sabberworm\CSS\Value\CSSString; +use Sabberworm\CSS\Value\URL; /** * @covers \Sabberworm\CSS\Property\CSSNamespace @@ -35,10 +36,79 @@ public function implementsCSSListItem(): void /** * @test */ - public function getArrayRepresentationThrowsException(): void + public function getArrayRepresentationIncludesClassName(): void { - $this->expectException(\BadMethodCallException::class); + $subject = new CSSNamespace(new CSSString('http://www.w3.org/2000/svg')); - $this->subject->getArrayRepresentation(); + $result = $subject->getArrayRepresentation(); + + self::assertSame('CSSNamespace', $result['class']); + } + + /** + * @test + */ + public function getArrayRepresentationIncludesUrlProvidedAsCssString(): void + { + $uri = 'http://www.w3.org/2000/svg'; + $subject = new CSSNamespace(new CSSString($uri)); + + $result = $subject->getArrayRepresentation(); + + self::assertSame( + [ + 'class' => 'CSSString', + 'contents' => $uri, + ], + $result['uri'] + ); + } + + /** + * @test + */ + public function getArrayRepresentationIncludesUrlProvidedAsUrl(): void + { + $uri = 'http://www.w3.org/2000/svg'; + $subject = new CSSNamespace(new URL(new CSSString($uri))); + + $result = $subject->getArrayRepresentation(); + + self::assertSame( + [ + 'class' => 'URL', + 'uri' => [ + 'class' => 'CSSString', + 'contents' => $uri, + ], + ], + $result['uri'] + ); + } + + /** + * @test + */ + public function getArrayRepresentationIncludesPrefixForNullPrefix(): void + { + $subject = new CSSNamespace(new CSSString('http://www.w3.org/2000/svg'), null); + + $result = $subject->getArrayRepresentation(); + + self::assertNull($result['prefix']); + } + + /** + * @test + */ + public function getArrayRepresentationIncludesPrefixForStringPrefix(): void + { + $prefix = 'hello'; + + $subject = new CSSNamespace(new CSSString('http://www.w3.org/2000/svg'), $prefix); + + $result = $subject->getArrayRepresentation(); + + self::assertSame($prefix, $result['prefix']); } }