added testsuite for the pedigree plugin
authorintrigeri <intrigeri@boum.org>
Mon, 14 Jul 2008 18:56:51 +0000 (20:56 +0200)
committerintrigeri <intrigeri@boum.org>
Mon, 14 Jul 2008 21:03:27 +0000 (23:03 +0200)
Signed-off-by: intrigeri <intrigeri@boum.org>
t/pedigree.t [new file with mode: 0755]
t/pedigree/templates/pedigree.tmpl [new file with mode: 0644]

diff --git a/t/pedigree.t b/t/pedigree.t
new file mode 100755 (executable)
index 0000000..aa78cbe
--- /dev/null
@@ -0,0 +1,156 @@
+#!/usr/bin/perl
+# -*- cperl-indent-level: 8; -*-
+# Testcases for the Ikiwiki pedigree plugin.
+
+use warnings;
+use strict;
+use Test::More 'no_plan';
+
+my %expected;
+
+BEGIN { use_ok("IkiWiki"); }
+
+# Init
+%config=IkiWiki::defaultconfig();
+$config{srcdir}=$config{destdir}="/dev/null";
+$config{underlaydir}="underlays/basewiki";
+$config{templatedir}="t/pedigree/templates";
+IkiWiki::loadplugins();
+IkiWiki::checkconfig();
+ok(IkiWiki::loadplugin("pedigree"), "pedigree plugin loaded");
+
+# Test data
+$expected{'pedigree'} =
+  {
+   "" => [],
+   "ikiwiki" => [],
+   "ikiwiki/pagespec" => [
+                         {absdepth => 0,
+                          distance => 2,
+                          is_root => 1,
+                          is_second_ancestor => '',
+                          is_grand_mother => 1,
+                          is_mother => '',
+                         },
+                         {absdepth => 1,
+                          distance => 1,
+                          is_root => '',
+                          is_second_ancestor => 1,
+                          is_grand_mother => '',
+                          is_mother => 1,
+                         },
+                        ],
+   "ikiwiki/pagespec/attachment" => [
+                                    {absdepth => 0,
+                                     distance => 3,
+                                     is_root => 1,
+                                     is_second_ancestor => '',
+                                     is_grand_mother => '',
+                                     is_mother => '',
+                                    },
+                                    {absdepth => 1,
+                                     distance => 2,
+                                     is_root => '',
+                                     is_second_ancestor => 1,
+                                     is_grand_mother => 1,
+                                     is_mother => '',
+                                    },
+                                    {absdepth => 2,
+                                     distance => 1,
+                                     is_root => '',
+                                     is_second_ancestor => '',
+                                     is_grand_mother => '',
+                                     is_mother => 1,
+                                    },
+                                   ],
+  };
+
+$expected{'pedigree_but_root'} =
+  {
+   "" => [],
+   "ikiwiki" => [],
+   "ikiwiki/pagespec" => [],
+   "ikiwiki/pagespec/attachment" => [],
+  };
+
+$expected{'pedigree_but_two_oldest'} =
+  {
+   "" => [],
+   "ikiwiki" => [],
+   "ikiwiki/pagespec" => [],
+   "ikiwiki/pagespec/attachment" => [],
+  };
+
+# Test function
+sub test_loop($$) {
+       my $loop=shift;
+       my $expected=shift;
+       my $template;
+       my %params;
+       my $offset;
+
+       if ($loop eq 'pedigree') {
+               $offset=0;
+       } elsif ($loop eq 'pedigree_but_root') {
+               $offset=1;
+       } elsif ($loop eq 'pedigree_but_two_oldest') {
+               $offset=2;
+       }
+
+       ok($template=template('pedigree.tmpl'), "template created");
+       ok($params{template}=$template, "params populated");
+
+       while ((my $page, my $exp) = each %{$expected}) {
+               my @path=(split("/", $page));
+               my $pagedepth=@path;
+               my $expdepth;
+               if (($pagedepth - $offset) >= 0) {
+                       $expdepth=$pagedepth - $offset;
+               } else {
+                       $expdepth=0;
+               }
+               my $msgprefix="$page $loop";
+
+               # manually run the plugin hook
+               $params{page}=$page;
+               $template->clear_params();
+               IkiWiki::Plugin::pedigree::pagetemplate(%params);
+               my $res=$template->param($loop);
+
+               is(scalar(@$res), $expdepth, "$msgprefix: path length");
+               # logic & arithmetic validation tests
+               for (my $i=0; $i<$expdepth; $i++) {
+                       my $r=$res->[$i];
+                       is($r->{distance}, $pagedepth - $r->{absdepth},
+                          "$msgprefix\[$i\]: distance = pagedepth - absdepth");
+                       ok($r->{absdepth} ge 0, "$msgprefix\[$i\]: absdepth>=0");
+                       ok($r->{distance} ge 0, "$msgprefix\[$i\]: distance>=0");
+                       unless ($loop eq 'pedigree') {
+                               ok($r->{reldepth} ge 0, "$msgprefix\[$i\]: reldepth>=0");
+                             TODO: {
+                                       local $TODO = "Known bug" if 
+                                         (($loop eq 'pedigree_but_root')
+                                          && ($i >= $offset));
+                                       is($r->{reldepth} + $offset, $r->{absdepth},
+                                          "$msgprefix\[$i\]: reldepth+offset=absdepth");
+                               }
+                       }
+               }
+               # comparison tests, iff the test-suite has been written
+               if (scalar(@$exp) eq $expdepth) {
+                       for (my $i=0; $i<$expdepth; $i++) {
+                               my $e=$exp->[$i];
+                               my $r=$res->[$i];
+                               map { is($r->{$_}, $e->{$_}, "$msgprefix\[$i\]: $_"); } keys %$e;
+                       }
+               }
+               # else {
+               #       diag("Testsuite is incomplete for ($page,$loop); cannot run comparison tests.");
+               # }
+       }
+}
+
+# Main
+map {
+       test_loop($_, $expected{$_});
+} ('pedigree', 'pedigree_but_root', 'pedigree_but_two_oldest');
diff --git a/t/pedigree/templates/pedigree.tmpl b/t/pedigree/templates/pedigree.tmpl
new file mode 100644 (file)
index 0000000..3590244
--- /dev/null
@@ -0,0 +1,10 @@
+<!-- This template file only has to "use" the loops tested by pedigree.t -->
+
+<TMPL_LOOP NAME="PEDIGREE">
+</TMPL_LOOP>
+
+<TMPL_LOOP NAME="PEDIGREE_BUT_ROOT">
+</TMPL_LOOP>
+
+<TMPL_LOOP NAME="PEDIGREE_BUT_TWO_OLDEST">
+</TMPL_LOOP>