The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# testing sort on dates


use strict;
use warnings;
use Test::More tests => 6 ;

BEGIN {use_ok("Hash::Type");}

my ($headerline, @datalines) =  map {chomp; $_} <DATA>;
my $ht = new Hash::Type(split /\t/, $headerline);
isa_ok($ht, 'Hash::Type');
my @vals;
push @vals, new $ht(split /\t/) foreach @datalines;

my $cmp = $ht->cmp("d1:d.m.y, line:num");
my @v1 = map {"$_->{txt} ($_->{line})"} sort $cmp @vals;
ok(eq_array(\@v1, [
          'jan 3d, 1999 (8)',
          'jan 2nd, 2000 (7)',
          'dec 31st, 2000 (5)',
          'jan 1st, 2001 (1)',
          'jan 1st, 2001 (2)',
          'jan 2nd, 2001 (6)',
          'feb 1st, 2001 (3)',
          'feb 2nd, 2001 (4)'
        ]), "sort d1:d.m.y, line:num");


$cmp = $ht->cmp("d1 : -d.m.y, line : -num");
@v1 = map {"$_->{txt} ($_->{line})"} sort $cmp @vals;
ok(eq_array(\@v1, [
          'feb 2nd, 2001 (4)',
          'feb 1st, 2001 (3)',
          'jan 2nd, 2001 (6)',
          'jan 1st, 2001 (2)',
          'jan 1st, 2001 (1)',
          'dec 31st, 2000 (5)',
          'jan 2nd, 2000 (7)',
          'jan 3d, 1999 (8)'
        ]), "sort d1 : -d.m.y, line : -num");

$cmp = $ht->cmp("d2: y-m-d, line: -num");
@v1 = map {"$_->{txt} ($_->{line})"} sort $cmp @vals;
ok(eq_array(\@v1, [
          'jan 3d, 1999 (8)',
          'jan 2nd, 2000 (7)',
          'dec 31st, 2000 (5)',
          'jan 1st, 2001 (2)',
          'jan 1st, 2001 (1)',
          'jan 2nd, 2001 (6)',
          'feb 1st, 2001 (3)',
          'feb 2nd, 2001 (4)'
        ]), "sort d2: y-m-d, line: -num");

$cmp = $ht->cmp("d3: m/d/y, line: -num");
@v1 = map {"$_->{txt} ($_->{line})"} sort $cmp @vals;
ok(eq_array(\@v1, [
          'jan 3d, 1999 (8)',
          'jan 2nd, 2000 (7)',
          'dec 31st, 2000 (5)',
          'jan 1st, 2001 (2)',
          'jan 1st, 2001 (1)',
          'jan 2nd, 2001 (6)',
          'feb 1st, 2001 (3)',
          'feb 2nd, 2001 (4)'
        ]), "sort d3: m/d/y, line: -num");

__DATA__
line	d1	d2	d3	txt
1	1.1.1	2001-1-1	1/1/1	jan 1st, 2001
2	01.01.0001	1-1-1	1/1/2001	jan 1st, 2001
3	1.2.1	1-2-1	2/1/2001	feb 1st, 2001
4	2.2.1	1-2-2	2/2/1	feb 2nd, 2001
5	31.12.2000	0-12-31	12/31/00	dec 31st, 2000
6	2.1.1	1-1-2	1/2/01	jan 2nd, 2001
7	2.1.0	0-2-1	1/2/2000	jan 2nd, 2000
8	3.1.99	1999-1-3	1/3/99	jan 3d, 1999