The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::MockTime qw/set_fixed_time/;
use CGI::Header;
use Test::More tests => 14;
use Test::Warn;

set_fixed_time '1341637509';

my $today    = 'Sat, 07 Jul 2012 05:05:09 GMT';
my $tomorrow = 'Sun, 08 Jul 2012 05:05:09 GMT';

my $header = CGI::Header->new;

%{ $header->header } = ();
ok !exists $header->as_hashref->{Expires};
is $header->as_hashref->{Expires}, undef;
is $header->expires, undef;
#is delete $header{Expires}, undef;
#is_deeply $header->header, {};

%{ $header->header } = ( expires => '+1d' );
ok exists $header->as_hashref->{Expires};
ok exists $header->as_hashref->{Date};
is $header->as_hashref->{Expires}, $tomorrow;
is $header->as_hashref->{Date}, $today;
is $header->expires, '+1d';
#is delete $header{Expires}, $tomorrow;
#is_deeply $header->header, {};

#warning_is { delete $header{Date} } 'The Date header is fixed';
#warning_is { $header{Date} = 'foo' } 'The Date header is fixed';

%{ $header->header } = ( expires => q{} );
ok !exists $header->as_hashref->{Expires};
ok !exists $header->as_hashref->{Date};
is $header->as_hashref->{Expires}, undef;
is $header->as_hashref->{Date}, undef;
is $header->expires, q{};
#is delete $header{Expires}, undef;
#is_deeply $header->header, {};

#%adaptee = ( -expires => 0 );

# Follows the rule of least surprize.
# The following behavior will surprize us ;)
#
#   $header{Expires} = '+3d';
#   my $value = $header{Expires}; # => "Tue, 10 Jul 2012 05:05:09 GMT"
#

#warning_is { $header{Expires} = '+3d' }
#    "Can't assign to '-expires' directly, use expires() instead";

%{ $header->header } = ();
$header->expires( '+3d' );
is_deeply $header->header, { expires => '+3d' };