<?php

namespace SilverStripe\Dev\Tests;

use SilverStripe\Dev\CSSContentParser;
use SilverStripe\Dev\SapphireTest;

class CSSContentParserTest extends SapphireTest
{
    public function testSelector2xpath()
    {
        $parser = new CSSContentParser("<html><head><title>test</title></head><body><p>test</p></body></html>");

        $this->assertEquals("//div[@id='UserProfile']//label", $parser->selector2xpath("div#UserProfile label"));
        $this->assertEquals("//div", $parser->selector2xpath("div"));
        $this->assertEquals("//div[contains(@class,'test')]", $parser->selector2xpath("div.test"));
        $this->assertEquals(
            "//*[@id='UserProfile']//div[contains(@class,'test')]//*[contains(@class,'other')]//div[@id='Item']",
            $parser->selector2xpath("#UserProfile div.test .other div#Item")
        );
    }

    public function testGetBySelector()
    {
        $parser = new CSSContentParser(
            <<<HTML
<html>
	<head>
		<title>test</title>
	</head>
	<body>
		<div id="A" class="one two three">
			<p class="other">result</p>
		</div>
		<p>test</p>
	</body>
</html>
HTML
        );

        $result = $parser->getBySelector('div.one');
        $this->assertEquals("A", $result[0]['id'] . '');
        $result = $parser->getBySelector('div.two');
        $this->assertEquals("A", $result[0]['id'] . '');
        $result = $parser->getBySelector('div.three');
        $this->assertEquals("A", $result[0]['id'] . '');

        $result = $parser->getBySelector('div#A p.other');
        $this->assertEquals("result", $result[0] . '');
        $result = $parser->getBySelector('#A .other');
        $this->assertEquals("result", $result[0] . '');
    }

    public function testXmlEntitiesDisabled()
    {
        // CSSContentParser uses simplexml to parse html
        // Ensure XML entities are not substituted in to prevent XXE attacks
        $xml = '<!DOCTYPE html [<!ENTITY myentity "World">]><html><div>Hello &myentity;</div></html>';
        $parser = new CSSContentParser($xml);
        $div = $parser->getBySelector('div')[0]->asXML();
        $this->assertEquals('<div>Hello &amp;myentity;</div>', $div);
    }
}