# t/004_croak.t - make sure we croak when we should

use Test::More tests => 30;
use DateTime::Format::Strptime;

# 1..2
my $return;
eval { $return = DateTime::Format::Strptime->new(pattern => '%Y') };
isa_ok($return, 'DateTime::Format::Strptime','Legal Pattern in constructor should return object and not croak');
is($@, '', "Croak message should be empty");

# 3..4
eval { DateTime::Format::Strptime->new(pattern => '%Y %Q') };
isnt($@, undef, "Illegal pattern in constructor should croak");
is(substr($@,0,42), "Unidentified token in pattern: %Q in %Y %Q", "Croak message should reflect illegal pattern");



#--------------------------------------------------------------------------------


#diag("\nTurned Croak Off");

my $object = DateTime::Format::Strptime->new(
	pattern => '%Y %D',
	time_zone => 'Australia/Melbourne',
	locale => 'en_AU',
	on_error => 'undef',
	diagnostic => 0,
);

# 5..6
is($object->pattern('%Y %D'), '%Y %D','Legal Pattern in pattern() should return the pattern');
is($object->{errmsg} , undef, "Error message should be undef");

# 7..8
is($object->pattern("%Q") , undef, "Illegal Pattern should return undef");
is($object->{errmsg} , 'Unidentified token in pattern: %Q in %Q. Leaving old pattern intact.', "Error message should reflect illegal pattern");

# 9..10
is($object->pattern("%{gumtree}") , undef, "Non-existing DateTime call should return undef");
is($object->{errmsg} , 'Unidentified token in pattern: %{gumtree} in %{gumtree}. Leaving old pattern intact.', "Error message should reflect illegal pattern");

# Make sure pattern goes back to being useful
$object->pattern('%Y %D'); 

# 11..12
is($object->parse_datetime("Not a datetime") , undef, "Non-matching date time string should return undef");
is($object->{errmsg} , 'Your datetime does not match your pattern.', "Error message should reflect non-matching datetime");

# 13..14
is($object->parse_datetime("2002 11/30/03") , undef, "Ambiguous date time string should return undef");
is($object->{errmsg} , 'Your two year values (03 and 2002) do not match.', "Error message should reflect Ambiguous date time string");



#--------------------------------------------------------------------------------


#diag("\nTurned Croak On");
$object = DateTime::Format::Strptime->new(
	pattern => '%Y %D',
	time_zone => 'Australia/Melbourne',
	locale => 'en_AU',
	on_error => 'croak',
	diagnostic => 0,
);

{   # Make warn die so $@ is set. There's probably a better way.
	local $SIG{__WARN__} = sub { die "WARN: $_[0]" };
	eval { $object->pattern("%Q") };
}
# 15..16
isnt($@ , '', "Illegal Pattern should carp");
is(substr($@,0,74), 'WARN: Unidentified token in pattern: %Q in %Q. Leaving old pattern intact.', "Croak message should reflect illegal pattern");

# 17..18
eval { $object->parse_datetime("Not a datetime") };
isnt($@ , '', "Non-matching date time string should croak");
is(substr($@,0,42), "Your datetime does not match your pattern.", "Croak message should reflect non-matching datetime");

# 19..20
eval { $object->parse_datetime("2002 11/30/03") };
isnt($@ , '', "Ambiguous date time string should croak");
is(substr($@,0,48), "Your two year values (03 and 2002) do not match.", "Croak message should reflect Ambiguous date time string");



#--------------------------------------------------------------------------------


#diag("\nTurned Croak to Sub");
$object = DateTime::Format::Strptime->new(
	pattern => '%Y %D',
	time_zone => 'Australia/Melbourne',
	locale => 'en_AU',
	on_error => sub{$_[0]->{errmsg} = 'Oops! Teehee! '.$_[1]; 1},
	diagnostic => 0,
);


# 21..22
is($object->pattern('%Y %D'), '%Y %D','Legal Pattern in pattern() should return the pattern');
is($object->{errmsg} , undef, "Error message should be undef");

# 23..24
is($object->pattern("%Q") , undef, "Illegal Pattern should return undef");
is($object->{errmsg} , 'Oops! Teehee! Unidentified token in pattern: %Q in %Q. Leaving old pattern intact.', "Error message should reflect illegal pattern");

# 25..26
is($object->pattern("%{gumtree}") , undef, "Non-existing DateTime call should return undef");
is($object->{errmsg} , 'Oops! Teehee! Unidentified token in pattern: %{gumtree} in %{gumtree}. Leaving old pattern intact.', "Error message should reflect illegal pattern");

# Make sure pattern goes back to being useful
$object->pattern('%Y %D'); 

# 27..28
is($object->parse_datetime("Not a datetime") , undef, "Non-matching date time string should return undef");
is($object->{errmsg} , 'Oops! Teehee! Your datetime does not match your pattern.', "Error message should reflect non-matching datetime");

# 29..30
is($object->parse_datetime("2002 11/30/03") , undef, "Ambiguous date time string should return undef");
is($object->{errmsg} , 'Oops! Teehee! Your two year values (03 and 2002) do not match.', "Error message should reflect Ambiguous date time string");
