# 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; $_} ; 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