1#!perl -w
2
3# t/002_basic.t - check module dates in various formats
4
5use Test::More 0.88;
6
7#use Test::More qw/no_plan/;
8use DateTime::Format::Strptime;
9use DateTime;
10
11my @locales = qw/en ga pt de/;
12
13#diag("\nChecking Day Names");
14my $pattern = "%Y-%m-%d %A";
15foreach my $locale (@locales) {
16    foreach my $day ( 1 .. 7 ) {
17        my $dt = DateTime->now( locale => $locale )->set( day => $day );
18        my $input = $dt->strftime($pattern);
19        eval {
20            $strptime = DateTime::Format::Strptime->new(
21                pattern  => $pattern,
22                locale   => $locale,
23                on_error => 'croak',
24            );
25        };
26        ok( $@ eq '', "Constructor with Day Name" );
27
28        my $parsed;
29        eval { $parsed = $strptime->parse_datetime($input); } unless $@;
30        diag("[$@]") if $@ ne '';
31        ok( $@ eq '', "Parsed with Day Name" );
32
33        is( $parsed->strftime($pattern), $input, "Matched with Day Name" );
34    }
35
36    #	diag( $locale );
37}
38
39#diag("\nChecking Month Names");
40$pattern = "%Y-%m-%d %B";
41foreach my $locale (@locales) {
42    foreach my $month ( 1 .. 12 ) {
43        my $dt = DateTime->now( locale => $locale )
44            ->set( month => $month, day => 20 );
45        my $input = $dt->strftime($pattern);
46        eval {
47            $strptime = DateTime::Format::Strptime->new(
48                pattern  => $pattern,
49                locale   => $locale,
50                on_error => 'croak',
51            );
52        };
53        ok( $@ eq '', "Constructor with Month Name" );
54
55        my $parsed;
56        eval { $parsed = $strptime->parse_datetime($input); } unless $@;
57        diag("[$@]") if $@ ne '';
58        ok( $@ eq '', "Parsed with Month Name" );
59
60        is( $parsed->strftime($pattern), $input, "Matched with Month Name" );
61    }
62
63    #	diag( $locale );
64}
65
66#diag("\nChecking AM/PM tokens");
67$pattern = "%Y-%m-%d %H:%M %p";
68foreach my $locale (@locales) {
69    foreach my $hour ( 11, 12 ) {
70        my $dt = DateTime->now( locale => $locale )->set( hour => $hour );
71        my $input = $dt->strftime($pattern);
72        eval {
73            $strptime = DateTime::Format::Strptime->new(
74                pattern  => $pattern,
75                locale   => $locale,
76                on_error => 'croak',
77            );
78        };
79        ok( $@ eq '', "Constructor with Meridian" );
80
81        my $parsed;
82        eval { $parsed = $strptime->parse_datetime($input); } unless $@;
83        diag("[$@]") if $@ ne '';
84        ok( $@ eq '', "Parsed with Meridian" );
85
86        is( $parsed->strftime($pattern), $input, "Matched with Meridian" );
87    }
88
89    #	diag( $locale );
90}
91
92#diag("\nChecking format_datetime honors strptime's locale rather than the dt's");
93{
94
95    # Create a parser that has locale 'fr'
96    my $dmy_format = new DateTime::Format::Strptime(
97        pattern => '%d/%m/%Y',
98        locale  => 'fr'
99    );
100    is( $dmy_format->locale, 'fr' );
101
102    # So, therefore, will a $dt created using it.
103    my $dt = $dmy_format->parse_datetime('03/08/2004');
104    is( $dt->locale->id, 'fr' );
105
106    # Now we create a new strptime for formatting, but in a different locale
107    my $pt_format = new DateTime::Format::Strptime(
108        pattern => '%B/%Y',
109        locale  => 'pt'
110    );
111    is( $pt_format->locale, 'pt' );
112
113    my $string = $pt_format->format_datetime($dt);
114
115    # Make sure the format honored the locale in the strptime
116    is( $string, "agosto/2004" );
117
118    # Make sure the datetime, however, retained its own locale
119    is( $dt->locale->id, 'fr' )
120}
121
122done_testing();
123