#============================================================= -*-perl-*-
#
# t/iterator.t
#
# Template script testing Template::Iterator and 
# Template::Plugin::Iterator.
#
# Written by Andy Wardley <abw@kfs.org>
#
# Copyright (C) 1996-2000 Andy Wardley.  All Rights Reserved.
# Copyright (C) 1998-2000 Canon Research Centre Europe Ltd.
#
# This is free software; you can redistribute it and/or modify it
# under the same terms as Perl itself.
#
# $Id: iterator.t 1217 2009-05-21 07:37:15Z abw $
#
#========================================================================

use strict;
use lib qw( ./lib ../lib );
use Template::Test;
use Template::Iterator;
$^W = 1;

#$Template::Parser::DEBUG = 0;
#$Template::Test::DEBUG = 0;

my $data = [ qw( foo bar baz qux wiz woz waz ) ];
my $vars = {
    data => $data,
#    iterator => Template::Iterator->new($data),
};

my $i1 = Template::Iterator->new($data);
ok( $i1->get_first() eq 'foo' );
ok( $i1->get_next()  eq 'bar' );
ok( $i1->get_next()  eq 'baz' );

my $rest = $i1->get_all();
ok( scalar @$rest == 4 );
ok( $rest->[0] eq 'qux' );
ok( $rest->[3] eq 'waz' );

my ($val, $err) = $i1->get_next();
ok( ! $val );
ok( $err == Template::Constants::STATUS_DONE );

($val, $err) = $i1->get_all();
ok( ! $val );
ok( $err == Template::Constants::STATUS_DONE );

($val, $err) = $i1->get_first();
ok( $i1->get_first() eq 'foo' );
ok( $i1->get_next()  eq 'bar' );
$rest = $i1->get_all();
ok( scalar @$rest == 5 );

# get_all with a few values in the iterator
my $i2 = Template::Iterator->new($data);
($rest, $err) = $i2->get_all();
is( scalar @$rest, 7 );
ok( ! $err);
($val, $err) = $i2->get_all();
ok( ! $val);
is( $err, Template::Constants::STATUS_DONE );

# get_all with a single value.
my $i3 = Template::Iterator->new(['foo']);
($rest, $err) = $i3->get_all();
is( scalar @$rest, 1 );
is( pop @$rest, 'foo' );
ok( ! $err);
($val, $err) = $i3->get_all();
ok( ! $val);
is( $err, Template::Constants::STATUS_DONE );

# get_all with an empty array
my $i4 = Template::Iterator->new([]);
($val, $err) = $i4->get_all();
ok( ! $val);
is( $err, Template::Constants::STATUS_DONE );

test_expect(\*DATA, { POST_CHOMP => 1 }, $vars);

__DATA__

-- test --
[% items = [ 'foo' 'bar' 'baz' 'qux' ] %]
[% FOREACH i = items %]
   * [% i +%]
[% END %]
-- expect --
   * foo
   * bar
   * baz
   * qux

-- test --
[% items = [ 'foo' 'bar' 'baz' 'qux' ] %]
[% FOREACH i = items %]
   #[% loop.index %]/[% loop.max %] [% i +%]
[% END %]
-- expect --
   #0/3 foo
   #1/3 bar
   #2/3 baz
   #3/3 qux

-- test --
[% items = [ 'foo' 'bar' 'baz' 'qux' ] %]
[% FOREACH i = items %]
   #[% loop.count %]/[% loop.size %] [% i +%]
[% END %]
-- expect --
   #1/4 foo
   #2/4 bar
   #3/4 baz
   #4/4 qux

-- test --
# test that 'number' is supported as an alias to 'count', for backwards
# compatability
[% items = [ 'foo' 'bar' 'baz' 'qux' ] %]
[% FOREACH i = items %]
   #[% loop.number %]/[% loop.size %] [% i +%]
[% END %]
-- expect --
   #1/4 foo
   #2/4 bar
   #3/4 baz
   #4/4 qux

-- test --
[% USE iterator(data) %]
[% FOREACH i = iterator %]
[% IF iterator.first %]
List of items:
[% END %]
   * [% i +%]
[% IF iterator.last %]
End of list
[% END %]
[% END %]
-- expect --
List of items:
   * foo
   * bar
   * baz
   * qux
   * wiz
   * woz
   * waz
End of list


-- test --
[% FOREACH i = [ 'foo' 'bar' 'baz' 'qux' ] %]
[% "$loop.prev<-" IF loop.prev -%][[% i -%]][% "->$loop.next" IF loop.next +%]
[% END %]
-- expect --
[foo]->bar
foo<-[bar]->baz
bar<-[baz]->qux
baz<-[qux]

-- test --
-- name test even/odd/parity --
[% FOREACH item IN [1..10] -%]
* [% loop.count %] [% loop.odd %] [% loop.even %] [% loop.parity +%]
[% END -%]
-- expect --
* 1 1 0 odd
* 2 0 1 even
* 3 1 0 odd
* 4 0 1 even
* 5 1 0 odd
* 6 0 1 even
* 7 1 0 odd
* 8 0 1 even
* 9 1 0 odd
* 10 0 1 even
