ikiwiki/t/map.t

243 lines
4.2 KiB
Perl
Executable File

#!/usr/bin/perl
package IkiWiki;
use warnings;
use strict;
use Test::More;
BEGIN {
unless (eval { require XML::Twig }) {
eval q{
use Test::More skip_all => "XML::Twig is not available"
}
}
}
BEGIN { use_ok("IkiWiki"); }
BEGIN { use_ok("IkiWiki::Render"); }
BEGIN { use_ok("IkiWiki::Plugin::map"); }
BEGIN { use_ok("IkiWiki::Plugin::mdwn"); }
ok(! system("rm -rf t/tmp; mkdir t/tmp"));
$config{verbose} = 1;
$config{srcdir} = 't/tmp';
$config{underlaydir} = 't/tmp';
$config{underlaydirbase} = '.';
$config{templatedir} = 'templates';
$config{usedirs} = 1;
$config{htmlext} = 'html';
$config{wiki_file_chars} = "-[:alnum:]+/.:_";
$config{userdir} = "users";
$config{tagbase} = "tags";
$config{default_pageext} = "mdwn";
$config{wiki_file_prune_regexps} = [qr/^\./];
$config{autoindex_commit} = 0;
is(checkconfig(), 1);
%oldrenderedfiles=%pagectime=();
%pagesources=%pagemtime=%oldlinks=%links=%depends=%typedlinks=%oldtypedlinks=
%destsources=%renderedfiles=%pagecase=%pagestate=();
my @pages = qw(
alpha
alpha/1
alpha/1/i
alpha/1/ii
alpha/1/iii
alpha/1/iv
alpha/2
alpha/2/a
alpha/2/b
alpha/3
beta
);
foreach my $page (@pages) {
# we use a non-default extension for these, so they're distinguishable
# from programmatically-created pages
$pagesources{$page} = "$page.mdwn";
$destsources{$page} = "$page.mdwn";
$pagemtime{$page} = $pagectime{$page} = 1000000;
writefile("$page.mdwn", "t/tmp", "your ad here");
}
sub comment {
my $str = shift;
$str =~ s/^/# /gm;
print $str;
}
sub node {
my $name = shift;
my $kids = shift;
my %stuff = @_;
return { %stuff, name => $name, kids => $kids };
}
sub check_nodes {
my $ul = shift;
my $expected = shift;
is($ul->tag, 'ul');
# expected is a list of hashes
# ul is a list of li
foreach my $li ($ul->children) {
my @kids = $li->children;
is($li->tag, 'li');
my $expectation = shift @$expected;
is($kids[0]->tag, 'a');
my $a = $kids[0];
if ($expectation->{parent}) {
is($a->att('class'), 'mapparent');
}
else {
is($a->att('class'), 'mapitem');
}
is_deeply([$a->text], [$expectation->{name}]);
if (@{$expectation->{kids}}) {
is(scalar @kids, 2);
check_nodes($kids[1], $expectation->{kids});
}
else {
is_deeply([@kids], [$a]);
}
}
}
sub check {
my $pagespec = shift;
my $expected = shift;
comment("*** $pagespec ***\n");
my $html = IkiWiki::Plugin::map::preprocess(pages => $pagespec,
page => 'map',
destpage => 'map');
comment($html);
my $tree = XML::Twig->new(pretty_print => 'indented');
eval {
$tree->parse($html);
};
if ($@) {
print "malformed XML: $@\n$html\n";
ok(0);
}
my $fragment = $tree->root;
is($fragment->tag, 'div');
is($fragment->att('class'), 'map');
if (@$expected) {
check_nodes(($fragment->children)[0], $expected);
}
else {
ok(! $fragment->children);
}
$tree->dispose;
}
check('doesnotexist', []);
check('alpha', [node('alpha', [])]);
check('alpha/*',
[
node('1', [
node('i', []),
node('ii', []),
node('iii', []),
node('iv', []),
]),
node('2', [
node('a', []),
node('b', []),
]),
node('3', []),
]);
check('alpha or alpha/*',
[
node('alpha', [
node('1', [
node('i', []),
node('ii', []),
node('iii', []),
node('iv', []),
]),
node('2', [
node('a', []),
node('b', []),
]),
node('3', []),
]),
]);
check('alpha or alpha/1 or beta',
[
node('alpha', [
node('1', []),
]),
node('beta', []),
]);
check('alpha/1 or beta',
[
node('alpha', [
node('1', []),
], parent => 1),
node('beta', []),
]);
check('alpha/1/i* or alpha/2/a or beta',
[
node('alpha', [
node('1', [
node('i', []),
node('ii', []),
node('iii', []),
node('iv', []),
], parent => 1),
node('2', [
node('a', []),
], parent => 1),
], parent => 1),
node('beta', []),
]);
check('alpha/1/i* or alpha/2/a',
[
node('1', [
node('i', []),
node('ii', []),
node('iii', []),
node('iv', []),
], parent => 1),
node('2', [
node('a', []),
], parent => 1),
]);
check('alpha/1/i*',
[
node('i', []),
node('ii', []),
node('iii', []),
node('iv', []),
]);
ok(! system("rm -rf t/tmp"));
done_testing;
1;