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
|
|
);
|
|
}
|
|
}
|