From 9d273d6046583a3b7c9b88250514ee39aa2f61cb Mon Sep 17 00:00:00 2001 From: Gregor Harlan Date: Sat, 12 Jul 2025 15:55:19 +0200 Subject: [PATCH 1/4] optimize `in_array` calls --- Parser/Handler/StringHandler.php | 2 +- Parser/Parser.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Parser/Handler/StringHandler.php b/Parser/Handler/StringHandler.php index 5e00eda..41afb87 100644 --- a/Parser/Handler/StringHandler.php +++ b/Parser/Handler/StringHandler.php @@ -41,7 +41,7 @@ public function handle(Reader $reader, TokenStream $stream): bool { $quote = $reader->getSubstring(1); - if (!\in_array($quote, ["'", '"'])) { + if (!\in_array($quote, ["'", '"'], true)) { return false; } diff --git a/Parser/Parser.php b/Parser/Parser.php index f7eea2f..5a93a70 100644 --- a/Parser/Parser.php +++ b/Parser/Parser.php @@ -190,7 +190,7 @@ private function parseSimpleSelector(TokenStream $stream, bool $insideNegation = } $identifier = $stream->getNextIdentifier(); - if (\in_array(strtolower($identifier), ['first-line', 'first-letter', 'before', 'after'])) { + if (\in_array(strtolower($identifier), ['first-line', 'first-letter', 'before', 'after'], true)) { // Special case: CSS 2.1 pseudo-elements can have a single ':'. // Any new pseudo-element must have two. $pseudoElement = $identifier; From 2446cb57ebfa556a278ae4a819c17067de69cac8 Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Wed, 9 Oct 2024 11:06:51 +0200 Subject: [PATCH 2/4] run tests using PHPUnit 11.5 --- phpunit.xml.dist | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 7d8f839..75680db 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,10 +1,11 @@ @@ -18,7 +19,7 @@ - + ./ @@ -27,5 +28,9 @@ ./Tests ./vendor - + + + + + From 810c1bb904f21ba9c057353ee8fa5d74b12cd120 Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Thu, 31 Jul 2025 14:36:46 +0200 Subject: [PATCH 3/4] replace PHPUnit annotations with attributes --- Tests/CssSelectorConverterTest.php | 3 ++- Tests/Node/AbstractNodeTestCase.php | 5 +++-- Tests/Node/SpecificityTest.php | 7 ++++--- Tests/Parser/Handler/AbstractHandlerTestCase.php | 5 +++-- Tests/Parser/Handler/CommentHandlerTest.php | 3 ++- Tests/Parser/ParserTest.php | 13 +++++++------ Tests/Parser/Shortcut/ClassParserTest.php | 3 ++- Tests/Parser/Shortcut/ElementParserTest.php | 3 ++- Tests/Parser/Shortcut/HashParserTest.php | 3 ++- Tests/XPath/TranslatorTest.php | 11 ++++++----- 10 files changed, 33 insertions(+), 23 deletions(-) diff --git a/Tests/CssSelectorConverterTest.php b/Tests/CssSelectorConverterTest.php index c197032..1d4dbb7 100644 --- a/Tests/CssSelectorConverterTest.php +++ b/Tests/CssSelectorConverterTest.php @@ -11,6 +11,7 @@ namespace Symfony\Component\CssSelector\Tests; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; use Symfony\Component\CssSelector\CssSelectorConverter; use Symfony\Component\CssSelector\Exception\ParseException; @@ -51,7 +52,7 @@ public function testParseExceptions() (new CssSelectorConverter())->toXPath('h1:'); } - /** @dataProvider getCssToXPathWithoutPrefixTestData */ + #[DataProvider('getCssToXPathWithoutPrefixTestData')] public function testCssToXPathWithoutPrefix($css, $xpath) { $converter = new CssSelectorConverter(); diff --git a/Tests/Node/AbstractNodeTestCase.php b/Tests/Node/AbstractNodeTestCase.php index 521e6d8..64553bf 100644 --- a/Tests/Node/AbstractNodeTestCase.php +++ b/Tests/Node/AbstractNodeTestCase.php @@ -11,18 +11,19 @@ namespace Symfony\Component\CssSelector\Tests\Node; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; use Symfony\Component\CssSelector\Node\NodeInterface; abstract class AbstractNodeTestCase extends TestCase { - /** @dataProvider getToStringConversionTestData */ + #[DataProvider('getToStringConversionTestData')] public function testToStringConversion(NodeInterface $node, $representation) { $this->assertEquals($representation, (string) $node); } - /** @dataProvider getSpecificityValueTestData */ + #[DataProvider('getSpecificityValueTestData')] public function testSpecificityValue(NodeInterface $node, $value) { $this->assertEquals($value, $node->getSpecificity()->getValue()); diff --git a/Tests/Node/SpecificityTest.php b/Tests/Node/SpecificityTest.php index 8802e0c..ae76589 100644 --- a/Tests/Node/SpecificityTest.php +++ b/Tests/Node/SpecificityTest.php @@ -11,18 +11,19 @@ namespace Symfony\Component\CssSelector\Tests\Node; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; use Symfony\Component\CssSelector\Node\Specificity; class SpecificityTest extends TestCase { - /** @dataProvider getValueTestData */ + #[DataProvider('getValueTestData')] public function testValue(Specificity $specificity, $value) { $this->assertEquals($value, $specificity->getValue()); } - /** @dataProvider getValueTestData */ + #[DataProvider('getValueTestData')] public function testPlusValue(Specificity $specificity, $value) { $this->assertEquals($value + 123, $specificity->plus(new Specificity(1, 2, 3))->getValue()); @@ -39,7 +40,7 @@ public static function getValueTestData() ]; } - /** @dataProvider getCompareTestData */ + #[DataProvider('getCompareTestData')] public function testCompareTo(Specificity $a, Specificity $b, $result) { $this->assertEquals($result, $a->compareTo($b)); diff --git a/Tests/Parser/Handler/AbstractHandlerTestCase.php b/Tests/Parser/Handler/AbstractHandlerTestCase.php index 30ce10e..65754da 100644 --- a/Tests/Parser/Handler/AbstractHandlerTestCase.php +++ b/Tests/Parser/Handler/AbstractHandlerTestCase.php @@ -11,6 +11,7 @@ namespace Symfony\Component\CssSelector\Tests\Parser\Handler; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; use Symfony\Component\CssSelector\Parser\Reader; use Symfony\Component\CssSelector\Parser\Token; @@ -21,7 +22,7 @@ */ abstract class AbstractHandlerTestCase extends TestCase { - /** @dataProvider getHandleValueTestData */ + #[DataProvider('getHandleValueTestData')] public function testHandleValue($value, Token $expectedToken, $remainingContent) { $reader = new Reader($value); @@ -32,7 +33,7 @@ public function testHandleValue($value, Token $expectedToken, $remainingContent) $this->assertRemainingContent($reader, $remainingContent); } - /** @dataProvider getDontHandleValueTestData */ + #[DataProvider('getDontHandleValueTestData')] public function testDontHandleValue($value) { $reader = new Reader($value); diff --git a/Tests/Parser/Handler/CommentHandlerTest.php b/Tests/Parser/Handler/CommentHandlerTest.php index c3be7f4..7705817 100644 --- a/Tests/Parser/Handler/CommentHandlerTest.php +++ b/Tests/Parser/Handler/CommentHandlerTest.php @@ -11,6 +11,7 @@ namespace Symfony\Component\CssSelector\Tests\Parser\Handler; +use PHPUnit\Framework\Attributes\DataProvider; use Symfony\Component\CssSelector\Parser\Handler\CommentHandler; use Symfony\Component\CssSelector\Parser\Reader; use Symfony\Component\CssSelector\Parser\Token; @@ -18,7 +19,7 @@ class CommentHandlerTest extends AbstractHandlerTestCase { - /** @dataProvider getHandleValueTestData */ + #[DataProvider('getHandleValueTestData')] public function testHandleValue($value, Token $unusedArgument, $remainingContent) { $reader = new Reader($value); diff --git a/Tests/Parser/ParserTest.php b/Tests/Parser/ParserTest.php index 82de5ab..15b8a1b 100644 --- a/Tests/Parser/ParserTest.php +++ b/Tests/Parser/ParserTest.php @@ -11,6 +11,7 @@ namespace Symfony\Component\CssSelector\Tests\Parser; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; use Symfony\Component\CssSelector\Exception\SyntaxErrorException; use Symfony\Component\CssSelector\Node\FunctionNode; @@ -20,7 +21,7 @@ class ParserTest extends TestCase { - /** @dataProvider getParserTestData */ + #[DataProvider('getParserTestData')] public function testParser($source, $representation) { $parser = new Parser(); @@ -28,7 +29,7 @@ public function testParser($source, $representation) $this->assertEquals($representation, array_map(fn (SelectorNode $node) => (string) $node->getTree(), $parser->parse($source))); } - /** @dataProvider getParserExceptionTestData */ + #[DataProvider('getParserExceptionTestData')] public function testParserException($source, $message) { $parser = new Parser(); @@ -41,7 +42,7 @@ public function testParserException($source, $message) } } - /** @dataProvider getPseudoElementsTestData */ + #[DataProvider('getPseudoElementsTestData')] public function testPseudoElements($source, $element, $pseudo) { $parser = new Parser(); @@ -54,7 +55,7 @@ public function testPseudoElements($source, $element, $pseudo) $this->assertEquals($pseudo, (string) $selector->getPseudoElement()); } - /** @dataProvider getSpecificityTestData */ + #[DataProvider('getSpecificityTestData')] public function testSpecificity($source, $value) { $parser = new Parser(); @@ -66,7 +67,7 @@ public function testSpecificity($source, $value) $this->assertEquals($value, $selector->getSpecificity()->getValue()); } - /** @dataProvider getParseSeriesTestData */ + #[DataProvider('getParseSeriesTestData')] public function testParseSeries($series, $a, $b) { $parser = new Parser(); @@ -78,7 +79,7 @@ public function testParseSeries($series, $a, $b) $this->assertEquals([$a, $b], Parser::parseSeries($function->getArguments())); } - /** @dataProvider getParseSeriesExceptionTestData */ + #[DataProvider('getParseSeriesExceptionTestData')] public function testParseSeriesException($series) { $parser = new Parser(); diff --git a/Tests/Parser/Shortcut/ClassParserTest.php b/Tests/Parser/Shortcut/ClassParserTest.php index ded92ea..c18b810 100644 --- a/Tests/Parser/Shortcut/ClassParserTest.php +++ b/Tests/Parser/Shortcut/ClassParserTest.php @@ -11,6 +11,7 @@ namespace Symfony\Component\CssSelector\Tests\Parser\Shortcut; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; use Symfony\Component\CssSelector\Node\SelectorNode; use Symfony\Component\CssSelector\Parser\Shortcut\ClassParser; @@ -20,7 +21,7 @@ */ class ClassParserTest extends TestCase { - /** @dataProvider getParseTestData */ + #[DataProvider('getParseTestData')] public function testParse($source, $representation) { $parser = new ClassParser(); diff --git a/Tests/Parser/Shortcut/ElementParserTest.php b/Tests/Parser/Shortcut/ElementParserTest.php index 4c10029..a4d1712 100644 --- a/Tests/Parser/Shortcut/ElementParserTest.php +++ b/Tests/Parser/Shortcut/ElementParserTest.php @@ -11,6 +11,7 @@ namespace Symfony\Component\CssSelector\Tests\Parser\Shortcut; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; use Symfony\Component\CssSelector\Node\SelectorNode; use Symfony\Component\CssSelector\Parser\Shortcut\ElementParser; @@ -20,7 +21,7 @@ */ class ElementParserTest extends TestCase { - /** @dataProvider getParseTestData */ + #[DataProvider('getParseTestData')] public function testParse($source, $representation) { $parser = new ElementParser(); diff --git a/Tests/Parser/Shortcut/HashParserTest.php b/Tests/Parser/Shortcut/HashParserTest.php index c8bfdef..d9225ce 100644 --- a/Tests/Parser/Shortcut/HashParserTest.php +++ b/Tests/Parser/Shortcut/HashParserTest.php @@ -11,6 +11,7 @@ namespace Symfony\Component\CssSelector\Tests\Parser\Shortcut; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; use Symfony\Component\CssSelector\Node\SelectorNode; use Symfony\Component\CssSelector\Parser\Shortcut\HashParser; @@ -20,7 +21,7 @@ */ class HashParserTest extends TestCase { - /** @dataProvider getParseTestData */ + #[DataProvider('getParseTestData')] public function testParse($source, $representation) { $parser = new HashParser(); diff --git a/Tests/XPath/TranslatorTest.php b/Tests/XPath/TranslatorTest.php index f521a94..174f6b0 100644 --- a/Tests/XPath/TranslatorTest.php +++ b/Tests/XPath/TranslatorTest.php @@ -11,6 +11,7 @@ namespace Symfony\Component\CssSelector\Tests\XPath; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; use Symfony\Component\CssSelector\Exception\ExpressionErrorException; use Symfony\Component\CssSelector\Node\ElementNode; @@ -22,13 +23,13 @@ class TranslatorTest extends TestCase { - /** @dataProvider getXpathLiteralTestData */ + #[DataProvider('getXpathLiteralTestData')] public function testXpathLiteral($value, $literal) { $this->assertEquals($literal, Translator::getXpathLiteral($value)); } - /** @dataProvider getCssToXPathTestData */ + #[DataProvider('getCssToXPathTestData')] public function testCssToXPath($css, $xpath) { $translator = new Translator(); @@ -103,7 +104,7 @@ public function testAddAttributeMatchingClassNotExistsClass() $translator->addAttributeMatching($xpath, '', '', ''); } - /** @dataProvider getXmlLangTestData */ + #[DataProvider('getXmlLangTestData')] public function testXmlLang($css, array $elementsId) { $translator = new Translator(); @@ -115,7 +116,7 @@ public function testXmlLang($css, array $elementsId) } } - /** @dataProvider getHtmlIdsTestData */ + #[DataProvider('getHtmlIdsTestData')] public function testHtmlIds($css, array $elementsId) { $translator = new Translator(); @@ -136,7 +137,7 @@ public function testHtmlIds($css, array $elementsId) libxml_use_internal_errors($internalErrors); } - /** @dataProvider getHtmlShakespearTestData */ + #[DataProvider('getHtmlShakespearTestData')] public function testHtmlShakespear($css, $count) { $translator = new Translator(); From 1a3445e2ca660b2d75ac30c447deea04861711f1 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Mon, 4 Aug 2025 17:50:26 +0200 Subject: [PATCH 4/4] Remove some unneeded var annotations --- XPath/Translator.php | 1 - 1 file changed, 1 deletion(-) diff --git a/XPath/Translator.php b/XPath/Translator.php index b2623e5..7488a2b 100644 --- a/XPath/Translator.php +++ b/XPath/Translator.php @@ -91,7 +91,6 @@ public function cssToXPath(string $cssExpr, string $prefix = 'descendant-or-self { $selectors = $this->parseSelectors($cssExpr); - /** @var SelectorNode $selector */ foreach ($selectors as $index => $selector) { if (null !== $selector->getPseudoElement()) { throw new ExpressionErrorException('Pseudo-elements are not supported.');