#!/usr/bin/perl -w
use strict;
use Test::More;
plan tests => 14;
use DateTime;
use DateTime::Set;
#======================================================================
# TIME ZONE TESTS
#======================================================================
my $t1 = new DateTime( year => '2001', month => '11', day => '22' );
my $t2 = new DateTime( year => '2002', month => '11', day => '22' );
my $s1 = DateTime::Set->from_datetimes( dates => [ $t1, $t2 ] );
my $s2 = $s1->set_time_zone( 'Asia/Taipei' );
is( $s2->min->datetime, '2001-11-22T00:00:00',
'got 2001-11-22T00:00:00 - min' );
is( $s2->min->time_zone->name, 'Asia/Taipei',
'got time zone name from set' );
my $span1 = DateTime::Span->from_datetimes( start => $t1, end => $t2 );
$span1->set_time_zone( 'America/Sao_Paulo' );
my $span2 = $span1->clone;
$span1->set_time_zone( 'Asia/Taipei' );
is( $span1->start->datetime, '2001-11-22T10:00:00',
'got 2001-11-22T10:00:00 - min' );
is( $span1->end->datetime, '2002-11-22T10:00:00',
'got 2002-11-22T10:00:00 - max' );
# check for immutability
is( $span2->start->datetime, '2001-11-22T00:00:00',
'got 2001-11-22T00:00:00 - min' );
is( $span2->end->datetime, '2002-11-22T00:00:00',
'got 2002-11-22T00:00:00 - max' );
# recurrence
{
my $months = DateTime::Set->from_recurrence(
recurrence => sub {
my $tz = $_[0]->time_zone;
$_[0]->set_time_zone( 'floating' );
$_[0]->truncate( to => 'month' )->add( months => 1 );
$_[0]->set_time_zone( $tz );
$_[0];
}
)
->set_time_zone( 'Asia/Taipei' );
my $str = $months->next( $t1 )->datetime . ' ' .
$months->next( $t1 )->time_zone_long_name;
my $original = $t1->datetime . ' ' .
$t1->time_zone_long_name;
is( $str, '2001-12-01T00:00:00 Asia/Taipei', 'recurrence with time zone' );
is( $original, '2001-11-22T00:00:00 floating', 'does not mutate arg' );
{
my $str;
my $dt_floating = new DateTime(
year => 2001, month => 11, day => 1
);
my $dt_with_tz = $dt_floating->clone->set_time_zone( 'America/Sao_Paulo' );
my $set_floating = DateTime::Set->from_recurrence(
recurrence => sub {
my $tz = $_[0]->time_zone;
$_[0]->set_time_zone( 'floating' );
$_[0]->truncate( to => 'month' )->add( months => 1 );
$_[0]->set_time_zone( $tz );
$_[0];
}
);
my $set_with_tz = $set_floating->clone->set_time_zone( 'Asia/Taipei' );
# tests with the "next" method
# floating set => floating dt
is( $set_floating->next( $dt_floating )->
strftime( "%FT%H:%M:%S %{time_zone_long_name}"),
'2001-12-01T00:00:00 floating',
'recurrence without time zone, arg without time zone' );
# tz set => floating dt
is( $set_with_tz->next( $dt_floating )->
strftime( "%FT%H:%M:%S %{time_zone_long_name}"),
'2001-12-01T00:00:00 Asia/Taipei',
'recurrence with time zone, arg without time zone' );
# floating set => tz dt
is( $set_floating->next( $dt_with_tz )->
strftime( "%FT%H:%M:%S %{time_zone_long_name}"),
'2001-12-01T00:00:00 America/Sao_Paulo',
'recurrence with time zone, arg without time zone' );
# TODO: {
# local $TODO = "Time zone settings do not backtrack";
# bug reported by Tim Mueller-Seydlitz
# tz set => tz dt
is( $set_with_tz->next( $dt_with_tz )->
strftime( "%FT%H:%M:%S %{time_zone_long_name}"),
# = '2001-12-01T00:00:00 Asia/Taipei',
'2001-11-30T14:00:00 America/Sao_Paulo',
'recurrence with time zone, arg with time zone' );
# }
# TODO: limit set_floating with a start=>dt_floating;
# ask for next( dt_with_tz_before_start )
# and next( dt_with_another_tz_before_start )
# and next( dt_floating_before_start )
# and check for caching problems
}
# set locale, add duration
is ( $months->clone->add( days => 1 )->
next( $t1 )->
strftime( "%a" ), 'Sun',
'default locale' );
is ( $months->clone->add( days => 1 )->
set( locale => 'en_US' )->
next( $t1 )->
strftime( "%a" ),
'Sun',
'new locale' );
}
1;