You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
198 lines
5.0 KiB
198 lines
5.0 KiB
<?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 |
|
); |
|
} |
|
}
|
|
|