<?php

class HTMLPurifier_Strategy_MakeWellFormed_InjectorTest extends HTMLPurifier_StrategyHarness
{
    
    function setUp() {
        parent::setUp();
        $this->obj = new HTMLPurifier_Strategy_MakeWellFormed();
        $this->config->set('AutoFormat', 'AutoParagraph', true);
        $this->config->set('AutoFormat', 'Linkify', true);
        $this->config->set('AutoFormat', 'RemoveEmpty', true);
        generate_mock_once('HTMLPurifier_Injector');
    }
    
    function testEndNotification() {
        $mock = new HTMLPurifier_InjectorMock();
        $mock->skip = false;
        $b = new HTMLPurifier_Token_End('b');
        $b->start = new HTMLPurifier_Token_Start('b');
        $mock->expectAt(0, 'notifyEnd', array($b));
        $i = new HTMLPurifier_Token_End('i');
        $i->start = new HTMLPurifier_Token_Start('i');
        $mock->expectAt(1, 'notifyEnd', array($i));
        $mock->expectCallCount('notifyEnd', 2);
        $this->config->set('AutoFormat', 'AutoParagraph', false);
        $this->config->set('AutoFormat', 'Linkify',       false);
        $this->config->set('AutoFormat', 'Custom', array($mock));
        $this->assertResult('<i><b>asdf</b>', '<i><b>asdf</b></i>');
    }
    
    function testErrorRequiredElementNotAllowed() {
        $this->config->set('HTML', 'Allowed', '');
        $this->expectError('Cannot enable AutoParagraph injector because p is not allowed');
        $this->expectError('Cannot enable Linkify injector because a is not allowed');
        $this->assertResult('Foobar');
    }
    
    function testErrorRequiredAttributeNotAllowed() {
        $this->config->set('HTML', 'Allowed', 'a,p');
        $this->expectError('Cannot enable Linkify injector because a.href is not allowed');
        $this->assertResult('<p>http://example.com</p>');
    }
    
    function testOnlyAutoParagraph() {
        $this->assertResult(
            'Foobar',
            '<p>Foobar</p>'
        );
    }
    
    function testParagraphWrappingOnlyLink() {
        $this->assertResult(
            'http://example.com',
            '<p><a href="http://example.com">http://example.com</a></p>'
        );
    }
    
    function testParagraphWrappingNodeContainingLink() {
        $this->assertResult(
            '<b>http://example.com</b>',
            '<p><b><a href="http://example.com">http://example.com</a></b></p>'
        );
    }
    
    function testParagraphWrappingPoorlyFormedNodeContainingLink() {
        $this->assertResult(
            '<b>http://example.com',
            '<p><b><a href="http://example.com">http://example.com</a></b></p>'
        );
    }
    
    function testTwoParagraphsContainingOnlyOneLink() {
        $this->assertResult(
            "http://example.com\n\nhttp://dev.example.com",
            '<p><a href="http://example.com">http://example.com</a></p><p><a href="http://dev.example.com">http://dev.example.com</a></p>'
        );
    }
    
    function testParagraphNextToDivWithLinks() {
        $this->assertResult(
            'http://example.com <div>http://example.com</div>',
            '<p><a href="http://example.com">http://example.com</a> </p><div><a href="http://example.com">http://example.com</a></div>'
        );
    }
    
    function testRealisticLinkInSentence() {
        $this->assertResult(
            'This URL http://example.com is what you need',
            '<p>This URL <a href="http://example.com">http://example.com</a> is what you need</p>'
        );
    }
    
    function testParagraphAfterLinkifiedURL() {
        $this->assertResult(
            "http://google.com\n\n<b>b</b>",
            "<p><a href=\"http://google.com\">http://google.com</a></p><p><b>b</b></p>"
        );
    }
    
    function testEmptyAndParagraph() {
        // This is a fairly degenerate case, but it demonstrates that
        // the two don't error out together, at least.
        $this->assertResult(
            "<p>asdf\n\nasdf<b></b></p>\n\n<p></p><i></i>",
            "<p>asdf</p><p>asdf</p>"
        );
    }
    
    function testRewindAndParagraph() {
        $this->assertResult(
            "bar\n\n<p><i></i>\n\n</p>\n\nfoo",
            "<p>bar</p><p>foo</p>"
        );
    }
    
}