66
77use PHPUnit \Framework \TestCase ;
88use Sabberworm \CSS \CSSList \CSSListItem ;
9+ use Sabberworm \CSS \Parsing \ParserState ;
10+ use Sabberworm \CSS \Property \Selector ;
911use Sabberworm \CSS \RuleSet \DeclarationBlock ;
12+ use Sabberworm \CSS \Settings ;
13+ use TRegx \PhpUnit \DataProviders \DataProvider ;
1014
1115/**
1216 * @covers \Sabberworm\CSS\RuleSet\DeclarationBlock
@@ -30,4 +34,68 @@ public function implementsCSSListItem(): void
3034 {
3135 self ::assertInstanceOf (CSSListItem::class, $ this ->subject );
3236 }
37+
38+ /**
39+ * @return array<non-empty-string, array{0: non-empty-string}>
40+ */
41+ public static function provideSelector (): array
42+ {
43+ return [
44+ 'type ' => ['body ' ],
45+ 'class ' => ['.teapot ' ],
46+ 'id ' => ['#my-mug ' ],
47+ '`not` ' => [':not(#your-mug) ' ],
48+ '`not` with multiple arguments ' => [':not(#your-mug, .their-mug) ' ],
49+ ];
50+ }
51+
52+ /**
53+ * @test
54+ *
55+ * @param non-empty-string $selector
56+ *
57+ * @dataProvider provideSelector
58+ */
59+ public function parsesAndReturnsSingleSelector (string $ selector ): void
60+ {
61+ $ subject = DeclarationBlock::parse (new ParserState ($ selector . '{} ' , Settings::create ()));
62+
63+ $ resultSelectorStrings = \array_map (
64+ static function (Selector $ selectorObject ): string {
65+ return $ selectorObject ->getSelector ();
66+ },
67+ $ subject ->getSelectors ()
68+ );
69+ self ::assertSame ([$ selector ], $ resultSelectorStrings );
70+ }
71+
72+ /**
73+ * @return DataProvider<non-empty-string, array{0: non-empty-string, 1: non-empty-string}>
74+ */
75+ public static function provideTwoSelectors (): DataProvider
76+ {
77+ return DataProvider::cross (self ::provideSelector (), self ::provideSelector ());
78+ }
79+
80+ /**
81+ * @test
82+ *
83+ * @param non-empty-string $firstSelector
84+ * @param non-empty-string $secondSelector
85+ *
86+ * @dataProvider provideTwoSelectors
87+ */
88+ public function parsesAndReturnsTwoCommaSeparatedSelectors (string $ firstSelector , string $ secondSelector ): void
89+ {
90+ $ joinedSelectors = $ firstSelector . ', ' . $ secondSelector ;
91+ $ subject = DeclarationBlock::parse (new ParserState ($ joinedSelectors . '{} ' , Settings::create ()));
92+
93+ $ resultSelectorStrings = \array_map (
94+ static function (Selector $ selectorObject ): string {
95+ return $ selectorObject ->getSelector ();
96+ },
97+ $ subject ->getSelectors ()
98+ );
99+ self ::assertSame ([$ firstSelector , $ secondSelector ], $ resultSelectorStrings );
100+ }
33101}
0 commit comments