use common::sense;

use Set::CrossProduct;
use FindBin qw($Bin);
use HTML::TreeBuilder::XPath;
use Path::Class;
use Test::More;

use_ok(q(HTML::Linear));
my $n = 1;

my $iterator = Set::CrossProduct->new([
    [qw[test.html cpan.html perl.html]],
    [qw[set_strict unset_strict]],
    [qw[set_shrink unset_shrink]],
]);

for my $tuple ($iterator->combinations) {
    my $file = q...file($Bin, shift @{$tuple});

    #next if $tuple->[0] eq q(unset_strict);
    diag($file);

    my $xpath = HTML::TreeBuilder::XPath->new;
    isa_ok($xpath, q(HTML::TreeBuilder::XPath));
    can_ok($xpath, qw(parse_file findvalue));
    ok($xpath->parse_file($file), q(HTML::TreeBuilder::XPath::parse_file));
    $n += 3;

    my $hl = HTML::Linear->new;
    for my $opt (@{$tuple}) {
        diag($opt . q(()));
        $hl->$opt();
    }

    ok($hl->parse_file($file), q(HTML::Linear::parse_file));
    ++$n;

    my %hash;
    for my $el ($hl->as_list) {
        my $hash = $el->as_hash;
        for (keys %{$hash}) {
            if (m{/text\(\)$}sx) {
                $hash{$_} .= $hash->{$_};
            } else {
                $hash{$_} = $hash->{$_};
            }
        }
    }

    for my $expr (keys %hash) {
        my $content = $hash{$expr};
        $content =~ s/^\s+|\s+$//gsx;
        $content =~ s/\s+/ /gsx;

        my $value = $xpath->findvalue($expr);
        $value =~ s/^\s+|\s+$//gsx;
        $value =~ s/\s+/ /gsx;

        ok(
            $value eq $content,
            qq(\n$expr\n"$value"\n"$content"),
        );

        ++$n;
    }
}

done_testing($n);
