1#============================================================= -*-perl-*- 2# 3# t/iterator.t 4# 5# Template script testing Template::Iterator and 6# Template::Plugin::Iterator. 7# 8# Written by Andy Wardley <abw@kfs.org> 9# 10# Copyright (C) 1996-2000 Andy Wardley. All Rights Reserved. 11# Copyright (C) 1998-2000 Canon Research Centre Europe Ltd. 12# 13# This is free software; you can redistribute it and/or modify it 14# under the same terms as Perl itself. 15# 16# $Id$ 17# 18#======================================================================== 19 20use strict; 21use lib qw( ./lib ../lib ); 22use Template::Test; 23use Template::Iterator; 24$^W = 1; 25 26#$Template::Parser::DEBUG = 0; 27#$Template::Test::DEBUG = 0; 28 29my $data = [ qw( foo bar baz qux wiz woz waz ) ]; 30my $vars = { 31 data => $data, 32# iterator => Template::Iterator->new($data), 33}; 34 35my $i1 = Template::Iterator->new($data); 36ok( $i1->get_first() eq 'foo' ); 37ok( $i1->get_next() eq 'bar' ); 38ok( $i1->get_next() eq 'baz' ); 39 40my $rest = $i1->get_all(); 41ok( scalar @$rest == 4 ); 42ok( $rest->[0] eq 'qux' ); 43ok( $rest->[3] eq 'waz' ); 44 45my ($val, $err) = $i1->get_next(); 46ok( ! $val ); 47ok( $err == Template::Constants::STATUS_DONE ); 48 49($val, $err) = $i1->get_all(); 50ok( ! $val ); 51ok( $err == Template::Constants::STATUS_DONE ); 52 53($val, $err) = $i1->get_first(); 54ok( $i1->get_first() eq 'foo' ); 55ok( $i1->get_next() eq 'bar' ); 56$rest = $i1->get_all(); 57ok( scalar @$rest == 5 ); 58 59# get_all with a few values in the iterator 60my $i2 = Template::Iterator->new($data); 61($rest, $err) = $i2->get_all(); 62is( scalar @$rest, 7 ); 63ok( ! $err); 64($val, $err) = $i2->get_all(); 65ok( ! $val); 66is( $err, Template::Constants::STATUS_DONE ); 67 68# get_all with a single value. 69my $i3 = Template::Iterator->new(['foo']); 70($rest, $err) = $i3->get_all(); 71is( scalar @$rest, 1 ); 72is( pop @$rest, 'foo' ); 73ok( ! $err); 74($val, $err) = $i3->get_all(); 75ok( ! $val); 76is( $err, Template::Constants::STATUS_DONE ); 77 78# get_all with an empty array 79my $i4 = Template::Iterator->new([]); 80($val, $err) = $i4->get_all(); 81ok( ! $val); 82is( $err, Template::Constants::STATUS_DONE ); 83 84test_expect(\*DATA, { POST_CHOMP => 1 }, $vars); 85 86__DATA__ 87 88-- test -- 89[% items = [ 'foo' 'bar' 'baz' 'qux' ] %] 90[% FOREACH i = items %] 91 * [% i +%] 92[% END %] 93-- expect -- 94 * foo 95 * bar 96 * baz 97 * qux 98 99-- test -- 100[% items = [ 'foo' 'bar' 'baz' 'qux' ] %] 101[% FOREACH i = items %] 102 #[% loop.index %]/[% loop.max %] [% i +%] 103[% END %] 104-- expect -- 105 #0/3 foo 106 #1/3 bar 107 #2/3 baz 108 #3/3 qux 109 110-- test -- 111[% items = [ 'foo' 'bar' 'baz' 'qux' ] %] 112[% FOREACH i = items %] 113 #[% loop.count %]/[% loop.size %] [% i +%] 114[% END %] 115-- expect -- 116 #1/4 foo 117 #2/4 bar 118 #3/4 baz 119 #4/4 qux 120 121-- test -- 122# test that 'number' is supported as an alias to 'count', for backwards 123# compatability 124[% items = [ 'foo' 'bar' 'baz' 'qux' ] %] 125[% FOREACH i = items %] 126 #[% loop.number %]/[% loop.size %] [% i +%] 127[% END %] 128-- expect -- 129 #1/4 foo 130 #2/4 bar 131 #3/4 baz 132 #4/4 qux 133 134-- test -- 135[% USE iterator(data) %] 136[% FOREACH i = iterator %] 137[% IF iterator.first %] 138List of items: 139[% END %] 140 * [% i +%] 141[% IF iterator.last %] 142End of list 143[% END %] 144[% END %] 145-- expect -- 146List of items: 147 * foo 148 * bar 149 * baz 150 * qux 151 * wiz 152 * woz 153 * waz 154End of list 155 156 157-- test -- 158[% FOREACH i = [ 'foo' 'bar' 'baz' 'qux' ] %] 159[% "$loop.prev<-" IF loop.prev -%][[% i -%]][% "->$loop.next" IF loop.next +%] 160[% END %] 161-- expect -- 162[foo]->bar 163foo<-[bar]->baz 164bar<-[baz]->qux 165baz<-[qux] 166 167-- test -- 168-- name test even/odd/parity -- 169[% FOREACH item IN [1..10] -%] 170* [% loop.count %] [% loop.odd %] [% loop.even %] [% loop.parity +%] 171[% END -%] 172-- expect -- 173* 1 1 0 odd 174* 2 0 1 even 175* 3 1 0 odd 176* 4 0 1 even 177* 5 1 0 odd 178* 6 0 1 even 179* 7 1 0 odd 180* 8 0 1 even 181* 9 1 0 odd 182* 10 0 1 even 183