<?php

require_once('HTMLPurifier/Config.php');
require_once('HTMLPurifier/StrategyHarness.php');
require_once('HTMLPurifier/Strategy/ValidateAttributes.php');

class HTMLPurifier_Strategy_ValidateAttributesTest extends
      HTMLPurifier_StrategyHarness
{
    
    function setUp() {
        parent::setUp();
        $this->obj = new HTMLPurifier_Strategy_ValidateAttributes();
    }
    
    function test() {
        
        // attribute order is VERY fragile, perhaps we should define
        // an ordering scheme!
        
        $this->assertResult('');
        
        // test ids
        $this->assertResult(
            '<div id="valid">Kill the ID.</div>',
            '<div>Kill the ID.</div>'
        );
            
        $this->assertResult('<div id="valid">Preserve the ID.</div>', true,
            array('HTML.EnableAttrID' => true));
        
        $this->assertResult(
            '<div id="0invalid">Kill the ID.</div>',
            '<div>Kill the ID.</div>',
            array('HTML.EnableAttrID' => true)
        );
        
        // test id accumulator
        $this->assertResult(
            '<div id="valid">Valid</div><div id="valid">Invalid</div>',
            '<div id="valid">Valid</div><div>Invalid</div>',
            array('HTML.EnableAttrID' => true)
        );
        
        $this->assertResult(
            '<span dir="up-to-down">Bad dir.</span>',
            '<span>Bad dir.</span>'
        );
        
        // test attribute key case sensitivity
        $this->assertResult(
            '<div ID="valid">Convert ID to lowercase.</div>',
            '<div id="valid">Convert ID to lowercase.</div>',
            array('HTML.EnableAttrID' => true)
        );
        
        // test simple attribute substitution
        $this->assertResult(
            '<div id=" valid ">Trim whitespace.</div>',
            '<div id="valid">Trim whitespace.</div>',
            array('HTML.EnableAttrID' => true)
        );
        
        // test configuration id blacklist
        $this->assertResult(
            '<div id="invalid">Invalid</div>',
            '<div>Invalid</div>',
            array(
                'Attr.IDBlacklist' => array('invalid'),
                'HTML.EnableAttrID' => true
            )
        );
        
        // test classes
        $this->assertResult('<div class="valid">Valid</div>');
        
        $this->assertResult(
            '<div class="valid 0invalid">Keep valid.</div>',
            '<div class="valid">Keep valid.</div>'
        );
        
        // test title
        $this->assertResult(
            '<acronym title="PHP: Hypertext Preprocessor">PHP</acronym>'
        );
        
        // test lang
        $this->assertResult(
            '<span lang="fr">La soupe.</span>',
            '<span lang="fr" xml:lang="fr">La soupe.</span>'
        );
        
        // test align
        $this->assertResult(
            '<h1 align="center">Centered Headline</h1>',
            '<h1 style="text-align:center;">Centered Headline</h1>'
        );
        
        // test table
        $this->assertResult(
'<table frame="above" rules="rows" summary="A test table" border="2" cellpadding="5%" cellspacing="3" width="100%">
    <col align="right" width="4*" />
    <col charoff="5" align="char" width="1*" />
    <tr valign="top">
        <th abbr="name">Fiddly name</th>
        <th abbr="price">Super-duper-price</th>
    </tr>
    <tr>
        <td abbr="carrot">Carrot Humungous</td>
        <td>$500.23</td>
    </tr>
    <tr>
        <td colspan="2">Taken off the market</td>
    </tr>
</table>'
        );
        
        // test URI
        $this->assertResult('<a href="http://www.google.com/">Google</a>');
        
        // test invalid URI
        $this->assertResult(
            '<a href="javascript:badstuff();">Google</a>',
            '<a>Google</a>'
        );
        
        // test required attributes for img
        $this->assertResult(
            '<img />',
            '<img src="" alt="Invalid image" />'
        );
        
        $this->assertResult(
            '<img src="foobar.jpg" />',
            '<img src="foobar.jpg" alt="foobar.jpg" />'
        );
        
        $this->assertResult(
            '<img alt="pretty picture" />',
            '<img alt="pretty picture" src="" />'
        );
        
        // test required attributes for bdo
        $this->assertResult(
            '<bdo>Go left.</bdo>',
            '<bdo dir="ltr">Go left.</bdo>'
        );
        
        $this->assertResult(
            '<bdo dir="blahblah">Invalid value!</bdo>',
            '<bdo dir="ltr">Invalid value!</bdo>'
        );
        
        // comparison check for test 20
        $this->assertResult(
            '<span dir="blahblah">Invalid value!</span>',
            '<span>Invalid value!</span>'
        );
        
        // test col.span is non-zero
        $this->assertResult(
            '<col span="0" />',
            '<col />'
        );
        
    }
    
}

?>