The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#============================================================= -*-perl-*-
#
# t/vmethods/hash.t
#
# Testing hash virtual variable methods.
#
# Written by Andy Wardley <abw@cpan.org>
#
# Copyright (C) 1996-2006 Andy Wardley.  All Rights Reserved.
#
# This is free software; you can redistribute it and/or modify it
# under the same terms as Perl itself.
#
# $Id$
#
#========================================================================

use strict;
use warnings;
use lib qw( ./lib ../lib ../../lib );
use Template::Test;

# make sure we're using the Perl stash
$Template::Config::STASH = 'Template::Stash';

my $params = {
    hash      => { a => 'b', c => 'd' },
    uhash     => { tobe => '2b', nottobe => undef },
};

my $tt = Template->new() || die Template->error();
my $tc = $tt->context();

$tc->define_vmethod(hash  => dump => sub {
    my $hash = shift;
    return '{ ' 
        . join(', ', map { "$_ => '$hash->{$_}'" } sort keys %$hash)
        . ' }';
});

test_expect(\*DATA, undef, $params);

__DATA__

#------------------------------------------------------------------------
# hash virtual methods
#------------------------------------------------------------------------

-- test --
-- name hash keys --
[% hash.keys.sort.join(', ') %]
-- expect --
a, c

-- test --
-- name hash values --
[% hash.values.sort.join(', ') %]
-- expect --
b, d

-- test --
-- name hash each --
[% hash.each.sort.join(', ') %]
-- expect --
a, b, c, d

-- test --
-- name hash items --
[% hash.items.sort.join(', ') %]
-- expect --
a, b, c, d

-- test --
-- name hash size --
[% hash.size %]
-- expect --
2

-- test --
[% hash.defined('a') ? 'good' : 'bad' %]
[% hash.a.defined ? 'good' : 'bad' %]
[% hash.defined('x') ? 'bad' : 'good' %]
[% hash.x.defined ? 'bad' : 'good' %]
[% hash.defined ? 'good def' : 'bad def' %]
[% no_such_hash.defined ? 'bad no def' : 'good no def' %]
-- expect --
good
good
good
good
good def
good no def

-- test --
[% uhash.defined('tobe') ? 'good' : 'bad' %]
[% uhash.tobe.defined ? 'good' : 'bad' %]
[% uhash.exists('tobe') ? 'good' : 'bad' %]
[% uhash.defined('nottobe') ? 'bad' : 'good' %]
[% hash.nottobe.defined ? 'bad' : 'good' %]
[% uhash.exists('nottobe') ? 'good' : 'bad' %]
-- expect --
good
good
good
good
good
good

-- test --
-- name hash.pairs --
[% FOREACH pair IN hash.pairs -%]
* [% pair.key %] => [% pair.value %]
[% END %]
-- expect --
* a => b
* c => d

-- test --
-- name hash.list (old style) --
[% FOREACH pair IN hash.list -%]
* [% pair.key %] => [% pair.value %]
[% END %]
-- expect --
* a => b
* c => d



#------------------------------------------------------------------------
# user defined hash virtual methods
#------------------------------------------------------------------------

-- test --
-- name dump hash --
[% product = {
     id = 'abc-123',
     name = 'ABC Widget #123'
     price = 7.99
   };
   product.dump
%]
-- expect --
{ id => 'abc-123', name => 'ABC Widget #123', price => '7.99' }