#!/usr/bin/perl
use strict;
use warnings;
# BEGIN {$Sort::Key::DEBUG=10};
use Test::More tests => 8;
my $unstable;
BEGIN {
if ($] >= 5.008 ) {
eval "use sort 'stable'";
}
else {
$unstable = 1;
}
}
use Sort::Key::Maker nrs_keysort => sub { length($_), $_ }, qw(num -str);
use Sort::Key::Register length => sub { length $_ }, qw(uint);
use Sort::Key::Maker len_keysort => qw(length);
sub random_str {
my $l=int rand(30);
pack("c*", map { 64+int(32*rand) } 0..$l);
}
my @data=map { random_str } 1..1000;
my @sorted = sort {length($a) <=> length($b) or $b cmp $a } @data;
my @data1 = @data;
is_deeply([nrs_keysort @data], \@sorted, 'nrs');
nrs_keysort_inplace @data;
is_deeply(\@data, \@sorted, 'nrs inplace');
my @sorted1 = @data1[ sort { length $data1[$a] <=> length $data1[$b] or $a <=> $b} 0.. $#data1];
is_deeply([len_keysort {$_} @data1], \@sorted1, "post");
len_keysort_inplace {$_} @data1;
is_deeply(\@data1, \@sorted1, "post inplace");
sub random_pair { [ rand, rand] }
sub random_pair_pair { [random_pair, random_pair] };
my @pps=map {random_pair_pair} 1..10000;
my @ppss = sort { ( $a->[0][0] <=> $b->[0][0] or
$a->[0][1] <=> $b->[0][1] or
$a->[1][0] <=> $b->[1][0] or
$a->[1][1] <=> $b->[1][1] ) } @pps;
# BEGIN {$Sort::Key::DEBUG=10};
use Sort::Key::Register pair => sub { @{$_}[0,1] }, qw(num num);
use Sort::Key::Register pair_pair => sub { @{$_}[0,1] }, qw(pair pair);
use Sort::Key::Maker pp_keysort => sub { $_ }, 'pair_pair';
is_deeply([pp_keysort @pps], \@ppss, 'pps');
pp_keysort_inplace(@pps);
is_deeply(\@pps, \@ppss, 'pps inplace');
use Sort::Key::Multi 'ri_keysort';
my @idata = (1, 4, -5, -6, -2, 1000, 234);
is_deeply([ri_keysort { $_ } @idata], [sort { $b <=> $a } @idata], "ri_keysort");
use Sort::Key::Multi 'uu_keysort';
is_deeply([uu_keysort { ord($_), ord(substr $_, 1) } @data],
[@data[ sort { ord($data[$a]) <=> ord($data[$b]) or
ord(substr $data[$a], 1) <=> ord(substr $data[$b],1) or
$a <=> $b
} 0..$#data ]],
"uu_keysort");