diff --git a/tests/Unit/RuleSet/DeclarationBlockTest.php b/tests/Unit/RuleSet/DeclarationBlockTest.php index c84d1f9a..697b15aa 100644 --- a/tests/Unit/RuleSet/DeclarationBlockTest.php +++ b/tests/Unit/RuleSet/DeclarationBlockTest.php @@ -8,7 +8,11 @@ use Sabberworm\CSS\CSSElement; use Sabberworm\CSS\CSSList\CSSListItem; use Sabberworm\CSS\Position\Positionable; +use Sabberworm\CSS\Parsing\ParserState; +use Sabberworm\CSS\Property\Selector; use Sabberworm\CSS\RuleSet\DeclarationBlock; +use Sabberworm\CSS\Settings; +use TRegx\PhpUnit\DataProviders\DataProvider; /** * @covers \Sabberworm\CSS\RuleSet\DeclarationBlock @@ -48,4 +52,78 @@ public function implementsPositionable(): void { self::assertInstanceOf(Positionable::class, $this->subject); } + + /** + * @return array + */ + public static function provideSelector(): array + { + return [ + 'type' => ['body'], + 'class' => ['.teapot'], + 'type & class' => ['img.teapot'], + 'id' => ['#my-mug'], + 'type & id' => ['h2#my-mug'], + 'pseudo-class' => [':hover'], + 'type & pseudo-class' => ['a:hover'], + '`not`' => [':not(#your-mug)'], + 'pseudo-element' => ['::before'], + 'attribute with `"`' => ['[alt="{}()[]\\"\'"]'], + 'attribute with `\'`' => ['[alt=\'{}()[]"\\\'\']'], + ]; + } + + /** + * @test + * + * @param non-empty-string $selector + * + * @dataProvider provideSelector + */ + public function parsesSingleSelector(string $selector): void + { + $subject = DeclarationBlock::parse(new ParserState($selector . ' {}', Settings::create())); + + self::assertInstanceOf(DeclarationBlock::class, $subject); + self::assertSame([$selector], self::getSelectorsAsStrings($subject)); + } + + /** + * @return DataProvider + */ + public static function provideTwoSelectors(): DataProvider + { + return DataProvider::cross(self::provideSelector(), self::provideSelector()); + } + + /** + * @test + * + * @param non-empty-string $firstSelector + * @param non-empty-string $secondSelector + * + * @dataProvider provideTwoSelectors + */ + public function parsesTwoCommaSeparatedSelectors(string $firstSelector, string $secondSelector): void + { + $joinedSelectors = $firstSelector . ', ' . $secondSelector; + + $subject = DeclarationBlock::parse(new ParserState($joinedSelectors . ' {}', Settings::create())); + + self::assertInstanceOf(DeclarationBlock::class, $subject); + self::assertSame([$firstSelector, $secondSelector], self::getSelectorsAsStrings($subject)); + } + + /** + * @return array + */ + private static function getSelectorsAsStrings(DeclarationBlock $declarationBlock): array + { + return \array_map( + static function (Selector $selectorObject): string { + return $selectorObject->getSelector(); + }, + $declarationBlock->getSelectors() + ); + } }