scratch
/vendor/symfony/css-selector/Tests/CssSelectorConverterTest.php |
---|
@@ -0,0 +1,76 @@ |
<?php |
/* |
* This file is part of the Symfony package. |
* |
* (c) Fabien Potencier <fabien@symfony.com> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Symfony\Component\CssSelector\Tests; |
use PHPUnit\Framework\TestCase; |
use Symfony\Component\CssSelector\CssSelectorConverter; |
class CssSelectorConverterTest extends TestCase |
{ |
public function testCssToXPath() |
{ |
$converter = new CssSelectorConverter(); |
$this->assertEquals('descendant-or-self::*', $converter->toXPath('')); |
$this->assertEquals('descendant-or-self::h1', $converter->toXPath('h1')); |
$this->assertEquals("descendant-or-self::h1[@id = 'foo']", $converter->toXPath('h1#foo')); |
$this->assertEquals("descendant-or-self::h1[@class and contains(concat(' ', normalize-space(@class), ' '), ' foo ')]", $converter->toXPath('h1.foo')); |
$this->assertEquals('descendant-or-self::foo:h1', $converter->toXPath('foo|h1')); |
$this->assertEquals('descendant-or-self::h1', $converter->toXPath('H1')); |
} |
public function testCssToXPathXml() |
{ |
$converter = new CssSelectorConverter(false); |
$this->assertEquals('descendant-or-self::H1', $converter->toXPath('H1')); |
} |
/** |
* @expectedException \Symfony\Component\CssSelector\Exception\ParseException |
* @expectedExceptionMessage Expected identifier, but <eof at 3> found. |
*/ |
public function testParseExceptions() |
{ |
$converter = new CssSelectorConverter(); |
$converter->toXPath('h1:'); |
} |
/** @dataProvider getCssToXPathWithoutPrefixTestData */ |
public function testCssToXPathWithoutPrefix($css, $xpath) |
{ |
$converter = new CssSelectorConverter(); |
$this->assertEquals($xpath, $converter->toXPath($css, ''), '->parse() parses an input string and returns a node'); |
} |
public function getCssToXPathWithoutPrefixTestData() |
{ |
return array( |
array('h1', 'h1'), |
array('foo|h1', 'foo:h1'), |
array('h1, h2, h3', 'h1 | h2 | h3'), |
array('h1:nth-child(3n+1)', "*/*[name() = 'h1' and (position() - 1 >= 0 and (position() - 1) mod 3 = 0)]"), |
array('h1 > p', 'h1/p'), |
array('h1#foo', "h1[@id = 'foo']"), |
array('h1.foo', "h1[@class and contains(concat(' ', normalize-space(@class), ' '), ' foo ')]"), |
array('h1[class*="foo bar"]', "h1[@class and contains(@class, 'foo bar')]"), |
array('h1[foo|class*="foo bar"]', "h1[@foo:class and contains(@foo:class, 'foo bar')]"), |
array('h1[class]', 'h1[@class]'), |
array('h1 .foo', "h1/descendant-or-self::*/*[@class and contains(concat(' ', normalize-space(@class), ' '), ' foo ')]"), |
array('h1 #foo', "h1/descendant-or-self::*/*[@id = 'foo']"), |
array('h1 [class*=foo]', "h1/descendant-or-self::*/*[@class and contains(@class, 'foo')]"), |
array('div>.foo', "div/*[@class and contains(concat(' ', normalize-space(@class), ' '), ' foo ')]"), |
array('div > .foo', "div/*[@class and contains(concat(' ', normalize-space(@class), ' '), ' foo ')]"), |
); |
} |
} |
/vendor/symfony/css-selector/Tests/CssSelectorTest.php |
---|
@@ -0,0 +1,68 @@ |
<?php |
/* |
* This file is part of the Symfony package. |
* |
* (c) Fabien Potencier <fabien@symfony.com> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Symfony\Component\CssSelector\Tests; |
use PHPUnit\Framework\TestCase; |
use Symfony\Component\CssSelector\CssSelector; |
/** |
* @group legacy |
*/ |
class CssSelectorTest extends TestCase |
{ |
public function testCssToXPath() |
{ |
$this->assertEquals('descendant-or-self::*', CssSelector::toXPath('')); |
$this->assertEquals('descendant-or-self::h1', CssSelector::toXPath('h1')); |
$this->assertEquals("descendant-or-self::h1[@id = 'foo']", CssSelector::toXPath('h1#foo')); |
$this->assertEquals("descendant-or-self::h1[@class and contains(concat(' ', normalize-space(@class), ' '), ' foo ')]", CssSelector::toXPath('h1.foo')); |
$this->assertEquals('descendant-or-self::foo:h1', CssSelector::toXPath('foo|h1')); |
} |
/** @dataProvider getCssToXPathWithoutPrefixTestData */ |
public function testCssToXPathWithoutPrefix($css, $xpath) |
{ |
$this->assertEquals($xpath, CssSelector::toXPath($css, ''), '->parse() parses an input string and returns a node'); |
} |
public function testParseExceptions() |
{ |
try { |
CssSelector::toXPath('h1:'); |
$this->fail('->parse() throws an Exception if the css selector is not valid'); |
} catch (\Exception $e) { |
$this->assertInstanceOf('\Symfony\Component\CssSelector\Exception\ParseException', $e, '->parse() throws an Exception if the css selector is not valid'); |
$this->assertEquals('Expected identifier, but <eof at 3> found.', $e->getMessage(), '->parse() throws an Exception if the css selector is not valid'); |
} |
} |
public function getCssToXPathWithoutPrefixTestData() |
{ |
return array( |
array('h1', 'h1'), |
array('foo|h1', 'foo:h1'), |
array('h1, h2, h3', 'h1 | h2 | h3'), |
array('h1:nth-child(3n+1)', "*/*[name() = 'h1' and (position() - 1 >= 0 and (position() - 1) mod 3 = 0)]"), |
array('h1 > p', 'h1/p'), |
array('h1#foo', "h1[@id = 'foo']"), |
array('h1.foo', "h1[@class and contains(concat(' ', normalize-space(@class), ' '), ' foo ')]"), |
array('h1[class*="foo bar"]', "h1[@class and contains(@class, 'foo bar')]"), |
array('h1[foo|class*="foo bar"]', "h1[@foo:class and contains(@foo:class, 'foo bar')]"), |
array('h1[class]', 'h1[@class]'), |
array('h1 .foo', "h1/descendant-or-self::*/*[@class and contains(concat(' ', normalize-space(@class), ' '), ' foo ')]"), |
array('h1 #foo', "h1/descendant-or-self::*/*[@id = 'foo']"), |
array('h1 [class*=foo]', "h1/descendant-or-self::*/*[@class and contains(@class, 'foo')]"), |
array('div>.foo', "div/*[@class and contains(concat(' ', normalize-space(@class), ' '), ' foo ')]"), |
array('div > .foo', "div/*[@class and contains(concat(' ', normalize-space(@class), ' '), ' foo ')]"), |
); |
} |
} |
/vendor/symfony/css-selector/Tests/Node/AbstractNodeTest.php |
---|
@@ -0,0 +1,34 @@ |
<?php |
/* |
* This file is part of the Symfony package. |
* |
* (c) Fabien Potencier <fabien@symfony.com> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Symfony\Component\CssSelector\Tests\Node; |
use PHPUnit\Framework\TestCase; |
use Symfony\Component\CssSelector\Node\NodeInterface; |
abstract class AbstractNodeTest extends TestCase |
{ |
/** @dataProvider getToStringConversionTestData */ |
public function testToStringConversion(NodeInterface $node, $representation) |
{ |
$this->assertEquals($representation, (string) $node); |
} |
/** @dataProvider getSpecificityValueTestData */ |
public function testSpecificityValue(NodeInterface $node, $value) |
{ |
$this->assertEquals($value, $node->getSpecificity()->getValue()); |
} |
abstract public function getToStringConversionTestData(); |
abstract public function getSpecificityValueTestData(); |
} |
/vendor/symfony/css-selector/Tests/Node/AttributeNodeTest.php |
---|
@@ -0,0 +1,37 @@ |
<?php |
/* |
* This file is part of the Symfony package. |
* |
* (c) Fabien Potencier <fabien@symfony.com> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Symfony\Component\CssSelector\Tests\Node; |
use Symfony\Component\CssSelector\Node\AttributeNode; |
use Symfony\Component\CssSelector\Node\ElementNode; |
class AttributeNodeTest extends AbstractNodeTest |
{ |
public function getToStringConversionTestData() |
{ |
return array( |
array(new AttributeNode(new ElementNode(), null, 'attribute', 'exists', null), 'Attribute[Element[*][attribute]]'), |
array(new AttributeNode(new ElementNode(), null, 'attribute', '$=', 'value'), "Attribute[Element[*][attribute $= 'value']]"), |
array(new AttributeNode(new ElementNode(), 'namespace', 'attribute', '$=', 'value'), "Attribute[Element[*][namespace|attribute $= 'value']]"), |
); |
} |
public function getSpecificityValueTestData() |
{ |
return array( |
array(new AttributeNode(new ElementNode(), null, 'attribute', 'exists', null), 10), |
array(new AttributeNode(new ElementNode(null, 'element'), null, 'attribute', 'exists', null), 11), |
array(new AttributeNode(new ElementNode(), null, 'attribute', '$=', 'value'), 10), |
array(new AttributeNode(new ElementNode(), 'namespace', 'attribute', '$=', 'value'), 10), |
); |
} |
} |
/vendor/symfony/css-selector/Tests/Node/ClassNodeTest.php |
---|
@@ -0,0 +1,33 @@ |
<?php |
/* |
* This file is part of the Symfony package. |
* |
* (c) Fabien Potencier <fabien@symfony.com> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Symfony\Component\CssSelector\Tests\Node; |
use Symfony\Component\CssSelector\Node\ClassNode; |
use Symfony\Component\CssSelector\Node\ElementNode; |
class ClassNodeTest extends AbstractNodeTest |
{ |
public function getToStringConversionTestData() |
{ |
return array( |
array(new ClassNode(new ElementNode(), 'class'), 'Class[Element[*].class]'), |
); |
} |
public function getSpecificityValueTestData() |
{ |
return array( |
array(new ClassNode(new ElementNode(), 'class'), 10), |
array(new ClassNode(new ElementNode(null, 'element'), 'class'), 11), |
); |
} |
} |
/vendor/symfony/css-selector/Tests/Node/CombinedSelectorNodeTest.php |
---|
@@ -0,0 +1,35 @@ |
<?php |
/* |
* This file is part of the Symfony package. |
* |
* (c) Fabien Potencier <fabien@symfony.com> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Symfony\Component\CssSelector\Tests\Node; |
use Symfony\Component\CssSelector\Node\CombinedSelectorNode; |
use Symfony\Component\CssSelector\Node\ElementNode; |
class CombinedSelectorNodeTest extends AbstractNodeTest |
{ |
public function getToStringConversionTestData() |
{ |
return array( |
array(new CombinedSelectorNode(new ElementNode(), '>', new ElementNode()), 'CombinedSelector[Element[*] > Element[*]]'), |
array(new CombinedSelectorNode(new ElementNode(), ' ', new ElementNode()), 'CombinedSelector[Element[*] <followed> Element[*]]'), |
); |
} |
public function getSpecificityValueTestData() |
{ |
return array( |
array(new CombinedSelectorNode(new ElementNode(), '>', new ElementNode()), 0), |
array(new CombinedSelectorNode(new ElementNode(null, 'element'), '>', new ElementNode()), 1), |
array(new CombinedSelectorNode(new ElementNode(null, 'element'), '>', new ElementNode(null, 'element')), 2), |
); |
} |
} |
/vendor/symfony/css-selector/Tests/Node/ElementNodeTest.php |
---|
@@ -0,0 +1,35 @@ |
<?php |
/* |
* This file is part of the Symfony package. |
* |
* (c) Fabien Potencier <fabien@symfony.com> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Symfony\Component\CssSelector\Tests\Node; |
use Symfony\Component\CssSelector\Node\ElementNode; |
class ElementNodeTest extends AbstractNodeTest |
{ |
public function getToStringConversionTestData() |
{ |
return array( |
array(new ElementNode(), 'Element[*]'), |
array(new ElementNode(null, 'element'), 'Element[element]'), |
array(new ElementNode('namespace', 'element'), 'Element[namespace|element]'), |
); |
} |
public function getSpecificityValueTestData() |
{ |
return array( |
array(new ElementNode(), 0), |
array(new ElementNode(null, 'element'), 1), |
array(new ElementNode('namespace', 'element'), 1), |
); |
} |
} |
/vendor/symfony/css-selector/Tests/Node/FunctionNodeTest.php |
---|
@@ -0,0 +1,47 @@ |
<?php |
/* |
* This file is part of the Symfony package. |
* |
* (c) Fabien Potencier <fabien@symfony.com> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Symfony\Component\CssSelector\Tests\Node; |
use Symfony\Component\CssSelector\Node\ElementNode; |
use Symfony\Component\CssSelector\Node\FunctionNode; |
use Symfony\Component\CssSelector\Parser\Token; |
class FunctionNodeTest extends AbstractNodeTest |
{ |
public function getToStringConversionTestData() |
{ |
return array( |
array(new FunctionNode(new ElementNode(), 'function'), 'Function[Element[*]:function()]'), |
array(new FunctionNode(new ElementNode(), 'function', array( |
new Token(Token::TYPE_IDENTIFIER, 'value', 0), |
)), "Function[Element[*]:function(['value'])]"), |
array(new FunctionNode(new ElementNode(), 'function', array( |
new Token(Token::TYPE_STRING, 'value1', 0), |
new Token(Token::TYPE_NUMBER, 'value2', 0), |
)), "Function[Element[*]:function(['value1', 'value2'])]"), |
); |
} |
public function getSpecificityValueTestData() |
{ |
return array( |
array(new FunctionNode(new ElementNode(), 'function'), 10), |
array(new FunctionNode(new ElementNode(), 'function', array( |
new Token(Token::TYPE_IDENTIFIER, 'value', 0), |
)), 10), |
array(new FunctionNode(new ElementNode(), 'function', array( |
new Token(Token::TYPE_STRING, 'value1', 0), |
new Token(Token::TYPE_NUMBER, 'value2', 0), |
)), 10), |
); |
} |
} |
/vendor/symfony/css-selector/Tests/Node/HashNodeTest.php |
---|
@@ -0,0 +1,33 @@ |
<?php |
/* |
* This file is part of the Symfony package. |
* |
* (c) Fabien Potencier <fabien@symfony.com> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Symfony\Component\CssSelector\Tests\Node; |
use Symfony\Component\CssSelector\Node\HashNode; |
use Symfony\Component\CssSelector\Node\ElementNode; |
class HashNodeTest extends AbstractNodeTest |
{ |
public function getToStringConversionTestData() |
{ |
return array( |
array(new HashNode(new ElementNode(), 'id'), 'Hash[Element[*]#id]'), |
); |
} |
public function getSpecificityValueTestData() |
{ |
return array( |
array(new HashNode(new ElementNode(), 'id'), 100), |
array(new HashNode(new ElementNode(null, 'id'), 'class'), 101), |
); |
} |
} |
/vendor/symfony/css-selector/Tests/Node/NegationNodeTest.php |
---|
@@ -0,0 +1,33 @@ |
<?php |
/* |
* This file is part of the Symfony package. |
* |
* (c) Fabien Potencier <fabien@symfony.com> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Symfony\Component\CssSelector\Tests\Node; |
use Symfony\Component\CssSelector\Node\ClassNode; |
use Symfony\Component\CssSelector\Node\NegationNode; |
use Symfony\Component\CssSelector\Node\ElementNode; |
class NegationNodeTest extends AbstractNodeTest |
{ |
public function getToStringConversionTestData() |
{ |
return array( |
array(new NegationNode(new ElementNode(), new ClassNode(new ElementNode(), 'class')), 'Negation[Element[*]:not(Class[Element[*].class])]'), |
); |
} |
public function getSpecificityValueTestData() |
{ |
return array( |
array(new NegationNode(new ElementNode(), new ClassNode(new ElementNode(), 'class')), 10), |
); |
} |
} |
/vendor/symfony/css-selector/Tests/Node/PseudoNodeTest.php |
---|
@@ -0,0 +1,32 @@ |
<?php |
/* |
* This file is part of the Symfony package. |
* |
* (c) Fabien Potencier <fabien@symfony.com> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Symfony\Component\CssSelector\Tests\Node; |
use Symfony\Component\CssSelector\Node\ElementNode; |
use Symfony\Component\CssSelector\Node\PseudoNode; |
class PseudoNodeTest extends AbstractNodeTest |
{ |
public function getToStringConversionTestData() |
{ |
return array( |
array(new PseudoNode(new ElementNode(), 'pseudo'), 'Pseudo[Element[*]:pseudo]'), |
); |
} |
public function getSpecificityValueTestData() |
{ |
return array( |
array(new PseudoNode(new ElementNode(), 'pseudo'), 10), |
); |
} |
} |
/vendor/symfony/css-selector/Tests/Node/SelectorNodeTest.php |
---|
@@ -0,0 +1,34 @@ |
<?php |
/* |
* This file is part of the Symfony package. |
* |
* (c) Fabien Potencier <fabien@symfony.com> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Symfony\Component\CssSelector\Tests\Node; |
use Symfony\Component\CssSelector\Node\ElementNode; |
use Symfony\Component\CssSelector\Node\SelectorNode; |
class SelectorNodeTest extends AbstractNodeTest |
{ |
public function getToStringConversionTestData() |
{ |
return array( |
array(new SelectorNode(new ElementNode()), 'Selector[Element[*]]'), |
array(new SelectorNode(new ElementNode(), 'pseudo'), 'Selector[Element[*]::pseudo]'), |
); |
} |
public function getSpecificityValueTestData() |
{ |
return array( |
array(new SelectorNode(new ElementNode()), 0), |
array(new SelectorNode(new ElementNode(), 'pseudo'), 1), |
); |
} |
} |
/vendor/symfony/css-selector/Tests/Node/SpecificityTest.php |
---|
@@ -0,0 +1,63 @@ |
<?php |
/* |
* This file is part of the Symfony package. |
* |
* (c) Fabien Potencier <fabien@symfony.com> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Symfony\Component\CssSelector\Tests\Node; |
use PHPUnit\Framework\TestCase; |
use Symfony\Component\CssSelector\Node\Specificity; |
class SpecificityTest extends TestCase |
{ |
/** @dataProvider getValueTestData */ |
public function testValue(Specificity $specificity, $value) |
{ |
$this->assertEquals($value, $specificity->getValue()); |
} |
/** @dataProvider getValueTestData */ |
public function testPlusValue(Specificity $specificity, $value) |
{ |
$this->assertEquals($value + 123, $specificity->plus(new Specificity(1, 2, 3))->getValue()); |
} |
public function getValueTestData() |
{ |
return array( |
array(new Specificity(0, 0, 0), 0), |
array(new Specificity(0, 0, 2), 2), |
array(new Specificity(0, 3, 0), 30), |
array(new Specificity(4, 0, 0), 400), |
array(new Specificity(4, 3, 2), 432), |
); |
} |
/** @dataProvider getCompareTestData */ |
public function testCompareTo(Specificity $a, Specificity $b, $result) |
{ |
$this->assertEquals($result, $a->compareTo($b)); |
} |
public function getCompareTestData() |
{ |
return array( |
array(new Specificity(0, 0, 0), new Specificity(0, 0, 0), 0), |
array(new Specificity(0, 0, 1), new Specificity(0, 0, 1), 0), |
array(new Specificity(0, 0, 2), new Specificity(0, 0, 1), 1), |
array(new Specificity(0, 0, 2), new Specificity(0, 0, 3), -1), |
array(new Specificity(0, 4, 0), new Specificity(0, 4, 0), 0), |
array(new Specificity(0, 6, 0), new Specificity(0, 5, 11), 1), |
array(new Specificity(0, 7, 0), new Specificity(0, 8, 0), -1), |
array(new Specificity(9, 0, 0), new Specificity(9, 0, 0), 0), |
array(new Specificity(11, 0, 0), new Specificity(10, 11, 0), 1), |
array(new Specificity(12, 11, 0), new Specificity(13, 0, 0), -1), |
); |
} |
} |
/vendor/symfony/css-selector/Tests/Parser/Handler/AbstractHandlerTest.php |
---|
@@ -0,0 +1,70 @@ |
<?php |
/* |
* This file is part of the Symfony package. |
* |
* (c) Fabien Potencier <fabien@symfony.com> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Symfony\Component\CssSelector\Tests\Parser\Handler; |
use PHPUnit\Framework\TestCase; |
use Symfony\Component\CssSelector\Parser\Reader; |
use Symfony\Component\CssSelector\Parser\Token; |
use Symfony\Component\CssSelector\Parser\TokenStream; |
/** |
* @author Jean-François Simon <contact@jfsimon.fr> |
*/ |
abstract class AbstractHandlerTest extends TestCase |
{ |
/** @dataProvider getHandleValueTestData */ |
public function testHandleValue($value, Token $expectedToken, $remainingContent) |
{ |
$reader = new Reader($value); |
$stream = new TokenStream(); |
$this->assertTrue($this->generateHandler()->handle($reader, $stream)); |
$this->assertEquals($expectedToken, $stream->getNext()); |
$this->assertRemainingContent($reader, $remainingContent); |
} |
/** @dataProvider getDontHandleValueTestData */ |
public function testDontHandleValue($value) |
{ |
$reader = new Reader($value); |
$stream = new TokenStream(); |
$this->assertFalse($this->generateHandler()->handle($reader, $stream)); |
$this->assertStreamEmpty($stream); |
$this->assertRemainingContent($reader, $value); |
} |
abstract public function getHandleValueTestData(); |
abstract public function getDontHandleValueTestData(); |
abstract protected function generateHandler(); |
protected function assertStreamEmpty(TokenStream $stream) |
{ |
$property = new \ReflectionProperty($stream, 'tokens'); |
$property->setAccessible(true); |
$this->assertEquals(array(), $property->getValue($stream)); |
} |
protected function assertRemainingContent(Reader $reader, $remainingContent) |
{ |
if ('' === $remainingContent) { |
$this->assertEquals(0, $reader->getRemainingLength()); |
$this->assertTrue($reader->isEOF()); |
} else { |
$this->assertEquals(strlen($remainingContent), $reader->getRemainingLength()); |
$this->assertEquals(0, $reader->getOffset($remainingContent)); |
} |
} |
} |
/vendor/symfony/css-selector/Tests/Parser/Handler/CommentHandlerTest.php |
---|
@@ -0,0 +1,55 @@ |
<?php |
/* |
* This file is part of the Symfony package. |
* |
* (c) Fabien Potencier <fabien@symfony.com> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Symfony\Component\CssSelector\Tests\Parser\Handler; |
use Symfony\Component\CssSelector\Parser\Handler\CommentHandler; |
use Symfony\Component\CssSelector\Parser\Reader; |
use Symfony\Component\CssSelector\Parser\Token; |
use Symfony\Component\CssSelector\Parser\TokenStream; |
class CommentHandlerTest extends AbstractHandlerTest |
{ |
/** @dataProvider getHandleValueTestData */ |
public function testHandleValue($value, Token $unusedArgument, $remainingContent) |
{ |
$reader = new Reader($value); |
$stream = new TokenStream(); |
$this->assertTrue($this->generateHandler()->handle($reader, $stream)); |
// comments are ignored (not pushed as token in stream) |
$this->assertStreamEmpty($stream); |
$this->assertRemainingContent($reader, $remainingContent); |
} |
public function getHandleValueTestData() |
{ |
return array( |
// 2nd argument only exists for inherited method compatibility |
array('/* comment */', new Token(null, null, null), ''), |
array('/* comment */foo', new Token(null, null, null), 'foo'), |
); |
} |
public function getDontHandleValueTestData() |
{ |
return array( |
array('>'), |
array('+'), |
array(' '), |
); |
} |
protected function generateHandler() |
{ |
return new CommentHandler(); |
} |
} |
/vendor/symfony/css-selector/Tests/Parser/Handler/HashHandlerTest.php |
---|
@@ -0,0 +1,49 @@ |
<?php |
/* |
* This file is part of the Symfony package. |
* |
* (c) Fabien Potencier <fabien@symfony.com> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Symfony\Component\CssSelector\Tests\Parser\Handler; |
use Symfony\Component\CssSelector\Parser\Handler\HashHandler; |
use Symfony\Component\CssSelector\Parser\Token; |
use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerPatterns; |
use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerEscaping; |
class HashHandlerTest extends AbstractHandlerTest |
{ |
public function getHandleValueTestData() |
{ |
return array( |
array('#id', new Token(Token::TYPE_HASH, 'id', 0), ''), |
array('#123', new Token(Token::TYPE_HASH, '123', 0), ''), |
array('#id.class', new Token(Token::TYPE_HASH, 'id', 0), '.class'), |
array('#id element', new Token(Token::TYPE_HASH, 'id', 0), ' element'), |
); |
} |
public function getDontHandleValueTestData() |
{ |
return array( |
array('id'), |
array('123'), |
array('<'), |
array('<'), |
array('#'), |
); |
} |
protected function generateHandler() |
{ |
$patterns = new TokenizerPatterns(); |
return new HashHandler($patterns, new TokenizerEscaping($patterns)); |
} |
} |
/vendor/symfony/css-selector/Tests/Parser/Handler/IdentifierHandlerTest.php |
---|
@@ -0,0 +1,49 @@ |
<?php |
/* |
* This file is part of the Symfony package. |
* |
* (c) Fabien Potencier <fabien@symfony.com> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Symfony\Component\CssSelector\Tests\Parser\Handler; |
use Symfony\Component\CssSelector\Parser\Handler\IdentifierHandler; |
use Symfony\Component\CssSelector\Parser\Token; |
use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerPatterns; |
use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerEscaping; |
class IdentifierHandlerTest extends AbstractHandlerTest |
{ |
public function getHandleValueTestData() |
{ |
return array( |
array('foo', new Token(Token::TYPE_IDENTIFIER, 'foo', 0), ''), |
array('foo|bar', new Token(Token::TYPE_IDENTIFIER, 'foo', 0), '|bar'), |
array('foo.class', new Token(Token::TYPE_IDENTIFIER, 'foo', 0), '.class'), |
array('foo[attr]', new Token(Token::TYPE_IDENTIFIER, 'foo', 0), '[attr]'), |
array('foo bar', new Token(Token::TYPE_IDENTIFIER, 'foo', 0), ' bar'), |
); |
} |
public function getDontHandleValueTestData() |
{ |
return array( |
array('>'), |
array('+'), |
array(' '), |
array('*|foo'), |
array('/* comment */'), |
); |
} |
protected function generateHandler() |
{ |
$patterns = new TokenizerPatterns(); |
return new IdentifierHandler($patterns, new TokenizerEscaping($patterns)); |
} |
} |
/vendor/symfony/css-selector/Tests/Parser/Handler/NumberHandlerTest.php |
---|
@@ -0,0 +1,50 @@ |
<?php |
/* |
* This file is part of the Symfony package. |
* |
* (c) Fabien Potencier <fabien@symfony.com> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Symfony\Component\CssSelector\Tests\Parser\Handler; |
use Symfony\Component\CssSelector\Parser\Handler\NumberHandler; |
use Symfony\Component\CssSelector\Parser\Token; |
use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerPatterns; |
class NumberHandlerTest extends AbstractHandlerTest |
{ |
public function getHandleValueTestData() |
{ |
return array( |
array('12', new Token(Token::TYPE_NUMBER, '12', 0), ''), |
array('12.34', new Token(Token::TYPE_NUMBER, '12.34', 0), ''), |
array('+12.34', new Token(Token::TYPE_NUMBER, '+12.34', 0), ''), |
array('-12.34', new Token(Token::TYPE_NUMBER, '-12.34', 0), ''), |
array('12 arg', new Token(Token::TYPE_NUMBER, '12', 0), ' arg'), |
array('12]', new Token(Token::TYPE_NUMBER, '12', 0), ']'), |
); |
} |
public function getDontHandleValueTestData() |
{ |
return array( |
array('hello'), |
array('>'), |
array('+'), |
array(' '), |
array('/* comment */'), |
); |
} |
protected function generateHandler() |
{ |
$patterns = new TokenizerPatterns(); |
return new NumberHandler($patterns); |
} |
} |
/vendor/symfony/css-selector/Tests/Parser/Handler/StringHandlerTest.php |
---|
@@ -0,0 +1,50 @@ |
<?php |
/* |
* This file is part of the Symfony package. |
* |
* (c) Fabien Potencier <fabien@symfony.com> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Symfony\Component\CssSelector\Tests\Parser\Handler; |
use Symfony\Component\CssSelector\Parser\Handler\StringHandler; |
use Symfony\Component\CssSelector\Parser\Token; |
use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerPatterns; |
use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerEscaping; |
class StringHandlerTest extends AbstractHandlerTest |
{ |
public function getHandleValueTestData() |
{ |
return array( |
array('"hello"', new Token(Token::TYPE_STRING, 'hello', 1), ''), |
array('"1"', new Token(Token::TYPE_STRING, '1', 1), ''), |
array('" "', new Token(Token::TYPE_STRING, ' ', 1), ''), |
array('""', new Token(Token::TYPE_STRING, '', 1), ''), |
array("'hello'", new Token(Token::TYPE_STRING, 'hello', 1), ''), |
array("'foo'bar", new Token(Token::TYPE_STRING, 'foo', 1), 'bar'), |
); |
} |
public function getDontHandleValueTestData() |
{ |
return array( |
array('hello'), |
array('>'), |
array('1'), |
array(' '), |
); |
} |
protected function generateHandler() |
{ |
$patterns = new TokenizerPatterns(); |
return new StringHandler($patterns, new TokenizerEscaping($patterns)); |
} |
} |
/vendor/symfony/css-selector/Tests/Parser/Handler/WhitespaceHandlerTest.php |
---|
@@ -0,0 +1,44 @@ |
<?php |
/* |
* This file is part of the Symfony package. |
* |
* (c) Fabien Potencier <fabien@symfony.com> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Symfony\Component\CssSelector\Tests\Parser\Handler; |
use Symfony\Component\CssSelector\Parser\Handler\WhitespaceHandler; |
use Symfony\Component\CssSelector\Parser\Token; |
class WhitespaceHandlerTest extends AbstractHandlerTest |
{ |
public function getHandleValueTestData() |
{ |
return array( |
array(' ', new Token(Token::TYPE_WHITESPACE, ' ', 0), ''), |
array("\n", new Token(Token::TYPE_WHITESPACE, "\n", 0), ''), |
array("\t", new Token(Token::TYPE_WHITESPACE, "\t", 0), ''), |
array(' foo', new Token(Token::TYPE_WHITESPACE, ' ', 0), 'foo'), |
array(' .foo', new Token(Token::TYPE_WHITESPACE, ' ', 0), '.foo'), |
); |
} |
public function getDontHandleValueTestData() |
{ |
return array( |
array('>'), |
array('1'), |
array('a'), |
); |
} |
protected function generateHandler() |
{ |
return new WhitespaceHandler(); |
} |
} |
/vendor/symfony/css-selector/Tests/Parser/ParserTest.php |
---|
@@ -0,0 +1,249 @@ |
<?php |
/* |
* This file is part of the Symfony package. |
* |
* (c) Fabien Potencier <fabien@symfony.com> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Symfony\Component\CssSelector\Tests\Parser; |
use PHPUnit\Framework\TestCase; |
use Symfony\Component\CssSelector\Exception\SyntaxErrorException; |
use Symfony\Component\CssSelector\Node\FunctionNode; |
use Symfony\Component\CssSelector\Node\SelectorNode; |
use Symfony\Component\CssSelector\Parser\Parser; |
use Symfony\Component\CssSelector\Parser\Token; |
class ParserTest extends TestCase |
{ |
/** @dataProvider getParserTestData */ |
public function testParser($source, $representation) |
{ |
$parser = new Parser(); |
$this->assertEquals($representation, array_map(function (SelectorNode $node) { |
return (string) $node->getTree(); |
}, $parser->parse($source))); |
} |
/** @dataProvider getParserExceptionTestData */ |
public function testParserException($source, $message) |
{ |
$parser = new Parser(); |
try { |
$parser->parse($source); |
$this->fail('Parser should throw a SyntaxErrorException.'); |
} catch (SyntaxErrorException $e) { |
$this->assertEquals($message, $e->getMessage()); |
} |
} |
/** @dataProvider getPseudoElementsTestData */ |
public function testPseudoElements($source, $element, $pseudo) |
{ |
$parser = new Parser(); |
$selectors = $parser->parse($source); |
$this->assertCount(1, $selectors); |
/** @var SelectorNode $selector */ |
$selector = $selectors[0]; |
$this->assertEquals($element, (string) $selector->getTree()); |
$this->assertEquals($pseudo, (string) $selector->getPseudoElement()); |
} |
/** @dataProvider getSpecificityTestData */ |
public function testSpecificity($source, $value) |
{ |
$parser = new Parser(); |
$selectors = $parser->parse($source); |
$this->assertCount(1, $selectors); |
/** @var SelectorNode $selector */ |
$selector = $selectors[0]; |
$this->assertEquals($value, $selector->getSpecificity()->getValue()); |
} |
/** @dataProvider getParseSeriesTestData */ |
public function testParseSeries($series, $a, $b) |
{ |
$parser = new Parser(); |
$selectors = $parser->parse(sprintf(':nth-child(%s)', $series)); |
$this->assertCount(1, $selectors); |
/** @var FunctionNode $function */ |
$function = $selectors[0]->getTree(); |
$this->assertEquals(array($a, $b), Parser::parseSeries($function->getArguments())); |
} |
/** @dataProvider getParseSeriesExceptionTestData */ |
public function testParseSeriesException($series) |
{ |
$parser = new Parser(); |
$selectors = $parser->parse(sprintf(':nth-child(%s)', $series)); |
$this->assertCount(1, $selectors); |
/** @var FunctionNode $function */ |
$function = $selectors[0]->getTree(); |
$this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}('Symfony\Component\CssSelector\Exception\SyntaxErrorException'); |
Parser::parseSeries($function->getArguments()); |
} |
public function getParserTestData() |
{ |
return array( |
array('*', array('Element[*]')), |
array('*|*', array('Element[*]')), |
array('*|foo', array('Element[foo]')), |
array('foo|*', array('Element[foo|*]')), |
array('foo|bar', array('Element[foo|bar]')), |
array('#foo#bar', array('Hash[Hash[Element[*]#foo]#bar]')), |
array('div>.foo', array('CombinedSelector[Element[div] > Class[Element[*].foo]]')), |
array('div> .foo', array('CombinedSelector[Element[div] > Class[Element[*].foo]]')), |
array('div >.foo', array('CombinedSelector[Element[div] > Class[Element[*].foo]]')), |
array('div > .foo', array('CombinedSelector[Element[div] > Class[Element[*].foo]]')), |
array("div \n> \t \t .foo", array('CombinedSelector[Element[div] > Class[Element[*].foo]]')), |
array('td.foo,.bar', array('Class[Element[td].foo]', 'Class[Element[*].bar]')), |
array('td.foo, .bar', array('Class[Element[td].foo]', 'Class[Element[*].bar]')), |
array("td.foo\t\r\n\f ,\t\r\n\f .bar", array('Class[Element[td].foo]', 'Class[Element[*].bar]')), |
array('td.foo,.bar', array('Class[Element[td].foo]', 'Class[Element[*].bar]')), |
array('td.foo, .bar', array('Class[Element[td].foo]', 'Class[Element[*].bar]')), |
array("td.foo\t\r\n\f ,\t\r\n\f .bar", array('Class[Element[td].foo]', 'Class[Element[*].bar]')), |
array('div, td.foo, div.bar span', array('Element[div]', 'Class[Element[td].foo]', 'CombinedSelector[Class[Element[div].bar] <followed> Element[span]]')), |
array('div > p', array('CombinedSelector[Element[div] > Element[p]]')), |
array('td:first', array('Pseudo[Element[td]:first]')), |
array('td :first', array('CombinedSelector[Element[td] <followed> Pseudo[Element[*]:first]]')), |
array('a[name]', array('Attribute[Element[a][name]]')), |
array("a[ name\t]", array('Attribute[Element[a][name]]')), |
array('a [name]', array('CombinedSelector[Element[a] <followed> Attribute[Element[*][name]]]')), |
array('a[rel="include"]', array("Attribute[Element[a][rel = 'include']]")), |
array('a[rel = include]', array("Attribute[Element[a][rel = 'include']]")), |
array("a[hreflang |= 'en']", array("Attribute[Element[a][hreflang |= 'en']]")), |
array('a[hreflang|=en]', array("Attribute[Element[a][hreflang |= 'en']]")), |
array('div:nth-child(10)', array("Function[Element[div]:nth-child(['10'])]")), |
array(':nth-child(2n+2)', array("Function[Element[*]:nth-child(['2', 'n', '+2'])]")), |
array('div:nth-of-type(10)', array("Function[Element[div]:nth-of-type(['10'])]")), |
array('div div:nth-of-type(10) .aclass', array("CombinedSelector[CombinedSelector[Element[div] <followed> Function[Element[div]:nth-of-type(['10'])]] <followed> Class[Element[*].aclass]]")), |
array('label:only', array('Pseudo[Element[label]:only]')), |
array('a:lang(fr)', array("Function[Element[a]:lang(['fr'])]")), |
array('div:contains("foo")', array("Function[Element[div]:contains(['foo'])]")), |
array('div#foobar', array('Hash[Element[div]#foobar]')), |
array('div:not(div.foo)', array('Negation[Element[div]:not(Class[Element[div].foo])]')), |
array('td ~ th', array('CombinedSelector[Element[td] ~ Element[th]]')), |
array('.foo[data-bar][data-baz=0]', array("Attribute[Attribute[Class[Element[*].foo][data-bar]][data-baz = '0']]")), |
); |
} |
public function getParserExceptionTestData() |
{ |
return array( |
array('attributes(href)/html/body/a', SyntaxErrorException::unexpectedToken('selector', new Token(Token::TYPE_DELIMITER, '(', 10))->getMessage()), |
array('attributes(href)', SyntaxErrorException::unexpectedToken('selector', new Token(Token::TYPE_DELIMITER, '(', 10))->getMessage()), |
array('html/body/a', SyntaxErrorException::unexpectedToken('selector', new Token(Token::TYPE_DELIMITER, '/', 4))->getMessage()), |
array(' ', SyntaxErrorException::unexpectedToken('selector', new Token(Token::TYPE_FILE_END, '', 1))->getMessage()), |
array('div, ', SyntaxErrorException::unexpectedToken('selector', new Token(Token::TYPE_FILE_END, '', 5))->getMessage()), |
array(' , div', SyntaxErrorException::unexpectedToken('selector', new Token(Token::TYPE_DELIMITER, ',', 1))->getMessage()), |
array('p, , div', SyntaxErrorException::unexpectedToken('selector', new Token(Token::TYPE_DELIMITER, ',', 3))->getMessage()), |
array('div > ', SyntaxErrorException::unexpectedToken('selector', new Token(Token::TYPE_FILE_END, '', 6))->getMessage()), |
array(' > div', SyntaxErrorException::unexpectedToken('selector', new Token(Token::TYPE_DELIMITER, '>', 2))->getMessage()), |
array('foo|#bar', SyntaxErrorException::unexpectedToken('identifier or "*"', new Token(Token::TYPE_HASH, 'bar', 4))->getMessage()), |
array('#.foo', SyntaxErrorException::unexpectedToken('selector', new Token(Token::TYPE_DELIMITER, '#', 0))->getMessage()), |
array('.#foo', SyntaxErrorException::unexpectedToken('identifier', new Token(Token::TYPE_HASH, 'foo', 1))->getMessage()), |
array(':#foo', SyntaxErrorException::unexpectedToken('identifier', new Token(Token::TYPE_HASH, 'foo', 1))->getMessage()), |
array('[*]', SyntaxErrorException::unexpectedToken('"|"', new Token(Token::TYPE_DELIMITER, ']', 2))->getMessage()), |
array('[foo|]', SyntaxErrorException::unexpectedToken('identifier', new Token(Token::TYPE_DELIMITER, ']', 5))->getMessage()), |
array('[#]', SyntaxErrorException::unexpectedToken('identifier or "*"', new Token(Token::TYPE_DELIMITER, '#', 1))->getMessage()), |
array('[foo=#]', SyntaxErrorException::unexpectedToken('string or identifier', new Token(Token::TYPE_DELIMITER, '#', 5))->getMessage()), |
array(':nth-child()', SyntaxErrorException::unexpectedToken('at least one argument', new Token(Token::TYPE_DELIMITER, ')', 11))->getMessage()), |
array('[href]a', SyntaxErrorException::unexpectedToken('selector', new Token(Token::TYPE_IDENTIFIER, 'a', 6))->getMessage()), |
array('[rel:stylesheet]', SyntaxErrorException::unexpectedToken('operator', new Token(Token::TYPE_DELIMITER, ':', 4))->getMessage()), |
array('[rel=stylesheet', SyntaxErrorException::unexpectedToken('"]"', new Token(Token::TYPE_FILE_END, '', 15))->getMessage()), |
array(':lang(fr', SyntaxErrorException::unexpectedToken('an argument', new Token(Token::TYPE_FILE_END, '', 8))->getMessage()), |
array(':contains("foo', SyntaxErrorException::unclosedString(10)->getMessage()), |
array('foo!', SyntaxErrorException::unexpectedToken('selector', new Token(Token::TYPE_DELIMITER, '!', 3))->getMessage()), |
); |
} |
public function getPseudoElementsTestData() |
{ |
return array( |
array('foo', 'Element[foo]', ''), |
array('*', 'Element[*]', ''), |
array(':empty', 'Pseudo[Element[*]:empty]', ''), |
array(':BEfore', 'Element[*]', 'before'), |
array(':aftER', 'Element[*]', 'after'), |
array(':First-Line', 'Element[*]', 'first-line'), |
array(':First-Letter', 'Element[*]', 'first-letter'), |
array('::befoRE', 'Element[*]', 'before'), |
array('::AFter', 'Element[*]', 'after'), |
array('::firsT-linE', 'Element[*]', 'first-line'), |
array('::firsT-letteR', 'Element[*]', 'first-letter'), |
array('::Selection', 'Element[*]', 'selection'), |
array('foo:after', 'Element[foo]', 'after'), |
array('foo::selection', 'Element[foo]', 'selection'), |
array('lorem#ipsum ~ a#b.c[href]:empty::selection', 'CombinedSelector[Hash[Element[lorem]#ipsum] ~ Pseudo[Attribute[Class[Hash[Element[a]#b].c][href]]:empty]]', 'selection'), |
); |
} |
public function getSpecificityTestData() |
{ |
return array( |
array('*', 0), |
array(' foo', 1), |
array(':empty ', 10), |
array(':before', 1), |
array('*:before', 1), |
array(':nth-child(2)', 10), |
array('.bar', 10), |
array('[baz]', 10), |
array('[baz="4"]', 10), |
array('[baz^="4"]', 10), |
array('#lipsum', 100), |
array(':not(*)', 0), |
array(':not(foo)', 1), |
array(':not(.foo)', 10), |
array(':not([foo])', 10), |
array(':not(:empty)', 10), |
array(':not(#foo)', 100), |
array('foo:empty', 11), |
array('foo:before', 2), |
array('foo::before', 2), |
array('foo:empty::before', 12), |
array('#lorem + foo#ipsum:first-child > bar:first-line', 213), |
); |
} |
public function getParseSeriesTestData() |
{ |
return array( |
array('1n+3', 1, 3), |
array('1n +3', 1, 3), |
array('1n + 3', 1, 3), |
array('1n+ 3', 1, 3), |
array('1n-3', 1, -3), |
array('1n -3', 1, -3), |
array('1n - 3', 1, -3), |
array('1n- 3', 1, -3), |
array('n-5', 1, -5), |
array('odd', 2, 1), |
array('even', 2, 0), |
array('3n', 3, 0), |
array('n', 1, 0), |
array('+n', 1, 0), |
array('-n', -1, 0), |
array('5', 0, 5), |
); |
} |
public function getParseSeriesExceptionTestData() |
{ |
return array( |
array('foo'), |
array('n+'), |
); |
} |
} |
/vendor/symfony/css-selector/Tests/Parser/ReaderTest.php |
---|
@@ -0,0 +1,102 @@ |
<?php |
/* |
* This file is part of the Symfony package. |
* |
* (c) Fabien Potencier <fabien@symfony.com> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Symfony\Component\CssSelector\Tests\Parser; |
use PHPUnit\Framework\TestCase; |
use Symfony\Component\CssSelector\Parser\Reader; |
class ReaderTest extends TestCase |
{ |
public function testIsEOF() |
{ |
$reader = new Reader(''); |
$this->assertTrue($reader->isEOF()); |
$reader = new Reader('hello'); |
$this->assertFalse($reader->isEOF()); |
$this->assignPosition($reader, 2); |
$this->assertFalse($reader->isEOF()); |
$this->assignPosition($reader, 5); |
$this->assertTrue($reader->isEOF()); |
} |
public function testGetRemainingLength() |
{ |
$reader = new Reader('hello'); |
$this->assertEquals(5, $reader->getRemainingLength()); |
$this->assignPosition($reader, 2); |
$this->assertEquals(3, $reader->getRemainingLength()); |
$this->assignPosition($reader, 5); |
$this->assertEquals(0, $reader->getRemainingLength()); |
} |
public function testGetSubstring() |
{ |
$reader = new Reader('hello'); |
$this->assertEquals('he', $reader->getSubstring(2)); |
$this->assertEquals('el', $reader->getSubstring(2, 1)); |
$this->assignPosition($reader, 2); |
$this->assertEquals('ll', $reader->getSubstring(2)); |
$this->assertEquals('lo', $reader->getSubstring(2, 1)); |
} |
public function testGetOffset() |
{ |
$reader = new Reader('hello'); |
$this->assertEquals(2, $reader->getOffset('ll')); |
$this->assertFalse($reader->getOffset('w')); |
$this->assignPosition($reader, 2); |
$this->assertEquals(0, $reader->getOffset('ll')); |
$this->assertFalse($reader->getOffset('he')); |
} |
public function testFindPattern() |
{ |
$reader = new Reader('hello'); |
$this->assertFalse($reader->findPattern('/world/')); |
$this->assertEquals(array('hello', 'h'), $reader->findPattern('/^([a-z]).*/')); |
$this->assignPosition($reader, 2); |
$this->assertFalse($reader->findPattern('/^h.*/')); |
$this->assertEquals(array('llo'), $reader->findPattern('/^llo$/')); |
} |
public function testMoveForward() |
{ |
$reader = new Reader('hello'); |
$this->assertEquals(0, $reader->getPosition()); |
$reader->moveForward(2); |
$this->assertEquals(2, $reader->getPosition()); |
} |
public function testToEnd() |
{ |
$reader = new Reader('hello'); |
$reader->moveToEnd(); |
$this->assertTrue($reader->isEOF()); |
} |
private function assignPosition(Reader $reader, $value) |
{ |
$position = new \ReflectionProperty($reader, 'position'); |
$position->setAccessible(true); |
$position->setValue($reader, $value); |
} |
} |
/vendor/symfony/css-selector/Tests/Parser/Shortcut/ClassParserTest.php |
---|
@@ -0,0 +1,45 @@ |
<?php |
/* |
* This file is part of the Symfony package. |
* |
* (c) Fabien Potencier <fabien@symfony.com> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Symfony\Component\CssSelector\Tests\Parser\Shortcut; |
use PHPUnit\Framework\TestCase; |
use Symfony\Component\CssSelector\Node\SelectorNode; |
use Symfony\Component\CssSelector\Parser\Shortcut\ClassParser; |
/** |
* @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com> |
*/ |
class ClassParserTest extends TestCase |
{ |
/** @dataProvider getParseTestData */ |
public function testParse($source, $representation) |
{ |
$parser = new ClassParser(); |
$selectors = $parser->parse($source); |
$this->assertCount(1, $selectors); |
/** @var SelectorNode $selector */ |
$selector = $selectors[0]; |
$this->assertEquals($representation, (string) $selector->getTree()); |
} |
public function getParseTestData() |
{ |
return array( |
array('.testclass', 'Class[Element[*].testclass]'), |
array('testel.testclass', 'Class[Element[testel].testclass]'), |
array('testns|.testclass', 'Class[Element[testns|*].testclass]'), |
array('testns|*.testclass', 'Class[Element[testns|*].testclass]'), |
array('testns|testel.testclass', 'Class[Element[testns|testel].testclass]'), |
); |
} |
} |
/vendor/symfony/css-selector/Tests/Parser/Shortcut/ElementParserTest.php |
---|
@@ -0,0 +1,44 @@ |
<?php |
/* |
* This file is part of the Symfony package. |
* |
* (c) Fabien Potencier <fabien@symfony.com> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Symfony\Component\CssSelector\Tests\Parser\Shortcut; |
use PHPUnit\Framework\TestCase; |
use Symfony\Component\CssSelector\Node\SelectorNode; |
use Symfony\Component\CssSelector\Parser\Shortcut\ElementParser; |
/** |
* @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com> |
*/ |
class ElementParserTest extends TestCase |
{ |
/** @dataProvider getParseTestData */ |
public function testParse($source, $representation) |
{ |
$parser = new ElementParser(); |
$selectors = $parser->parse($source); |
$this->assertCount(1, $selectors); |
/** @var SelectorNode $selector */ |
$selector = $selectors[0]; |
$this->assertEquals($representation, (string) $selector->getTree()); |
} |
public function getParseTestData() |
{ |
return array( |
array('*', 'Element[*]'), |
array('testel', 'Element[testel]'), |
array('testns|*', 'Element[testns|*]'), |
array('testns|testel', 'Element[testns|testel]'), |
); |
} |
} |
/vendor/symfony/css-selector/Tests/Parser/Shortcut/EmptyStringParserTest.php |
---|
@@ -0,0 +1,36 @@ |
<?php |
/* |
* This file is part of the Symfony package. |
* |
* (c) Fabien Potencier <fabien@symfony.com> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Symfony\Component\CssSelector\Tests\Parser\Shortcut; |
use PHPUnit\Framework\TestCase; |
use Symfony\Component\CssSelector\Node\SelectorNode; |
use Symfony\Component\CssSelector\Parser\Shortcut\EmptyStringParser; |
/** |
* @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com> |
*/ |
class EmptyStringParserTest extends TestCase |
{ |
public function testParse() |
{ |
$parser = new EmptyStringParser(); |
$selectors = $parser->parse(''); |
$this->assertCount(1, $selectors); |
/** @var SelectorNode $selector */ |
$selector = $selectors[0]; |
$this->assertEquals('Element[*]', (string) $selector->getTree()); |
$selectors = $parser->parse('this will produce an empty array'); |
$this->assertCount(0, $selectors); |
} |
} |
/vendor/symfony/css-selector/Tests/Parser/Shortcut/HashParserTest.php |
---|
@@ -0,0 +1,45 @@ |
<?php |
/* |
* This file is part of the Symfony package. |
* |
* (c) Fabien Potencier <fabien@symfony.com> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Symfony\Component\CssSelector\Tests\Parser\Shortcut; |
use PHPUnit\Framework\TestCase; |
use Symfony\Component\CssSelector\Node\SelectorNode; |
use Symfony\Component\CssSelector\Parser\Shortcut\HashParser; |
/** |
* @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com> |
*/ |
class HashParserTest extends TestCase |
{ |
/** @dataProvider getParseTestData */ |
public function testParse($source, $representation) |
{ |
$parser = new HashParser(); |
$selectors = $parser->parse($source); |
$this->assertCount(1, $selectors); |
/** @var SelectorNode $selector */ |
$selector = $selectors[0]; |
$this->assertEquals($representation, (string) $selector->getTree()); |
} |
public function getParseTestData() |
{ |
return array( |
array('#testid', 'Hash[Element[*]#testid]'), |
array('testel#testid', 'Hash[Element[testel]#testid]'), |
array('testns|#testid', 'Hash[Element[testns|*]#testid]'), |
array('testns|*#testid', 'Hash[Element[testns|*]#testid]'), |
array('testns|testel#testid', 'Hash[Element[testns|testel]#testid]'), |
); |
} |
} |
/vendor/symfony/css-selector/Tests/Parser/TokenStreamTest.php |
---|
@@ -0,0 +1,96 @@ |
<?php |
/* |
* This file is part of the Symfony package. |
* |
* (c) Fabien Potencier <fabien@symfony.com> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Symfony\Component\CssSelector\Tests\Parser; |
use PHPUnit\Framework\TestCase; |
use Symfony\Component\CssSelector\Parser\Token; |
use Symfony\Component\CssSelector\Parser\TokenStream; |
class TokenStreamTest extends TestCase |
{ |
public function testGetNext() |
{ |
$stream = new TokenStream(); |
$stream->push($t1 = new Token(Token::TYPE_IDENTIFIER, 'h1', 0)); |
$stream->push($t2 = new Token(Token::TYPE_DELIMITER, '.', 2)); |
$stream->push($t3 = new Token(Token::TYPE_IDENTIFIER, 'title', 3)); |
$this->assertSame($t1, $stream->getNext()); |
$this->assertSame($t2, $stream->getNext()); |
$this->assertSame($t3, $stream->getNext()); |
} |
public function testGetPeek() |
{ |
$stream = new TokenStream(); |
$stream->push($t1 = new Token(Token::TYPE_IDENTIFIER, 'h1', 0)); |
$stream->push($t2 = new Token(Token::TYPE_DELIMITER, '.', 2)); |
$stream->push($t3 = new Token(Token::TYPE_IDENTIFIER, 'title', 3)); |
$this->assertSame($t1, $stream->getPeek()); |
$this->assertSame($t1, $stream->getNext()); |
$this->assertSame($t2, $stream->getPeek()); |
$this->assertSame($t2, $stream->getPeek()); |
$this->assertSame($t2, $stream->getNext()); |
} |
public function testGetNextIdentifier() |
{ |
$stream = new TokenStream(); |
$stream->push(new Token(Token::TYPE_IDENTIFIER, 'h1', 0)); |
$this->assertEquals('h1', $stream->getNextIdentifier()); |
} |
public function testFailToGetNextIdentifier() |
{ |
$this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}('Symfony\Component\CssSelector\Exception\SyntaxErrorException'); |
$stream = new TokenStream(); |
$stream->push(new Token(Token::TYPE_DELIMITER, '.', 2)); |
$stream->getNextIdentifier(); |
} |
public function testGetNextIdentifierOrStar() |
{ |
$stream = new TokenStream(); |
$stream->push(new Token(Token::TYPE_IDENTIFIER, 'h1', 0)); |
$this->assertEquals('h1', $stream->getNextIdentifierOrStar()); |
$stream->push(new Token(Token::TYPE_DELIMITER, '*', 0)); |
$this->assertNull($stream->getNextIdentifierOrStar()); |
} |
public function testFailToGetNextIdentifierOrStar() |
{ |
$this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}('Symfony\Component\CssSelector\Exception\SyntaxErrorException'); |
$stream = new TokenStream(); |
$stream->push(new Token(Token::TYPE_DELIMITER, '.', 2)); |
$stream->getNextIdentifierOrStar(); |
} |
public function testSkipWhitespace() |
{ |
$stream = new TokenStream(); |
$stream->push($t1 = new Token(Token::TYPE_IDENTIFIER, 'h1', 0)); |
$stream->push($t2 = new Token(Token::TYPE_WHITESPACE, ' ', 2)); |
$stream->push($t3 = new Token(Token::TYPE_IDENTIFIER, 'h1', 3)); |
$stream->skipWhitespace(); |
$this->assertSame($t1, $stream->getNext()); |
$stream->skipWhitespace(); |
$this->assertSame($t3, $stream->getNext()); |
} |
} |
/vendor/symfony/css-selector/Tests/XPath/Fixtures/ids.html |
---|
@@ -0,0 +1,48 @@ |
<html id="html"><head> |
<link id="link-href" href="foo" /> |
<link id="link-nohref" /> |
</head><body> |
<div id="outer-div"> |
<a id="name-anchor" name="foo"></a> |
<a id="tag-anchor" rel="tag" href="http://localhost/foo">link</a> |
<a id="nofollow-anchor" rel="nofollow" href="https://example.org"> |
link</a> |
<ol id="first-ol" class="a b c"> |
<li id="first-li">content</li> |
<li id="second-li" lang="En-us"> |
<div id="li-div"> |
</div> |
</li> |
<li id="third-li" class="ab c"></li> |
<li id="fourth-li" class="ab |
c"></li> |
<li id="fifth-li"></li> |
<li id="sixth-li"></li> |
<li id="seventh-li"> </li> |
</ol> |
<p id="paragraph"> |
<b id="p-b">hi</b> <em id="p-em">there</em> |
<b id="p-b2">guy</b> |
<input type="checkbox" id="checkbox-unchecked" /> |
<input type="checkbox" id="checkbox-disabled" disabled="" /> |
<input type="text" id="text-checked" checked="checked" /> |
<input type="hidden" /> |
<input type="hidden" disabled="disabled" /> |
<input type="checkbox" id="checkbox-checked" checked="checked" /> |
<input type="checkbox" id="checkbox-disabled-checked" |
disabled="disabled" checked="checked" /> |
<fieldset id="fieldset" disabled="disabled"> |
<input type="checkbox" id="checkbox-fieldset-disabled" /> |
<input type="hidden" /> |
</fieldset> |
</p> |
<ol id="second-ol"> |
</ol> |
<map name="dummymap"> |
<area shape="circle" coords="200,250,25" href="foo.html" id="area-href" /> |
<area shape="default" id="area-nohref" /> |
</map> |
</div> |
<div id="foobar-div" foobar="ab bc |
cde"><span id="foobar-span"></span></div> |
</body></html> |
/vendor/symfony/css-selector/Tests/XPath/Fixtures/lang.xml |
---|
@@ -0,0 +1,11 @@ |
<test> |
<a id="first" xml:lang="en">a</a> |
<b id="second" xml:lang="en-US">b</b> |
<c id="third" xml:lang="en-Nz">c</c> |
<d id="fourth" xml:lang="En-us">d</d> |
<e id="fifth" xml:lang="fr">e</e> |
<f id="sixth" xml:lang="ru">f</f> |
<g id="seventh" xml:lang="de"> |
<h id="eighth" xml:lang="zh"/> |
</g> |
</test> |
/vendor/symfony/css-selector/Tests/XPath/Fixtures/shakespear.html |
---|
@@ -0,0 +1,308 @@ |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" |
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" debug="true"> |
<head> |
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> |
</head> |
<body> |
<div id="test"> |
<div class="dialog"> |
<h2>As You Like It</h2> |
<div id="playwright"> |
by William Shakespeare |
</div> |
<div class="dialog scene thirdClass" id="scene1"> |
<h3>ACT I, SCENE III. A room in the palace.</h3> |
<div class="dialog"> |
<div class="direction">Enter CELIA and ROSALIND</div> |
</div> |
<div id="speech1" class="character">CELIA</div> |
<div class="dialog"> |
<div id="scene1.3.1">Why, cousin! why, Rosalind! Cupid have mercy! not a word?</div> |
</div> |
<div id="speech2" class="character">ROSALIND</div> |
<div class="dialog"> |
<div id="scene1.3.2">Not one to throw at a dog.</div> |
</div> |
<div id="speech3" class="character">CELIA</div> |
<div class="dialog"> |
<div id="scene1.3.3">No, thy words are too precious to be cast away upon</div> |
<div id="scene1.3.4">curs; throw some of them at me; come, lame me with reasons.</div> |
</div> |
<div id="speech4" class="character">ROSALIND</div> |
<div id="speech5" class="character">CELIA</div> |
<div class="dialog"> |
<div id="scene1.3.8">But is all this for your father?</div> |
</div> |
<div class="dialog"> |
<div id="scene1.3.5">Then there were two cousins laid up; when the one</div> |
<div id="scene1.3.6">should be lamed with reasons and the other mad</div> |
<div id="scene1.3.7">without any.</div> |
</div> |
<div id="speech6" class="character">ROSALIND</div> |
<div class="dialog"> |
<div id="scene1.3.9">No, some of it is for my child's father. O, how</div> |
<div id="scene1.3.10">full of briers is this working-day world!</div> |
</div> |
<div id="speech7" class="character">CELIA</div> |
<div class="dialog"> |
<div id="scene1.3.11">They are but burs, cousin, thrown upon thee in</div> |
<div id="scene1.3.12">holiday foolery: if we walk not in the trodden</div> |
<div id="scene1.3.13">paths our very petticoats will catch them.</div> |
</div> |
<div id="speech8" class="character">ROSALIND</div> |
<div class="dialog"> |
<div id="scene1.3.14">I could shake them off my coat: these burs are in my heart.</div> |
</div> |
<div id="speech9" class="character">CELIA</div> |
<div class="dialog"> |
<div id="scene1.3.15">Hem them away.</div> |
</div> |
<div id="speech10" class="character">ROSALIND</div> |
<div class="dialog"> |
<div id="scene1.3.16">I would try, if I could cry 'hem' and have him.</div> |
</div> |
<div id="speech11" class="character">CELIA</div> |
<div class="dialog"> |
<div id="scene1.3.17">Come, come, wrestle with thy affections.</div> |
</div> |
<div id="speech12" class="character">ROSALIND</div> |
<div class="dialog"> |
<div id="scene1.3.18">O, they take the part of a better wrestler than myself!</div> |
</div> |
<div id="speech13" class="character">CELIA</div> |
<div class="dialog"> |
<div id="scene1.3.19">O, a good wish upon you! you will try in time, in</div> |
<div id="scene1.3.20">despite of a fall. But, turning these jests out of</div> |
<div id="scene1.3.21">service, let us talk in good earnest: is it</div> |
<div id="scene1.3.22">possible, on such a sudden, you should fall into so</div> |
<div id="scene1.3.23">strong a liking with old Sir Rowland's youngest son?</div> |
</div> |
<div id="speech14" class="character">ROSALIND</div> |
<div class="dialog"> |
<div id="scene1.3.24">The duke my father loved his father dearly.</div> |
</div> |
<div id="speech15" class="character">CELIA</div> |
<div class="dialog"> |
<div id="scene1.3.25">Doth it therefore ensue that you should love his son</div> |
<div id="scene1.3.26">dearly? By this kind of chase, I should hate him,</div> |
<div id="scene1.3.27">for my father hated his father dearly; yet I hate</div> |
<div id="scene1.3.28">not Orlando.</div> |
</div> |
<div id="speech16" class="character">ROSALIND</div> |
<div title="wtf" class="dialog"> |
<div id="scene1.3.29">No, faith, hate him not, for my sake.</div> |
</div> |
<div id="speech17" class="character">CELIA</div> |
<div class="dialog"> |
<div id="scene1.3.30">Why should I not? doth he not deserve well?</div> |
</div> |
<div id="speech18" class="character">ROSALIND</div> |
<div class="dialog"> |
<div id="scene1.3.31">Let me love him for that, and do you love him</div> |
<div id="scene1.3.32">because I do. Look, here comes the duke.</div> |
</div> |
<div id="speech19" class="character">CELIA</div> |
<div class="dialog"> |
<div id="scene1.3.33">With his eyes full of anger.</div> |
<div class="direction">Enter DUKE FREDERICK, with Lords</div> |
</div> |
<div id="speech20" class="character">DUKE FREDERICK</div> |
<div class="dialog"> |
<div id="scene1.3.34">Mistress, dispatch you with your safest haste</div> |
<div id="scene1.3.35">And get you from our court.</div> |
</div> |
<div id="speech21" class="character">ROSALIND</div> |
<div class="dialog"> |
<div id="scene1.3.36">Me, uncle?</div> |
</div> |
<div id="speech22" class="character">DUKE FREDERICK</div> |
<div class="dialog"> |
<div id="scene1.3.37">You, cousin</div> |
<div id="scene1.3.38">Within these ten days if that thou be'st found</div> |
<div id="scene1.3.39">So near our public court as twenty miles,</div> |
<div id="scene1.3.40">Thou diest for it.</div> |
</div> |
<div id="speech23" class="character">ROSALIND</div> |
<div class="dialog"> |
<div id="scene1.3.41"> I do beseech your grace,</div> |
<div id="scene1.3.42">Let me the knowledge of my fault bear with me:</div> |
<div id="scene1.3.43">If with myself I hold intelligence</div> |
<div id="scene1.3.44">Or have acquaintance with mine own desires,</div> |
<div id="scene1.3.45">If that I do not dream or be not frantic,--</div> |
<div id="scene1.3.46">As I do trust I am not--then, dear uncle,</div> |
<div id="scene1.3.47">Never so much as in a thought unborn</div> |
<div id="scene1.3.48">Did I offend your highness.</div> |
</div> |
<div id="speech24" class="character">DUKE FREDERICK</div> |
<div class="dialog"> |
<div id="scene1.3.49">Thus do all traitors:</div> |
<div id="scene1.3.50">If their purgation did consist in words,</div> |
<div id="scene1.3.51">They are as innocent as grace itself:</div> |
<div id="scene1.3.52">Let it suffice thee that I trust thee not.</div> |
</div> |
<div id="speech25" class="character">ROSALIND</div> |
<div class="dialog"> |
<div id="scene1.3.53">Yet your mistrust cannot make me a traitor:</div> |
<div id="scene1.3.54">Tell me whereon the likelihood depends.</div> |
</div> |
<div id="speech26" class="character">DUKE FREDERICK</div> |
<div class="dialog"> |
<div id="scene1.3.55">Thou art thy father's daughter; there's enough.</div> |
</div> |
<div id="speech27" class="character">ROSALIND</div> |
<div class="dialog"> |
<div id="scene1.3.56">So was I when your highness took his dukedom;</div> |
<div id="scene1.3.57">So was I when your highness banish'd him:</div> |
<div id="scene1.3.58">Treason is not inherited, my lord;</div> |
<div id="scene1.3.59">Or, if we did derive it from our friends,</div> |
<div id="scene1.3.60">What's that to me? my father was no traitor:</div> |
<div id="scene1.3.61">Then, good my liege, mistake me not so much</div> |
<div id="scene1.3.62">To think my poverty is treacherous.</div> |
</div> |
<div id="speech28" class="character">CELIA</div> |
<div class="dialog"> |
<div id="scene1.3.63">Dear sovereign, hear me speak.</div> |
</div> |
<div id="speech29" class="character">DUKE FREDERICK</div> |
<div class="dialog"> |
<div id="scene1.3.64">Ay, Celia; we stay'd her for your sake,</div> |
<div id="scene1.3.65">Else had she with her father ranged along.</div> |
</div> |
<div id="speech30" class="character">CELIA</div> |
<div class="dialog"> |
<div id="scene1.3.66">I did not then entreat to have her stay;</div> |
<div id="scene1.3.67">It was your pleasure and your own remorse:</div> |
<div id="scene1.3.68">I was too young that time to value her;</div> |
<div id="scene1.3.69">But now I know her: if she be a traitor,</div> |
<div id="scene1.3.70">Why so am I; we still have slept together,</div> |
<div id="scene1.3.71">Rose at an instant, learn'd, play'd, eat together,</div> |
<div id="scene1.3.72">And wheresoever we went, like Juno's swans,</div> |
<div id="scene1.3.73">Still we went coupled and inseparable.</div> |
</div> |
<div id="speech31" class="character">DUKE FREDERICK</div> |
<div class="dialog"> |
<div id="scene1.3.74">She is too subtle for thee; and her smoothness,</div> |
<div id="scene1.3.75">Her very silence and her patience</div> |
<div id="scene1.3.76">Speak to the people, and they pity her.</div> |
<div id="scene1.3.77">Thou art a fool: she robs thee of thy name;</div> |
<div id="scene1.3.78">And thou wilt show more bright and seem more virtuous</div> |
<div id="scene1.3.79">When she is gone. Then open not thy lips:</div> |
<div id="scene1.3.80">Firm and irrevocable is my doom</div> |
<div id="scene1.3.81">Which I have pass'd upon her; she is banish'd.</div> |
</div> |
<div id="speech32" class="character">CELIA</div> |
<div class="dialog"> |
<div id="scene1.3.82">Pronounce that sentence then on me, my liege:</div> |
<div id="scene1.3.83">I cannot live out of her company.</div> |
</div> |
<div id="speech33" class="character">DUKE FREDERICK</div> |
<div class="dialog"> |
<div id="scene1.3.84">You are a fool. You, niece, provide yourself:</div> |
<div id="scene1.3.85">If you outstay the time, upon mine honour,</div> |
<div id="scene1.3.86">And in the greatness of my word, you die.</div> |
<div class="direction">Exeunt DUKE FREDERICK and Lords</div> |
</div> |
<div id="speech34" class="character">CELIA</div> |
<div class="dialog"> |
<div id="scene1.3.87">O my poor Rosalind, whither wilt thou go?</div> |
<div id="scene1.3.88">Wilt thou change fathers? I will give thee mine.</div> |
<div id="scene1.3.89">I charge thee, be not thou more grieved than I am.</div> |
</div> |
<div id="speech35" class="character">ROSALIND</div> |
<div class="dialog"> |
<div id="scene1.3.90">I have more cause.</div> |
</div> |
<div id="speech36" class="character">CELIA</div> |
<div class="dialog"> |
<div id="scene1.3.91"> Thou hast not, cousin;</div> |
<div id="scene1.3.92">Prithee be cheerful: know'st thou not, the duke</div> |
<div id="scene1.3.93">Hath banish'd me, his daughter?</div> |
</div> |
<div id="speech37" class="character">ROSALIND</div> |
<div class="dialog"> |
<div id="scene1.3.94">That he hath not.</div> |
</div> |
<div id="speech38" class="character">CELIA</div> |
<div class="dialog"> |
<div id="scene1.3.95">No, hath not? Rosalind lacks then the love</div> |
<div id="scene1.3.96">Which teacheth thee that thou and I am one:</div> |
<div id="scene1.3.97">Shall we be sunder'd? shall we part, sweet girl?</div> |
<div id="scene1.3.98">No: let my father seek another heir.</div> |
<div id="scene1.3.99">Therefore devise with me how we may fly,</div> |
<div id="scene1.3.100">Whither to go and what to bear with us;</div> |
<div id="scene1.3.101">And do not seek to take your change upon you,</div> |
<div id="scene1.3.102">To bear your griefs yourself and leave me out;</div> |
<div id="scene1.3.103">For, by this heaven, now at our sorrows pale,</div> |
<div id="scene1.3.104">Say what thou canst, I'll go along with thee.</div> |
</div> |
<div id="speech39" class="character">ROSALIND</div> |
<div class="dialog"> |
<div id="scene1.3.105">Why, whither shall we go?</div> |
</div> |
<div id="speech40" class="character">CELIA</div> |
<div class="dialog"> |
<div id="scene1.3.106">To seek my uncle in the forest of Arden.</div> |
</div> |
<div id="speech41" class="character">ROSALIND</div> |
<div class="dialog"> |
<div id="scene1.3.107">Alas, what danger will it be to us,</div> |
<div id="scene1.3.108">Maids as we are, to travel forth so far!</div> |
<div id="scene1.3.109">Beauty provoketh thieves sooner than gold.</div> |
</div> |
<div id="speech42" class="character">CELIA</div> |
<div class="dialog"> |
<div id="scene1.3.110">I'll put myself in poor and mean attire</div> |
<div id="scene1.3.111">And with a kind of umber smirch my face;</div> |
<div id="scene1.3.112">The like do you: so shall we pass along</div> |
<div id="scene1.3.113">And never stir assailants.</div> |
</div> |
<div id="speech43" class="character">ROSALIND</div> |
<div class="dialog"> |
<div id="scene1.3.114">Were it not better,</div> |
<div id="scene1.3.115">Because that I am more than common tall,</div> |
<div id="scene1.3.116">That I did suit me all points like a man?</div> |
<div id="scene1.3.117">A gallant curtle-axe upon my thigh,</div> |
<div id="scene1.3.118">A boar-spear in my hand; and--in my heart</div> |
<div id="scene1.3.119">Lie there what hidden woman's fear there will--</div> |
<div id="scene1.3.120">We'll have a swashing and a martial outside,</div> |
<div id="scene1.3.121">As many other mannish cowards have</div> |
<div id="scene1.3.122">That do outface it with their semblances.</div> |
</div> |
<div id="speech44" class="character">CELIA</div> |
<div class="dialog"> |
<div id="scene1.3.123">What shall I call thee when thou art a man?</div> |
</div> |
<div id="speech45" class="character">ROSALIND</div> |
<div class="dialog"> |
<div id="scene1.3.124">I'll have no worse a name than Jove's own page;</div> |
<div id="scene1.3.125">And therefore look you call me Ganymede.</div> |
<div id="scene1.3.126">But what will you be call'd?</div> |
</div> |
<div id="speech46" class="character">CELIA</div> |
<div class="dialog"> |
<div id="scene1.3.127">Something that hath a reference to my state</div> |
<div id="scene1.3.128">No longer Celia, but Aliena.</div> |
</div> |
<div id="speech47" class="character">ROSALIND</div> |
<div class="dialog"> |
<div id="scene1.3.129">But, cousin, what if we assay'd to steal</div> |
<div id="scene1.3.130">The clownish fool out of your father's court?</div> |
<div id="scene1.3.131">Would he not be a comfort to our travel?</div> |
</div> |
<div id="speech48" class="character">CELIA</div> |
<div class="dialog"> |
<div id="scene1.3.132">He'll go along o'er the wide world with me;</div> |
<div id="scene1.3.133">Leave me alone to woo him. Let's away,</div> |
<div id="scene1.3.134">And get our jewels and our wealth together,</div> |
<div id="scene1.3.135">Devise the fittest time and safest way</div> |
<div id="scene1.3.136">To hide us from pursuit that will be made</div> |
<div id="scene1.3.137">After my flight. Now go we in content</div> |
<div id="scene1.3.138">To liberty and not to banishment.</div> |
<div class="direction">Exeunt</div> |
</div> |
</div> |
</div> |
</div> |
</body> |
</html> |
/vendor/symfony/css-selector/Tests/XPath/TranslatorTest.php |
---|
@@ -0,0 +1,325 @@ |
<?php |
/* |
* This file is part of the Symfony package. |
* |
* (c) Fabien Potencier <fabien@symfony.com> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Symfony\Component\CssSelector\Tests\XPath; |
use PHPUnit\Framework\TestCase; |
use Symfony\Component\CssSelector\XPath\Extension\HtmlExtension; |
use Symfony\Component\CssSelector\XPath\Translator; |
class TranslatorTest extends TestCase |
{ |
/** @dataProvider getXpathLiteralTestData */ |
public function testXpathLiteral($value, $literal) |
{ |
$this->assertEquals($literal, Translator::getXpathLiteral($value)); |
} |
/** @dataProvider getCssToXPathTestData */ |
public function testCssToXPath($css, $xpath) |
{ |
$translator = new Translator(); |
$translator->registerExtension(new HtmlExtension($translator)); |
$this->assertEquals($xpath, $translator->cssToXPath($css, '')); |
} |
/** @dataProvider getXmlLangTestData */ |
public function testXmlLang($css, array $elementsId) |
{ |
$translator = new Translator(); |
$document = new \SimpleXMLElement(file_get_contents(__DIR__.'/Fixtures/lang.xml')); |
$elements = $document->xpath($translator->cssToXPath($css)); |
$this->assertEquals(count($elementsId), count($elements)); |
foreach ($elements as $element) { |
$this->assertTrue(in_array($element->attributes()->id, $elementsId)); |
} |
} |
/** @dataProvider getHtmlIdsTestData */ |
public function testHtmlIds($css, array $elementsId) |
{ |
$translator = new Translator(); |
$translator->registerExtension(new HtmlExtension($translator)); |
$document = new \DOMDocument(); |
$document->strictErrorChecking = false; |
$internalErrors = libxml_use_internal_errors(true); |
$document->loadHTMLFile(__DIR__.'/Fixtures/ids.html'); |
$document = simplexml_import_dom($document); |
$elements = $document->xpath($translator->cssToXPath($css)); |
$this->assertCount(count($elementsId), $elementsId); |
foreach ($elements as $element) { |
if (null !== $element->attributes()->id) { |
$this->assertTrue(in_array($element->attributes()->id, $elementsId)); |
} |
} |
libxml_clear_errors(); |
libxml_use_internal_errors($internalErrors); |
} |
/** @dataProvider getHtmlShakespearTestData */ |
public function testHtmlShakespear($css, $count) |
{ |
$translator = new Translator(); |
$translator->registerExtension(new HtmlExtension($translator)); |
$document = new \DOMDocument(); |
$document->strictErrorChecking = false; |
$document->loadHTMLFile(__DIR__.'/Fixtures/shakespear.html'); |
$document = simplexml_import_dom($document); |
$bodies = $document->xpath('//body'); |
$elements = $bodies[0]->xpath($translator->cssToXPath($css)); |
$this->assertCount($count, $elements); |
} |
public function getXpathLiteralTestData() |
{ |
return array( |
array('foo', "'foo'"), |
array("foo's bar", '"foo\'s bar"'), |
array("foo's \"middle\" bar", 'concat(\'foo\', "\'", \'s "middle" bar\')'), |
array("foo's 'middle' \"bar\"", 'concat(\'foo\', "\'", \'s \', "\'", \'middle\', "\'", \' "bar"\')'), |
); |
} |
public function getCssToXPathTestData() |
{ |
return array( |
array('*', '*'), |
array('e', 'e'), |
array('*|e', 'e'), |
array('e|f', 'e:f'), |
array('e[foo]', 'e[@foo]'), |
array('e[foo|bar]', 'e[@foo:bar]'), |
array('e[foo="bar"]', "e[@foo = 'bar']"), |
array('e[foo~="bar"]', "e[@foo and contains(concat(' ', normalize-space(@foo), ' '), ' bar ')]"), |
array('e[foo^="bar"]', "e[@foo and starts-with(@foo, 'bar')]"), |
array('e[foo$="bar"]', "e[@foo and substring(@foo, string-length(@foo)-2) = 'bar']"), |
array('e[foo*="bar"]', "e[@foo and contains(@foo, 'bar')]"), |
array('e[hreflang|="en"]', "e[@hreflang and (@hreflang = 'en' or starts-with(@hreflang, 'en-'))]"), |
array('e:nth-child(1)', "*/*[name() = 'e' and (position() = 1)]"), |
array('e:nth-last-child(1)', "*/*[name() = 'e' and (position() = last() - 0)]"), |
array('e:nth-last-child(2n+2)', "*/*[name() = 'e' and (last() - position() - 1 >= 0 and (last() - position() - 1) mod 2 = 0)]"), |
array('e:nth-of-type(1)', '*/e[position() = 1]'), |
array('e:nth-last-of-type(1)', '*/e[position() = last() - 0]'), |
array('div e:nth-last-of-type(1) .aclass', "div/descendant-or-self::*/e[position() = last() - 0]/descendant-or-self::*/*[@class and contains(concat(' ', normalize-space(@class), ' '), ' aclass ')]"), |
array('e:first-child', "*/*[name() = 'e' and (position() = 1)]"), |
array('e:last-child', "*/*[name() = 'e' and (position() = last())]"), |
array('e:first-of-type', '*/e[position() = 1]'), |
array('e:last-of-type', '*/e[position() = last()]'), |
array('e:only-child', "*/*[name() = 'e' and (last() = 1)]"), |
array('e:only-of-type', 'e[last() = 1]'), |
array('e:empty', 'e[not(*) and not(string-length())]'), |
array('e:EmPTY', 'e[not(*) and not(string-length())]'), |
array('e:root', 'e[not(parent::*)]'), |
array('e:hover', 'e[0]'), |
array('e:contains("foo")', "e[contains(string(.), 'foo')]"), |
array('e:ConTains(foo)', "e[contains(string(.), 'foo')]"), |
array('e.warning', "e[@class and contains(concat(' ', normalize-space(@class), ' '), ' warning ')]"), |
array('e#myid', "e[@id = 'myid']"), |
array('e:not(:nth-child(odd))', 'e[not(position() - 1 >= 0 and (position() - 1) mod 2 = 0)]'), |
array('e:nOT(*)', 'e[0]'), |
array('e f', 'e/descendant-or-self::*/f'), |
array('e > f', 'e/f'), |
array('e + f', "e/following-sibling::*[name() = 'f' and (position() = 1)]"), |
array('e ~ f', 'e/following-sibling::f'), |
array('div#container p', "div[@id = 'container']/descendant-or-self::*/p"), |
); |
} |
public function getXmlLangTestData() |
{ |
return array( |
array(':lang("EN")', array('first', 'second', 'third', 'fourth')), |
array(':lang("en-us")', array('second', 'fourth')), |
array(':lang(en-nz)', array('third')), |
array(':lang(fr)', array('fifth')), |
array(':lang(ru)', array('sixth')), |
array(":lang('ZH')", array('eighth')), |
array(':lang(de) :lang(zh)', array('eighth')), |
array(':lang(en), :lang(zh)', array('first', 'second', 'third', 'fourth', 'eighth')), |
array(':lang(es)', array()), |
); |
} |
public function getHtmlIdsTestData() |
{ |
return array( |
array('div', array('outer-div', 'li-div', 'foobar-div')), |
array('DIV', array('outer-div', 'li-div', 'foobar-div')), // case-insensitive in HTML |
array('div div', array('li-div')), |
array('div, div div', array('outer-div', 'li-div', 'foobar-div')), |
array('a[name]', array('name-anchor')), |
array('a[NAme]', array('name-anchor')), // case-insensitive in HTML: |
array('a[rel]', array('tag-anchor', 'nofollow-anchor')), |
array('a[rel="tag"]', array('tag-anchor')), |
array('a[href*="localhost"]', array('tag-anchor')), |
array('a[href*=""]', array()), |
array('a[href^="http"]', array('tag-anchor', 'nofollow-anchor')), |
array('a[href^="http:"]', array('tag-anchor')), |
array('a[href^=""]', array()), |
array('a[href$="org"]', array('nofollow-anchor')), |
array('a[href$=""]', array()), |
array('div[foobar~="bc"]', array('foobar-div')), |
array('div[foobar~="cde"]', array('foobar-div')), |
array('[foobar~="ab bc"]', array('foobar-div')), |
array('[foobar~=""]', array()), |
array('[foobar~=" \t"]', array()), |
array('div[foobar~="cd"]', array()), |
array('*[lang|="En"]', array('second-li')), |
array('[lang|="En-us"]', array('second-li')), |
// Attribute values are case sensitive |
array('*[lang|="en"]', array()), |
array('[lang|="en-US"]', array()), |
array('*[lang|="e"]', array()), |
// ... :lang() is not. |
array(':lang("EN")', array('second-li', 'li-div')), |
array('*:lang(en-US)', array('second-li', 'li-div')), |
array(':lang("e")', array()), |
array('li:nth-child(3)', array('third-li')), |
array('li:nth-child(10)', array()), |
array('li:nth-child(2n)', array('second-li', 'fourth-li', 'sixth-li')), |
array('li:nth-child(even)', array('second-li', 'fourth-li', 'sixth-li')), |
array('li:nth-child(2n+0)', array('second-li', 'fourth-li', 'sixth-li')), |
array('li:nth-child(+2n+1)', array('first-li', 'third-li', 'fifth-li', 'seventh-li')), |
array('li:nth-child(odd)', array('first-li', 'third-li', 'fifth-li', 'seventh-li')), |
array('li:nth-child(2n+4)', array('fourth-li', 'sixth-li')), |
array('li:nth-child(3n+1)', array('first-li', 'fourth-li', 'seventh-li')), |
array('li:nth-child(n)', array('first-li', 'second-li', 'third-li', 'fourth-li', 'fifth-li', 'sixth-li', 'seventh-li')), |
array('li:nth-child(n-1)', array('first-li', 'second-li', 'third-li', 'fourth-li', 'fifth-li', 'sixth-li', 'seventh-li')), |
array('li:nth-child(n+1)', array('first-li', 'second-li', 'third-li', 'fourth-li', 'fifth-li', 'sixth-li', 'seventh-li')), |
array('li:nth-child(n+3)', array('third-li', 'fourth-li', 'fifth-li', 'sixth-li', 'seventh-li')), |
array('li:nth-child(-n)', array()), |
array('li:nth-child(-n-1)', array()), |
array('li:nth-child(-n+1)', array('first-li')), |
array('li:nth-child(-n+3)', array('first-li', 'second-li', 'third-li')), |
array('li:nth-last-child(0)', array()), |
array('li:nth-last-child(2n)', array('second-li', 'fourth-li', 'sixth-li')), |
array('li:nth-last-child(even)', array('second-li', 'fourth-li', 'sixth-li')), |
array('li:nth-last-child(2n+2)', array('second-li', 'fourth-li', 'sixth-li')), |
array('li:nth-last-child(n)', array('first-li', 'second-li', 'third-li', 'fourth-li', 'fifth-li', 'sixth-li', 'seventh-li')), |
array('li:nth-last-child(n-1)', array('first-li', 'second-li', 'third-li', 'fourth-li', 'fifth-li', 'sixth-li', 'seventh-li')), |
array('li:nth-last-child(n-3)', array('first-li', 'second-li', 'third-li', 'fourth-li', 'fifth-li', 'sixth-li', 'seventh-li')), |
array('li:nth-last-child(n+1)', array('first-li', 'second-li', 'third-li', 'fourth-li', 'fifth-li', 'sixth-li', 'seventh-li')), |
array('li:nth-last-child(n+3)', array('first-li', 'second-li', 'third-li', 'fourth-li', 'fifth-li')), |
array('li:nth-last-child(-n)', array()), |
array('li:nth-last-child(-n-1)', array()), |
array('li:nth-last-child(-n+1)', array('seventh-li')), |
array('li:nth-last-child(-n+3)', array('fifth-li', 'sixth-li', 'seventh-li')), |
array('ol:first-of-type', array('first-ol')), |
array('ol:nth-child(1)', array('first-ol')), |
array('ol:nth-of-type(2)', array('second-ol')), |
array('ol:nth-last-of-type(1)', array('second-ol')), |
array('span:only-child', array('foobar-span')), |
array('li div:only-child', array('li-div')), |
array('div *:only-child', array('li-div', 'foobar-span')), |
array('p:only-of-type', array('paragraph')), |
array('a:empty', array('name-anchor')), |
array('a:EMpty', array('name-anchor')), |
array('li:empty', array('third-li', 'fourth-li', 'fifth-li', 'sixth-li')), |
array(':root', array('html')), |
array('html:root', array('html')), |
array('li:root', array()), |
array('* :root', array()), |
array('*:contains("link")', array('html', 'outer-div', 'tag-anchor', 'nofollow-anchor')), |
array(':CONtains("link")', array('html', 'outer-div', 'tag-anchor', 'nofollow-anchor')), |
array('*:contains("LInk")', array()), // case sensitive |
array('*:contains("e")', array('html', 'nil', 'outer-div', 'first-ol', 'first-li', 'paragraph', 'p-em')), |
array('*:contains("E")', array()), // case-sensitive |
array('.a', array('first-ol')), |
array('.b', array('first-ol')), |
array('*.a', array('first-ol')), |
array('ol.a', array('first-ol')), |
array('.c', array('first-ol', 'third-li', 'fourth-li')), |
array('*.c', array('first-ol', 'third-li', 'fourth-li')), |
array('ol *.c', array('third-li', 'fourth-li')), |
array('ol li.c', array('third-li', 'fourth-li')), |
array('li ~ li.c', array('third-li', 'fourth-li')), |
array('ol > li.c', array('third-li', 'fourth-li')), |
array('#first-li', array('first-li')), |
array('li#first-li', array('first-li')), |
array('*#first-li', array('first-li')), |
array('li div', array('li-div')), |
array('li > div', array('li-div')), |
array('div div', array('li-div')), |
array('div > div', array()), |
array('div>.c', array('first-ol')), |
array('div > .c', array('first-ol')), |
array('div + div', array('foobar-div')), |
array('a ~ a', array('tag-anchor', 'nofollow-anchor')), |
array('a[rel="tag"] ~ a', array('nofollow-anchor')), |
array('ol#first-ol li:last-child', array('seventh-li')), |
array('ol#first-ol *:last-child', array('li-div', 'seventh-li')), |
array('#outer-div:first-child', array('outer-div')), |
array('#outer-div :first-child', array('name-anchor', 'first-li', 'li-div', 'p-b', 'checkbox-fieldset-disabled', 'area-href')), |
array('a[href]', array('tag-anchor', 'nofollow-anchor')), |
array(':not(*)', array()), |
array('a:not([href])', array('name-anchor')), |
array('ol :Not(li[class])', array('first-li', 'second-li', 'li-div', 'fifth-li', 'sixth-li', 'seventh-li')), |
// HTML-specific |
array(':link', array('link-href', 'tag-anchor', 'nofollow-anchor', 'area-href')), |
array(':visited', array()), |
array(':enabled', array('link-href', 'tag-anchor', 'nofollow-anchor', 'checkbox-unchecked', 'text-checked', 'checkbox-checked', 'area-href')), |
array(':disabled', array('checkbox-disabled', 'checkbox-disabled-checked', 'fieldset', 'checkbox-fieldset-disabled')), |
array(':checked', array('checkbox-checked', 'checkbox-disabled-checked')), |
); |
} |
public function getHtmlShakespearTestData() |
{ |
return array( |
array('*', 246), |
array('div:contains(CELIA)', 26), |
array('div:only-child', 22), // ? |
array('div:nth-child(even)', 106), |
array('div:nth-child(2n)', 106), |
array('div:nth-child(odd)', 137), |
array('div:nth-child(2n+1)', 137), |
array('div:nth-child(n)', 243), |
array('div:last-child', 53), |
array('div:first-child', 51), |
array('div > div', 242), |
array('div + div', 190), |
array('div ~ div', 190), |
array('body', 1), |
array('body div', 243), |
array('div', 243), |
array('div div', 242), |
array('div div div', 241), |
array('div, div, div', 243), |
array('div, a, span', 243), |
array('.dialog', 51), |
array('div.dialog', 51), |
array('div .dialog', 51), |
array('div.character, div.dialog', 99), |
array('div.direction.dialog', 0), |
array('div.dialog.direction', 0), |
array('div.dialog.scene', 1), |
array('div.scene.scene', 1), |
array('div.scene .scene', 0), |
array('div.direction .dialog ', 0), |
array('div .dialog .direction', 4), |
array('div.dialog .dialog .direction', 4), |
array('#speech5', 1), |
array('div#speech5', 1), |
array('div #speech5', 1), |
array('div.scene div.dialog', 49), |
array('div#scene1 div.dialog div', 142), |
array('#scene1 #speech1', 1), |
array('div[class]', 103), |
array('div[class=dialog]', 50), |
array('div[class^=dia]', 51), |
array('div[class$=log]', 50), |
array('div[class*=sce]', 1), |
array('div[class|=dialog]', 50), // ? Seems right |
array('div[class!=madeup]', 243), // ? Seems right |
array('div[class~=dialog]', 51), // ? Seems right |
); |
} |
} |