--- /dev/null
+#!perl -w
+use strict;
+use BSE::Test;
+use Cwd;
+use Test::More;
+my $start_dir;
+BEGIN {
+ $start_dir = getcwd();
+ my $cgidir = File::Spec->catdir(BSE::Test::base_dir, 'cgi-bin');
+ ok(chdir $cgidir, "switch to CGI directory");
+ push @INC, 'modules';
+}
+use BSE::API qw(bse_init bse_cfg);
+use BSE::Template;
+use BSE::Variables;
+use BSE::Request::Test;
+
+bse_init(".");
+
+my $cfg = bse_cfg();
+
+my $r = BSE::Request::Test->new
+ (
+ params =>
+ {
+ },
+ );
+
+my $t = BSE::Template->templater($cfg);
+my $vars =
+ {
+ bse => BSE::Variables->dyn_variables
+ (
+ request => $r,
+ ),
+ };
+
+template_test(<<'IN', <<'EXPECT', "page_list");
+<:.set items = [ 1 .. 200 ] -:>
+<:.set p = bse.paged(items, { pp: 5 }) -:>
+<:.call "page_list", base:"/", pages: p :>
+IN
+
+<div class="pagelist">
+Page 1 of 40
+<span><<</span>
+<span><</span>
+
+<span>1</span>
+
+<a href="/?p=2&pp=5">2</a>
+
+<a href="/?p=3&pp=5">3</a>
+
+<a href="/?p=4&pp=5">4</a>
+
+<a href="/?p=5&pp=5">5</a>
+
+<a href="/?p=6&pp=5">6</a>
+
+<a href="/?p=7&pp=5">7</a>
+
+<a href="/?p=8&pp=5">8</a>
+
+<a href="/?p=9&pp=5">9</a>
+
+<a href="/?p=10&pp=5">10</a>
+
+<a href="/?p=11&pp=5">11</a>
+
+<a href="/?p=12&pp=5">12</a>
+
+<span>...</span>
+
+<a href="/?p=33&pp=5">33</a>
+
+<a href="/?p=34&pp=5">34</a>
+
+<a href="/?p=35&pp=5">35</a>
+
+<a href="/?p=36&pp=5">36</a>
+
+<a href="/?p=37&pp=5">37</a>
+
+<a href="/?p=38&pp=5">38</a>
+
+<a href="/?p=39&pp=5">39</a>
+
+<a href="/?p=40&pp=5">40</a>
+
+<a href="/?p=2&pp=5">></a>
+<a href="/?p=40&pp=5">>></a>
+</div>
+EXPECT
+
+done_testing();
+
+sub template_test {
+ my ($in, $expect, $note) = @_;
+
+ my $result = $t->replace_template($in, {}, undef, undef, $vars);
+ my $b = Test::More->builder;
+ return $b->is_eq($result, $expect, $note);
+}