1###########################################
2# Tests for Log4perl::DateFormat
3# Mike Schilli, 2002 (m@perlmeister.com)
4###########################################
5
6BEGIN { 
7    if($ENV{INTERNAL_DEBUG}) {
8        require Log::Log4perl::InternalDebug;
9        Log::Log4perl::InternalDebug->enable();
10    }
11}
12
13use warnings;
14use strict;
15
16use Test::More;
17
18BEGIN { plan tests => 36 }
19
20use Log::Log4perl qw(get_logger);
21use Log::Log4perl::DateFormat;
22use Log::Log4perl::Appender::TestBuffer;
23
24$Log::Log4perl::DateFormat::GMTIME = 1;
25
26my $GMTIME = 1030429942 - 7*3600;
27
28###########################################
29# Year
30###########################################
31my $formatter = Log::Log4perl::DateFormat->new("yyyy yy yyyy");
32is($formatter->format($GMTIME), "2002 02 2002");
33
34###########################################
35# Month
36###########################################
37$formatter = Log::Log4perl::DateFormat->new("MM M MMMM yyyy");
38is($formatter->format($GMTIME), "08 8 August 2002");
39
40###########################################
41# Month
42###########################################
43$formatter = Log::Log4perl::DateFormat->new("MMM yyyy");
44is($formatter->format($GMTIME), "Aug 2002");
45
46###########################################
47# Day-of-Month
48###########################################
49$formatter = Log::Log4perl::DateFormat->new("d ddd dd dddd yyyy");
50is($formatter->format($GMTIME), "26 026 26 0026 2002");
51
52###########################################
53# am/pm Hour
54###########################################
55$formatter = Log::Log4perl::DateFormat->new("h hh hhh hhhh");
56is($formatter->format($GMTIME), "11 11 011 0011");
57
58###########################################
59# 24 Hour
60###########################################
61$formatter = Log::Log4perl::DateFormat->new("H HH HHH HHHH");
62is($formatter->format($GMTIME), "23 23 023 0023");
63
64###########################################
65# Minute
66###########################################
67$formatter = Log::Log4perl::DateFormat->new("m mm mmm mmmm");
68is($formatter->format($GMTIME), "32 32 032 0032");
69
70###########################################
71# Second
72###########################################
73$formatter = Log::Log4perl::DateFormat->new("s ss sss ssss");
74is($formatter->format($GMTIME), "22 22 022 0022");
75
76###########################################
77# Day of Week
78###########################################
79$formatter = Log::Log4perl::DateFormat->new("E EE EEE EEEE");
80is($formatter->format($GMTIME), "Mon Mon Mon Monday");
81is($formatter->format($GMTIME+24*60*60*1), "Tue Tue Tue Tuesday");
82is($formatter->format($GMTIME+24*60*60*2), "Wed Wed Wed Wednesday");
83is($formatter->format($GMTIME+24*60*60*3), "Thu Thu Thu Thursday");
84is($formatter->format($GMTIME+24*60*60*4), "Fri Fri Fri Friday");
85is($formatter->format($GMTIME+24*60*60*5), "Sat Sat Sat Saturday");
86is($formatter->format($GMTIME+24*60*60*6), "Sun Sun Sun Sunday");
87
88###########################################
89# Day of Year
90###########################################
91$formatter = Log::Log4perl::DateFormat->new("D DD DDD DDDD");
92is($formatter->format($GMTIME), "238 238 238 0238");
93
94###########################################
95# AM/PM
96###########################################
97$formatter = Log::Log4perl::DateFormat->new("a aa");
98is($formatter->format($GMTIME), "PM PM");
99
100###########################################
101# Milliseconds
102###########################################
103$formatter = Log::Log4perl::DateFormat->new("S SS SSS SSSS SSSSS SSSSSS");
104is($formatter->format($GMTIME, 123456), "1 12 123 1234 12345 123456");
105
106###########################################
107# Predefined formats
108###########################################
109$formatter = Log::Log4perl::DateFormat->new("DATE");
110is($formatter->format($GMTIME, 123456), "26 Aug 2002 23:32:22,123");
111
112$formatter = Log::Log4perl::DateFormat->new("ISO8601");
113is($formatter->format($GMTIME, 123456), "2002-08-26 23:32:22,123");
114
115$formatter = Log::Log4perl::DateFormat->new("ABSOLUTE");
116is($formatter->format($GMTIME, 123456), "23:32:22,123");
117
118$formatter = Log::Log4perl::DateFormat->new("APACHE");
119is($formatter->format($GMTIME, 123456), "[Mon Aug 26 23:32:22 2002]");
120
121###########################################
122# Unknown
123###########################################
124$formatter = Log::Log4perl::DateFormat->new("xx K");
125is($formatter->format($GMTIME), "xx -- 'K' not (yet) implemented --");
126
127###########################################
128# DDD bugfix
129###########################################
130$formatter = Log::Log4perl::DateFormat->new("DDD");
131   # 1/1/2006
132is($formatter->format(1136106000), "001");
133$formatter = Log::Log4perl::DateFormat->new("D");
134   # 1/1/2006
135is($formatter->format(1136106000), "1");
136
137###########################################
138# In conjunction with Log4perl
139###########################################
140my $conf = q(
141log4perl.category.Bar.Twix      = WARN, Buffer
142log4perl.appender.Buffer        = Log::Log4perl::Appender::TestBuffer
143log4perl.appender.Buffer.layout = \
144    Log::Log4perl::Layout::PatternLayout
145log4perl.appender.Buffer.layout.ConversionPattern = %d{HH:mm:ss} %p %m %n
146);
147
148Log::Log4perl::init(\$conf);
149
150my $logger = get_logger("Bar::Twix");
151$logger->error("Blah");
152
153like(Log::Log4perl::Appender::TestBuffer->by_name("Buffer")->buffer(), 
154     qr/\d\d:\d\d:\d\d ERROR Blah/);
155
156###########################################
157# Allowing literal text in L4p >= 1.19
158###########################################
159my @tests = ( 
160    q!yyyy-MM-dd'T'HH:mm:ss.SSS'Z'! => q!%04d-%02d-%02dT%02d:%02d:%02d.%sZ!,
161    q!yyyy-MM-dd''HH:mm:ss.SSS''!   => q!%04d-%02d-%02d%02d:%02d:%02d.%s!,
162    q!yyyy-MM-dd''''HH:mm:ss.SSS!   => q!%04d-%02d-%02d'%02d:%02d:%02d.%s!,
163    q!yyyy-MM-dd''''''HH:mm:ss.SSS! => q!%04d-%02d-%02d''%02d:%02d:%02d.%s!,
164    q!yyyy-MM-dd,HH:mm:ss.SSS!      => q!%04d-%02d-%02d,%02d:%02d:%02d.%s!,
165    q!HH:mm:ss,SSS!                 => q!%02d:%02d:%02d,%s!,
166    q!dd MMM yyyy HH:mm:ss,SSS!     => q!%02d %.3s %04d %02d:%02d:%02d,%s!,
167    q!hh 'o''clock' a!              => q!%02d o'clock %1s!,
168    q!hh 'o'clock' a!               => q!(undef)!,
169    q!yyyy-MM-dd 'at' HH:mm:ss!     => q!%04d-%02d-%02d at %02d:%02d:%02d!,
170);
171
172#' calm down up vim syntax highlighting
173
174while ( my ( $src, $expected ) = splice @tests, 0, 2 ) {
175    my $df = eval { Log::Log4perl::DateFormat->new( $src ) };
176    my $err = '';
177    if ( $@ )
178    {
179        chomp $@;
180        $err = "(error: $@)";
181    }
182    my $got = $df->{fmt} || '(undef)';
183    is($got, $expected, "literal $src");
184}
185