123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- <?php
- namespace Hamcrest\Xml;
- class HasXPathTest extends \Hamcrest\AbstractMatcherTest
- {
- protected static $xml;
- protected static $doc;
- protected static $html;
- public static function setUpBeforeClass()
- {
- self::$xml = <<<XML
- <?xml version="1.0"?>
- <users>
- <user>
- <id>alice</id>
- <name>Alice Frankel</name>
- <role>admin</role>
- </user>
- <user>
- <id>bob</id>
- <name>Bob Frankel</name>
- <role>user</role>
- </user>
- <user>
- <id>charlie</id>
- <name>Charlie Chan</name>
- <role>user</role>
- </user>
- </users>
- XML;
- self::$doc = new \DOMDocument();
- self::$doc->loadXML(self::$xml);
- self::$html = <<<HTML
- <html>
- <head>
- <title>Home Page</title>
- </head>
- <body>
- <h1>Heading</h1>
- <p>Some text</p>
- </body>
- </html>
- HTML;
- }
- protected function createMatcher()
- {
- return \Hamcrest\Xml\HasXPath::hasXPath('/users/user');
- }
- public function testMatchesWhenXPathIsFound()
- {
- assertThat('one match', self::$doc, hasXPath('user[id = "bob"]'));
- assertThat('two matches', self::$doc, hasXPath('user[role = "user"]'));
- }
- public function testDoesNotMatchWhenXPathIsNotFound()
- {
- assertThat(
- 'no match',
- self::$doc,
- not(hasXPath('user[contains(id, "frank")]'))
- );
- }
- public function testMatchesWhenExpressionWithoutMatcherEvaluatesToTrue()
- {
- assertThat(
- 'one match',
- self::$doc,
- hasXPath('count(user[id = "bob"])')
- );
- }
- public function testDoesNotMatchWhenExpressionWithoutMatcherEvaluatesToFalse()
- {
- assertThat(
- 'no matches',
- self::$doc,
- not(hasXPath('count(user[id = "frank"])'))
- );
- }
- public function testMatchesWhenExpressionIsEqual()
- {
- assertThat(
- 'one match',
- self::$doc,
- hasXPath('count(user[id = "bob"])', 1)
- );
- assertThat(
- 'two matches',
- self::$doc,
- hasXPath('count(user[role = "user"])', 2)
- );
- }
- public function testDoesNotMatchWhenExpressionIsNotEqual()
- {
- assertThat(
- 'no match',
- self::$doc,
- not(hasXPath('count(user[id = "frank"])', 2))
- );
- assertThat(
- 'one match',
- self::$doc,
- not(hasXPath('count(user[role = "admin"])', 2))
- );
- }
- public function testMatchesWhenContentMatches()
- {
- assertThat(
- 'one match',
- self::$doc,
- hasXPath('user/name', containsString('ice'))
- );
- assertThat(
- 'two matches',
- self::$doc,
- hasXPath('user/role', equalTo('user'))
- );
- }
- public function testDoesNotMatchWhenContentDoesNotMatch()
- {
- assertThat(
- 'no match',
- self::$doc,
- not(hasXPath('user/name', containsString('Bobby')))
- );
- assertThat(
- 'no matches',
- self::$doc,
- not(hasXPath('user/role', equalTo('owner')))
- );
- }
- public function testProvidesConvenientShortcutForHasXPathEqualTo()
- {
- assertThat('matches', self::$doc, hasXPath('count(user)', 3));
- assertThat('matches', self::$doc, hasXPath('user[2]/id', 'bob'));
- }
- public function testProvidesConvenientShortcutForHasXPathCountEqualTo()
- {
- assertThat('matches', self::$doc, hasXPath('user[id = "charlie"]', 1));
- }
- public function testMatchesAcceptsXmlString()
- {
- assertThat('accepts XML string', self::$xml, hasXPath('user'));
- }
- public function testMatchesAcceptsHtmlString()
- {
- assertThat('accepts HTML string', self::$html, hasXPath('body/h1', 'Heading'));
- }
- public function testHasAReadableDescription()
- {
- $this->assertDescription(
- 'XML or HTML document with XPath "/users/user"',
- hasXPath('/users/user')
- );
- $this->assertDescription(
- 'XML or HTML document with XPath "count(/users/user)" <2>',
- hasXPath('/users/user', 2)
- );
- $this->assertDescription(
- 'XML or HTML document with XPath "/users/user/name"'
- . ' a string starting with "Alice"',
- hasXPath('/users/user/name', startsWith('Alice'))
- );
- }
- public function testHasAReadableMismatchDescription()
- {
- $this->assertMismatchDescription(
- 'XPath returned no results',
- hasXPath('/users/name'),
- self::$doc
- );
- $this->assertMismatchDescription(
- 'XPath expression result was <3F>',
- hasXPath('/users/user', 2),
- self::$doc
- );
- $this->assertMismatchDescription(
- 'XPath returned ["alice", "bob", "charlie"]',
- hasXPath('/users/user/id', 'Frank'),
- self::$doc
- );
- }
- }
|