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

use Test::More  tests => 121;
use Labyrinth::DTUtils;
use Labyrinth::Variables;
use Data::Dumper;
use DateTime;

my $YEAR0 = DateTime->now->year;
my $YEAR1 = $YEAR0 + 1;
my $YEAR2 = $YEAR1 + 1;
my $YEAR3 = $YEAR2 + 1;
my $YEAR4 = $YEAR3 + 1;

my %select = (
    'day1' => '<select id="day" name="day"><option value="1">1</option><option value="2">2</option><option value="3">3</option><option value="4">4</option><option value="5">5</option><option value="6">6</option><option value="7">7</option><option value="8">8</option><option value="9">9</option><option value="10">10</option><option value="11">11</option><option value="12">12</option><option value="13">13</option><option value="14">14</option><option value="15">15</option><option value="16">16</option><option value="17">17</option><option value="18">18</option><option value="19">19</option><option value="20">20</option><option value="21">21</option><option value="22">22</option><option value="23">23</option><option value="24">24</option><option value="25">25</option><option value="26">26</option><option value="27">27</option><option value="28">28</option><option value="29">29</option><option value="30">30</option><option value="31">31</option></select>',
    'day2' => '<select id="day" name="day"><option value="1">1</option><option value="2">2</option><option value="3">3</option><option value="4">4</option><option value="5" selected="selected">5</option><option value="6">6</option><option value="7">7</option><option value="8">8</option><option value="9">9</option><option value="10">10</option><option value="11">11</option><option value="12">12</option><option value="13">13</option><option value="14">14</option><option value="15">15</option><option value="16">16</option><option value="17">17</option><option value="18">18</option><option value="19">19</option><option value="20">20</option><option value="21">21</option><option value="22">22</option><option value="23">23</option><option value="24">24</option><option value="25">25</option><option value="26">26</option><option value="27">27</option><option value="28">28</option><option value="29">29</option><option value="30">30</option><option value="31">31</option></select>',
    'day3' => '<select id="day" name="day"><option value="0">Select Day</option><option value="1">1</option><option value="2">2</option><option value="3">3</option><option value="4">4</option><option value="5" selected="selected">5</option><option value="6">6</option><option value="7">7</option><option value="8">8</option><option value="9">9</option><option value="10">10</option><option value="11">11</option><option value="12">12</option><option value="13">13</option><option value="14">14</option><option value="15">15</option><option value="16">16</option><option value="17">17</option><option value="18">18</option><option value="19">19</option><option value="20">20</option><option value="21">21</option><option value="22">22</option><option value="23">23</option><option value="24">24</option><option value="25">25</option><option value="26">26</option><option value="27">27</option><option value="28">28</option><option value="29">29</option><option value="30">30</option><option value="31">31</option></select>',

    'month1' => '<select id="month" name="month"><option value="1">January</option><option value="2">February</option><option value="3">March</option><option value="4">April</option><option value="5">May</option><option value="6">June</option><option value="7">July</option><option value="8">August</option><option value="9">September</option><option value="10">October</option><option value="11">November</option><option value="12">December</option></select>',
    'month2' => '<select id="month" name="month"><option value="1">January</option><option value="2">February</option><option value="3">March</option><option value="4">April</option><option value="5" selected="selected">May</option><option value="6">June</option><option value="7">July</option><option value="8">August</option><option value="9">September</option><option value="10">October</option><option value="11">November</option><option value="12">December</option></select>',
    'month3' => '<select id="month" name="month"><option value="0">Select Month</option><option value="1">January</option><option value="2">February</option><option value="3">March</option><option value="4">April</option><option value="5" selected="selected">May</option><option value="6">June</option><option value="7">July</option><option value="8">August</option><option value="9">September</option><option value="10">October</option><option value="11">November</option><option value="12">December</option></select>',

    'year1' => qq'<select id="year" name="year"><option value="$YEAR0">$YEAR0</option><option value="$YEAR1">$YEAR1</option><option value="$YEAR2">$YEAR2</option><option value="$YEAR3">$YEAR3</option><option value="$YEAR4">$YEAR4</option></select>',
    'year3' => qq'<select id="year" name="year"><option value="$YEAR0">$YEAR0</option></select>',
    'year4' => qq'<select id="year" name="year"><option value="$YEAR0">$YEAR0</option><option value="$YEAR1">$YEAR1</option><option value="$YEAR2">$YEAR2</option><option value="$YEAR3">$YEAR3</option><option value="$YEAR4">$YEAR4</option></select>',
    'year5' => qq'<select id="year" name="year"><option value="$YEAR0">$YEAR0</option><option value="$YEAR1" selected="selected">$YEAR1</option><option value="$YEAR2">$YEAR2</option><option value="$YEAR3">$YEAR3</option><option value="$YEAR4">$YEAR4</option></select>',
    'year6' => qq'<select id="year" name="year"><option value="0">Select Year</option><option value="$YEAR0">$YEAR0</option><option value="$YEAR1" selected="selected">$YEAR1</option><option value="$YEAR2">$YEAR2</option><option value="$YEAR3">$YEAR3</option><option value="$YEAR4">$YEAR4</option></select>',
    'year7' => '<select id="year" name="year"><option value="0">Select Year</option><option value="2014">2014</option><option value="2015" selected="selected">2015</option><option value="2016">2016</option><option value="2017">2017</option><option value="2018">2018</option></select>',

    'period1' => '<select id="period" name="period"><option value="evnt-month">Month</option><option value="evnt-week">Week</option><option value="evnt-day">Day</option></select>',
    'period2' => '<select id="period" name="period"><option value="evnt-month">Month</option><option value="evnt-week">Week</option><option value="evnt-day">Day</option></select>',
    'period3' => '<select id="period" name="period"><option value="">Select Period</option><option value="evnt-month">Month</option><option value="evnt-week">Week</option><option value="evnt-day">Day</option></select>',
);

is(DaySelect(),   $select{day1},'DaySelect no options');
is(DaySelect(5),  $select{day2},'DaySelect with options');
is(DaySelect(5,1),$select{day3},'DaySelect with options and blank');

is(MonthSelect(),   $select{month1},'MonthSelect no options');
is(MonthSelect(5),  $select{month2},'MonthSelect with options');
is(MonthSelect(5,1),$select{month3},'MonthSelect with options and blank');

is(YearSelect(),        $select{year1},'YearSelect no options');
is(YearSelect(undef,2), $select{year3},'YearSelect range 2');
is(YearSelect(undef,3), $select{year4},'YearSelect range 3');
is(YearSelect($YEAR1,3),  $select{year5},'YearSelect with options, range 3');
is(YearSelect($YEAR1,3,1),$select{year6},'YearSelect with options, range 3 and blank');
is(YearSelect(2015,1,1,[2014,2015,2016,2017,2018]), $select{year7},'YearSelect with options, blank and date list');
    
is(PeriodSelect(),   $select{period1},'PeriodSelect no options');
is(PeriodSelect(5),  $select{period2},'PeriodSelect with options');
is(PeriodSelect(5,1),$select{period3},'PeriodSelect with options and blank');

like(formatDate(),qr/\d+/);
like(formatDate(0),qr/\d+/);
like(unformatDate(),qr/\d+/);
like(unformatDate(0),qr/\d+/);

# 1442110800 translates to Sun 13 Sep 2015 03:20:00 BST / Sun, 13 Sep 2015 02:20:00 GMT
my $TIME0 = 1442110800;

$settings{timezone} = '+0000';  # UTC
$settings{timezone} = '+0100';  # BST

my %formats = (
    1  => [ '2015',                                 1420066800 ],
    2  => [ 'September 2015',                       1441062000 ],
    3  => [ '13/09/2015',                           1442098800 ],
    4  => [ 'Sun Sep 13 3:20:00 2015',              $TIME0 ],
    5  => [ 'Sunday, 13 September 2015',            1442098800 ],
    6  => [ 'Sunday, 13th September 2015',          1442098800 ],
    7  => [ 'Sunday, 13 September 2015 (3:20am)',   $TIME0 ],
    8  => [ 'Sunday, 13th September 2015 (3:20am)', $TIME0 ],
    9  => [ '2015/09/13',                           1442098800 ],
    10 => [ '13th September 2015',                  1442098800 ],
    11 => [ '20150913T032000',                      $TIME0 ],
    12 => [ '2015-09-13T03:20:00Z',                 $TIME0 ],
    13 => [ '20150913',                             1442098800 ],
    14 => [ 'Sun, 13th September 2015',             1442098800 ],
    15 => [ '13 Sep 2015',                          1442098800 ],
    16 => [ 'Sun, 13 Sep 2015 03:20:00 +0100',      $TIME0 ],
    17 => [ 'Sunday, 13 September 2015 03:20:00',   $TIME0 ],
    18 => [ '13/09/2015 03:20:00',                  $TIME0 ],
    19 => [ '13th September 2015',                  1442098800 ],
    20 => [ 'Sun, 13 Sep 2015 03:20:00',            $TIME0 ],
    21 => [ '2015-09-13 03:20:00',                  $TIME0 ],
    22 => [ '201509130320',                         $TIME0 ],
);

for my $format (keys %formats) {
    is(formatDate($format,$TIME0),$formats{$format}[0],".. format $format => $formats{$format}[0]");
}

$settings{timezone} = '+0100';  # BST

for my $format (keys %formats) {
    #diag("format=$format");
    is(unformatDate($format,$formats{$format}[0]),$formats{$format}[1],".. unformat $format => $formats{$format}[0]");
}

my %days = (
    1   => 'st',
    2   => 'nd',
    3   => 'rd',
    4   => 'th',
    5   => 'th',
    6   => 'th',
    7   => 'th',
    8   => 'th',
    9   => 'th',
    10  => 'th',
    11  => 'th',
    12  => 'th',
    13  => 'th',
    14  => 'th',
    15  => 'th',
    16  => 'th',
    17  => 'th',
    18  => 'th',
    19  => 'th',
    20  => 'th',
    21  => 'st',
    22  => 'nd',
    23  => 'rd',
    24  => 'th',
    25  => 'th',
    26  => 'th',
    27  => 'th',
    28  => 'th',
    29  => 'th',
    30  => 'th',
    31  => 'st',
);

for my $day (keys %days) {
    is(Labyrinth::DTUtils::_ext($day),$days{$day});
}

my @months = (
    { 'id' =>  1,   'value' => "January",   },
    { 'id' =>  2,   'value' => "February",  },
    { 'id' =>  3,   'value' => "March",     },
    { 'id' =>  4,   'value' => "April",     },
    { 'id' =>  5,   'value' => "May",       },
    { 'id' =>  6,   'value' => "June",      },
    { 'id' =>  7,   'value' => "July",      },
    { 'id' =>  8,   'value' => "August",    },
    { 'id' =>  9,   'value' => "September", },
    { 'id' => 10,   'value' => "October",   },
    { 'id' => 11,   'value' => "November",  },
    { 'id' => 12,   'value' => "December"   },
);

for my $month (@months) {
    is(isMonth($month->{id}),$month->{value});
    is(isMonth($month->{value}),$month->{id});
}

is(isMonth('blah'),0);
is(isMonth(13),0);
like(isMonth(),qr/\d+/);