The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;

use Test::More tests => 22;
use Test::Exception;

BEGIN { 
    use_ok('Date::Formatter')
}

# run the date formatter through a ringer

like(Date::Formatter->now()->createDateFormatter("(hh):(mm):(ss) (MM)/(DD)/(YYYY)"), 
	qr/^\d{1,2}:\d\d:\d\d \d{1,2}\/\d{1,2}\/\d\d\d\d$/,
	'... formatter matches output');

like(Date::Formatter->now()->createDateFormatter("(hh):(mm) (D), (M) (DD), (YYYY)"), 
	qr/^\d{1,2}:\d\d \w+, \w+ \d{1,2}, \d\d\d\d$/,
	'... formatter matches output');

like(Date::Formatter->now()->createDateFormatter("(hh):(mm) (DD)-(MM)-(YY)"), 
	qr/^\d{1,2}:\d\d \d{1,2}-\d{1,2}-\d\d$/,
	'... formatter matches output');

like(Date::Formatter->now()->createDateFormatter("(MM)/(DD)/(YYYY) (hh):(mm):(ss)"), 
	qr/^\d{1,2}\/\d{1,2}\/\d\d\d\d \d{1,2}:\d\d:\d\d$/,
	'... formatter matches output');

like(Date::Formatter->now()->createDateFormatter("(MM).(DD).(YYYY) (hh):(mm):(ss) (T) (O)"), 
	qr/^\d{1,2}\.\d{1,2}\.\d\d\d\d \d{1,2}:\d\d:\d\d (a|p)\.m\. \-?\d\d\d\d$/,
	'... formatter matches output');

like(Date::Formatter->now()->createDateFormatter("(D) (M)  (DD) (hh):(mm):(ss) (YYYY)"), 
	qr/^\w+ \w+  \d{1,2} \d{1,2}:\d\d:\d\d \d\d\d\d$/,
	'... formatter matches output');
	
# test sharing of date formatters between object	
# does not being the object environment across that sharing
	
my $date = Date::Formatter->now();
isa_ok($date, "Date::Formatter");

$date->createDateFormatter("(hh):(mm):(ss) (MM)/(DD)/(YYYY)");

can_ok($date, 'getDateFormatter');
my $formatter = $date->getDateFormatter();
is(ref($formatter), 'CODE', '... this is a code reference');

my $other_date = Date::Formatter->createTimeInterval(days => 2, hours => 30, minutes => 10);
isa_ok($other_date, "Date::Formatter");

can_ok($other_date, 'setDateFormatter'); 
$other_date->setDateFormatter($formatter);

like("$date", qr/^\d{1,2}:\d\d:\d\d \d{1,2}\/\d{1,2}\/\d\d\d\d$/, '... formatter matches expected output');
like("$other_date", qr/^\d{1,2}:\d\d:\d\d \d{1,2}\/\d{1,2}\/\d\d\d\d$/, '... formatter (from other object) matches expected output');
	
isnt("$date", "$other_date", '... the formats match, but the dates dont');
	
# test using other delimiters for formatters

my $date2 = Date::Formatter->now();
$date2->useShortNames();

like($date2->createDateFormatter('{D} {M}  {DD} {hh}:{mm}:{ss} {YYYY}', qr/{|}/), 
	qr/^\w{3} \w{3}  \d{1,2} \d{1,2}:\d\d:\d\d \d\d\d\d$/,
	'... formatter (with other delimiters) matches output w/ short names');
	
$date2->useLongNames();
$date2->useShortMonthNames();

like($date2->createDateFormatter('{D} {M}  {DD} {hh}:{mm}:{ss} {YYYY}', qr/{|}/), 
	qr/^\w{3,} \w{3}  \d{1,2} \d{1,2}:\d\d:\d\d \d\d\d\d$/,
	'... formatter (with other delimiters) matches output w/ short month names');		

$date2->useLongMonthNames();
$date2->useShortDayNames();	
	
like($date2->createDateFormatter('{D} {M}  {DD} {hh}:{mm}:{ss} {YYYY}', qr/{|}/), 
	qr/^\w{3} \w{3,}  \d{1,2} \d{1,2}:\d\d:\d\d \d\d\d\d$/,
	'... formatter (with other delimiters) matches output w/ short day names');	

$date2->useLongDayNames();	
	
like($date2->createDateFormatter('{D} {M}  {DD} {hh}:{mm}:{ss} {YYYY}', qr/{|}/), 
	qr/^\w{3,} \w{3,}  \d{1,2} \d{1,2}:\d\d:\d\d \d\d\d\d$/,
	'... formatter (with other delimiters) matches output w/ long names');										

	
# test some execptions	
throws_ok {
	$date->setDateFormatter()
} qr/^Insufficient Arguments/, '... this throws an exception';
	
throws_ok {
	$date->setDateFormatter("Fail")
} qr/^Insufficient Arguments/, '... this throws an exception';	
	
throws_ok {
	$date->setDateFormatter([])
} qr/^Insufficient Arguments/, '... this throws an exception';