Skip to content

Commit aea4b9b

Browse files
committed
[TASK] Add unit tests for selector parsing
The tests broadly cover what currently works, and will be extended to cover the fixes in #1292.
1 parent 7bfae2b commit aea4b9b

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed

tests/Unit/RuleSet/DeclarationBlockTest.php

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@
88
use Sabberworm\CSS\CSSElement;
99
use Sabberworm\CSS\CSSList\CSSListItem;
1010
use Sabberworm\CSS\Position\Positionable;
11+
use Sabberworm\CSS\Parsing\ParserState;
12+
use Sabberworm\CSS\Property\Selector;
1113
use Sabberworm\CSS\RuleSet\DeclarationBlock;
14+
use Sabberworm\CSS\Settings;
15+
use TRegx\PhpUnit\DataProviders\DataProvider;
1216

1317
/**
1418
* @covers \Sabberworm\CSS\RuleSet\DeclarationBlock
@@ -48,4 +52,78 @@ public function implementsPositionable(): void
4852
{
4953
self::assertInstanceOf(Positionable::class, $this->subject);
5054
}
55+
56+
/**
57+
* @return array<non-empty-string, array{0: non-empty-string}>
58+
*/
59+
public static function provideSelector(): array
60+
{
61+
return [
62+
'type' => ['body'],
63+
'class' => ['.teapot'],
64+
'type & class' => ['img.teapot'],
65+
'id' => ['#my-mug'],
66+
'type & id' => ['h2#my-mug'],
67+
'pseudo-class' => [':hover'],
68+
'type & pseudo-class' => ['a:hover'],
69+
'`not`' => [':not(#your-mug)'],
70+
'pseudo-element' => ['::before'],
71+
'attribute with `"`' => ['[alt="{}()[]\\"\'"]'],
72+
'attribute with `\'`' => ['[alt=\'{}()[]"\\\'\']'],
73+
];
74+
}
75+
76+
/**
77+
* @test
78+
*
79+
* @param non-empty-string $selector
80+
*
81+
* @dataProvider provideSelector
82+
*/
83+
public function parsesSingleSelector(string $selector): void
84+
{
85+
$subject = DeclarationBlock::parse(new ParserState($selector . '{}', Settings::create()));
86+
87+
self::assertNotNull($subject);
88+
self::assertSame([$selector], self::getSelectorsAsStrings($subject));
89+
}
90+
91+
/**
92+
* @return DataProvider<non-empty-string, array{0: non-empty-string, 1: non-empty-string}>
93+
*/
94+
public static function provideTwoSelectors(): DataProvider
95+
{
96+
return DataProvider::cross(self::provideSelector(), self::provideSelector());
97+
}
98+
99+
/**
100+
* @test
101+
*
102+
* @param non-empty-string $firstSelector
103+
* @param non-empty-string $secondSelector
104+
*
105+
* @dataProvider provideTwoSelectors
106+
*/
107+
public function parsesTwoCommaSeparatedSelectors(string $firstSelector, string $secondSelector): void
108+
{
109+
$joinedSelectors = $firstSelector . ',' . $secondSelector;
110+
111+
$subject = DeclarationBlock::parse(new ParserState($joinedSelectors . '{}', Settings::create()));
112+
113+
self::assertNotNull($subject);
114+
self::assertSame([$firstSelector, $secondSelector], self::getSelectorsAsStrings($subject));
115+
}
116+
117+
/**
118+
* @return array<string>
119+
*/
120+
private static function getSelectorsAsStrings(DeclarationBlock $declarationBlock): array
121+
{
122+
return \array_map(
123+
static function (Selector $selectorObject): string {
124+
return $selectorObject->getSelector();
125+
},
126+
$declarationBlock->getSelectors()
127+
);
128+
}
51129
}

0 commit comments

Comments
 (0)