The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use Test::More tests => 14;

require_ok('HTML::Laundry');
my $tidy_libxml_available;

{
    local $@;
    eval {
        require HTML::Tidy::libXML;
        $tidy_libxml_available = 1;
    };
}

SKIP: {
    skip 'HTML::Tidy::libXML unavailable; skipping tests', 13 unless ( $tidy_libxml_available );
    {
        local $@;
        eval {
            no warnings 'redefine';
            no warnings 'once';
            require HTML::Tidy;
            *HTML::Tidy::new = sub { return 0; };
        };
    }
    my $l = HTML::Laundry->new();
    is( $l->{tidy_engine}, q{HTML::Tidy::libXML},
        'Laundry uses HTML::Tidy::libXML as tidying engine if HTML::Tidy is unavailable'
        );
    my $plaintext = 'She was the youngest of the two daughters of a most affectionate, indulgent father...';
    is( $l->clean($plaintext), $plaintext, 'Short plain text passes through cleanly');
    $plaintext = q{She had been a friend and companion such as few possessed: intelligent, well-informed, useful, gentle, knowing all the ways of the family, interested in all its concerns, and peculiarly interested in herself, in every pleasure, every scheme of hers--one to whom she could speak every thought as it arose, and who had such an affection for her as could never find fault.};
    is( $l->clean($plaintext), $plaintext, 'Longer plain text passes through cleanly');
    my $kurosawa = q[Akira Kurosawa (Kyūjitai: 黒澤 明, Shinjitai: 黒沢 明 Kurosawa Akira, 23 March 1910 – 6 September 1998) was a legendary Japanese filmmaker, producer, screenwriter and editor];
    is( $l->clean($kurosawa), $kurosawa, 'UTF-8 text passes through cleanly');
    my $valid = q{<p>} . $plaintext . q{</p>};
    is( $l->clean($valid), $valid, 'Validating HTML passes through cleanly');
    is( $l->clean('<p></p>'), '<p/>', 'libXML collapses no-content paragraph tags to empty element');
    is( $l->clean('<br />'), '<br/>', 'Empty tag passes through cleanly');
    is( $l->clean('<br /   >'), '<br/>', 'Empty tag with whitespace passes through cleanly');
    is( $l->clean('<br></br>'), '<br/>', 'Empty tag passed in as non-empty is normalized to empty format');
    is( $l->clean('<br class="foo" />'), '<br class="foo"/>', 'Empty tag attribute is preserved');
    is( $l->clean('<p class="foo"></p>'), '<p class="foo"/>', 'Non-empty tag attribute is preserved');
    # Actual tidying begins
    is( $l->clean('<em><strong>Important!'), '<em><strong>Important!</strong></em>', 'Unclosed tags are closed');
    is( $l->clean('<p><strong>Important!</p></strong>'), '<p><strong>Important!</strong></p>', 'Transposed close tags are fixed');
}