The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# various sort tests
# test data borrowed from Sort::Field module by Joseph N. Hall

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

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("f1");
my @v1 = map {@{$_}{qw(f1 f2 f3 f4)}} sort $cmp @vals;
ok(eq_array(\@v1, [qw{
  123   asd   1.22   asdd
  123   refs  3.22   asdd
  123   refs  4.32   asdd
  23    erww  4.21   ewet
  32    ewq   2.32   asdd
  43    rewq  2.12   ewet
  51    erwt  34.2   ewet
  91    fdgs  3.43   ewet
}]), "alpha sort on column 1");

$cmp = $ht->cmp("f1:num");
@v1 = map {@{$_}{qw(f1 f2 f3 f4)}} sort $cmp @vals;


ok(eq_array(\@v1, [qw{
  23    erww  4.21   ewet
  32    ewq   2.32   asdd
  43    rewq  2.12   ewet
  51    erwt  34.2   ewet
  91    fdgs  3.43   ewet
  123   asd   1.22   asdd
  123   refs  3.22   asdd
  123   refs  4.32   asdd
}]), "numeric sort on column 1");

$cmp = $ht->cmp("f1:-num");
@v1 = map {@{$_}{qw(f1 f2 f3 f4)}} sort $cmp @vals;

ok(eq_array(\@v1, [qw{
  123   asd   1.22   asdd
  123   refs  3.22   asdd
  123   refs  4.32   asdd
  91    fdgs  3.43   ewet
  51    erwt  34.2   ewet
  43    rewq  2.12   ewet
  32    ewq   2.32   asdd
  23    erww  4.21   ewet
}]), "reverse numeric sort on column 1");


$cmp = $ht->cmp("f2");
@v1 = map {@{$_}{qw(f1 f2 f3 f4)}} sort {
	&{$cmp} || "@{$a}{qw(f1 f2 f3 f4)}" cmp "@{$b}{qw(f1 f2 f3 f4)}" 
} @vals;
ok(eq_array(\@v1, [qw{
  123   asd   1.22   asdd
  51    erwt  34.2   ewet
  23    erww  4.21   ewet
  32    ewq   2.32   asdd
  91    fdgs  3.43   ewet
  123   refs  3.22   asdd
  123   refs  4.32   asdd
  43    rewq  2.12   ewet
}]), "alpha sort on column 2, then alpha on entire line");


$cmp = $ht->cmp("f4, f1 : <=>, f3 : -num");
@v1 = map {@{$_}{qw(f1 f2 f3 f4)}} sort $cmp @vals;
ok(eq_array(\@v1, [qw{
  32    ewq   2.32   asdd
  123   refs  4.32   asdd
  123   refs  3.22   asdd
  123   asd   1.22   asdd
  23    erww  4.21   ewet
  43    rewq  2.12   ewet
  51    erwt  34.2   ewet
  91    fdgs  3.43   ewet
}]), "alpha sort on column 4, then numeric on column 1, then reverse numeric on column 3");


__DATA__
f1	f2	f3	f4
123	asd	1.22	asdd
32	ewq	2.32	asdd
43	rewq	2.12	ewet
51	erwt	34.2	ewet
23	erww	4.21	ewet
91	fdgs	3.43	ewet
123	refs	3.22	asdd
123	refs	4.32	asdd