X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2Fsort.t;h=8828083066c5b9110f683d2aa147fb7c6d809621;hb=0613d57299404732f5bbc0d12e693d4815e8cba8;hp=c132a5c667aa974fde9161ff3ecfeddeecfad724;hpb=be6bd645f6be4d28e5d344c51889c6b67bdf5a74;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/sort.t b/lib/sort.t index c132a5c..8828083 100644 --- a/lib/sort.t +++ b/lib/sort.t @@ -28,7 +28,8 @@ use warnings; use Test::More tests => @TestSizes * 2 # sort() tests * 4 # number of pragmas to test + 1 # extra test for qsort instability - + 3; # tests for sort::current + + 3 # tests for sort::current + + 3; # tests for "defaults" and "no sort" # Generate array of specified size for testing sort. # @@ -58,15 +59,18 @@ sub genarray { sub checkorder { my $aref = shift; my $status = ''; # so far, so good - my $i; + my ($i, $disorder); for ($i = 0; $i < $#$aref; ++$i) { - next if ($aref->[$i] lt $aref->[$i+1]); - $status = (substr($aref->[$i], 0, $RootWidth) eq - substr($aref->[$i+1], 0, $RootWidth)) ? - "Instability" : "Disorder"; - $status .= " at element $i between $aref->[$i] and $aref->[$i+1]"; - last; + # Equality shouldn't happen, but catch it in the contents check + next if ($aref->[$i] le $aref->[$i+1]); + $disorder = (substr($aref->[$i], 0, $RootWidth) eq + substr($aref->[$i+1], 0, $RootWidth)) ? + "Instability" : "Disorder"; + # Keep checking if merely unstable... disorder is much worse. + $status = + "$disorder at element $i between $aref->[$i] and $aref->[$i+1]"; + last unless ($disorder eq "Instability"); } return $status; } @@ -121,6 +125,8 @@ sub main { $status = checkequal(\@sorted, $unsorted); is($status, '', "contents ok for size $ts"); } + # If the following test (#58) fails, see the comments in pp_sort.c + # for Perl_sortsv(). if ($expect_unstable) { ok($unstable_num > 0, 'Instability ok'); } @@ -131,9 +137,8 @@ main(0); # XXX We're using this eval "..." trick to force recompilation, # to ensure that the correct pragma is enabled when main() is run. -# Currently 'use sort' modifies $^H{SORT} at compile-time, but -# pp_sort() fetches its value at run-time : thus the lexical scoping -# of %^H is of no utility. +# Currently 'use sort' modifies $sort::hints at compile-time, but +# pp_sort() fetches its value at run-time. # The order of those evals is important. eval q{ @@ -156,3 +161,23 @@ eval q{ main(0); }; die $@ if $@; + +# Tests added to check "defaults" subpragma, and "no sort" + +eval q{ + no sort qw(_qsort); + is(sort::current(), 'stable', 'sort::current after no _qsort'); +}; +die $@ if $@; + +eval q{ + use sort qw(defaults _qsort); + is(sort::current(), 'quicksort', 'sort::current after defaults _qsort'); +}; +die $@ if $@; + +eval q{ + use sort qw(defaults stable); + is(sort::current(), 'stable', 'sort::current after defaults stable'); +}; +die $@ if $@;