#!/usr/bin/perl use strict; use warnings; use boolean qw(true); use Test::MockTime qw(set_fixed_time); use DateTime::Format::Natural; use DateTime::Format::Natural::Test ':set'; use Test::More; my $date = join '.', map $time{$_}, qw(day month year); my $time = join ':', map $time{$_}, qw(hour minute second); set_fixed_time( "$date $time", '%d.%m.%Y %H:%M:%S', ); my @simple = ( { 'friday' => '24.11.2006 00:00:00' }, { 'monday' => '27.11.2006 00:00:00' }, { 'thursday morning' => '30.11.2006 08:00:00' }, { 'thursday afternoon' => '30.11.2006 14:00:00' }, { 'thursday evening' => '30.11.2006 20:00:00' }, { 'november' => '01.11.2007 00:00:00' }, { 'january' => '01.01.2007 00:00:00' }, { 'last january' => '01.01.2005 00:00:00' }, { 'next january' => '01.01.2007 00:00:00' }, { 'next friday' => '01.12.2006 00:00:00' }, { 'last friday' => '17.11.2006 00:00:00' }, { '00:30:15' => '25.11.2006 00:30:15' }, { '00:00{sec}' => '25.11.2006 00:00:{sec}' }, { '12{min_sec}{ }am' => '25.11.2006 00:{min_sec}' }, { '12:30{sec}{ }am' => '25.11.2006 00:30:{sec}' }, { '4{min_sec}{ }pm' => '24.11.2006 16:{min_sec}' }, { '4:20{sec}{ }pm' => '24.11.2006 16:20:{sec}' }, { '12:56:06{ }am' => '25.11.2006 00:56:06' }, { '12:56:06{ }pm' => '24.11.2006 12:56:06' }, ); my @combined = ( { '4th february' => '04.02.2007 00:00:00' }, { 'november 3rd' => '03.11.2007 00:00:00' }, { 'sunday {at} 11:00{sec}' => '26.11.2006 11:00:{sec}' }, { 'sunday {at} 11:00{sec}{ }am' => '26.11.2006 11:00:{sec}' }, { 'sunday {at} 11:00{sec}{ }pm' => '26.11.2006 23:00:{sec}' }, { 'monday {at} 8{min_sec}' => '27.11.2006 08:{min_sec}' }, { 'monday {at} 8{min_sec}{ }am' => '27.11.2006 08:{min_sec}' }, { 'tuesday {at} 8{min_sec}{ }pm' => '28.11.2006 20:{min_sec}' }, { 'wednesday {at} 4{min_sec}{ }pm' => '29.11.2006 16:{min_sec}' }, { 'friday {at} 03:00{sec}{ }am' => '24.11.2006 03:00:{sec}' }, { 'friday {at} 03:00{sec}{ }pm' => '24.11.2006 15:00:{sec}' }, { 'monday {at} 03:00{sec}{ }am' => '27.11.2006 03:00:{sec}' }, { 'monday {at} 03:00{sec}{ }pm' => '27.11.2006 15:00:{sec}' }, { '4:00{sec} thu' => '30.11.2006 04:00:{sec}' }, { '4{min_sec}{ }am thu' => '30.11.2006 04:{min_sec}' }, { '4{min_sec}{ }pm thu' => '30.11.2006 16:{min_sec}' }, { '4:00{sec} on thu' => '30.11.2006 04:00:{sec}' }, { '4{min_sec}{ }am on thu' => '30.11.2006 04:{min_sec}' }, { '4{min_sec}{ }pm on thu' => '30.11.2006 16:{min_sec}' }, ); my @formatted = ( { '1/3' => '03.01.2007 00:00:00' }, { '12/24' => '24.12.2006 00:00:00' }, ); _run_tests(164, [ [ \@simple ], [ \@combined ], [ \@formatted ] ], \&compare); sub compare { my $aref = shift; foreach my $href (@$aref) { my $key = (keys %$href)[0]; foreach my $entry ($time_entries->($key, $href->{$key})) { foreach my $string ($case_strings->($entry->[0])) { compare_strings($string, $entry->[1]); } } } } sub compare_strings { my ($string, $result) = @_; my $parser = DateTime::Format::Natural->new(prefer_future => true); my $dt = $parser->parse_datetime($string); if ($parser->success) { is(_result_string($dt), $result, _message($string)); } else { fail(_message($string)); } }