| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 | <?phpnamespace 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        );    }}
 |