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