1#!./perl -w 2# t/sortkeys.t - Test Sortkeys() 3 4BEGIN { 5 if ($ENV{PERL_CORE}){ 6 require Config; import Config; 7 no warnings 'once'; 8 if ($Config{'extensions'} !~ /\bData\/Dumper\b/) { 9 print "1..0 # Skip: Data::Dumper was not built\n"; 10 exit 0; 11 } 12 } 13} 14 15use strict; 16 17use Data::Dumper; 18use Test::More tests => 26; 19use lib qw( ./t/lib ); 20use Testing qw( _dumptostr ); 21 22run_tests_for_sortkeys(); 23SKIP: { 24 skip "XS version was unavailable, so we already ran with pure Perl", 13 25 if $Data::Dumper::Useperl; 26 local $Data::Dumper::Useperl = 1; 27 run_tests_for_sortkeys(); 28} 29 30sub run_tests_for_sortkeys { 31 note("\$Data::Dumper::Useperl = $Data::Dumper::Useperl"); 32 33 my %d = ( 34 delta => 'd', 35 beta => 'b', 36 gamma => 'c', 37 alpha => 'a', 38 ); 39 40 { 41 my ($obj, %dumps, $sortkeys, $starting); 42 43 note("\$Data::Dumper::Sortkeys and Sortkeys() set to true value"); 44 45 $starting = $Data::Dumper::Sortkeys; 46 $sortkeys = 1; 47 local $Data::Dumper::Sortkeys = $sortkeys; 48 $obj = Data::Dumper->new( [ \%d ] ); 49 $dumps{'ddskone'} = _dumptostr($obj); 50 local $Data::Dumper::Sortkeys = $starting; 51 52 $obj = Data::Dumper->new( [ \%d ] ); 53 $obj->Sortkeys($sortkeys); 54 $dumps{'objskone'} = _dumptostr($obj); 55 56 is($dumps{'ddskone'}, $dumps{'objskone'}, 57 "\$Data::Dumper::Sortkeys = 1 and Sortkeys(1) are equivalent"); 58 like($dumps{'ddskone'}, 59 qr/alpha.*?beta.*?delta.*?gamma/s, 60 "Sortkeys returned hash keys in Perl's default sort order"); 61 %dumps = (); 62 63 } 64 65 { 66 my ($obj, %dumps, $starting); 67 68 note("\$Data::Dumper::Sortkeys and Sortkeys() set to coderef"); 69 70 $starting = $Data::Dumper::Sortkeys; 71 local $Data::Dumper::Sortkeys = \&reversekeys; 72 $obj = Data::Dumper->new( [ \%d ] ); 73 $dumps{'ddsksub'} = _dumptostr($obj); 74 local $Data::Dumper::Sortkeys = $starting; 75 76 $obj = Data::Dumper->new( [ \%d ] ); 77 $obj->Sortkeys(\&reversekeys); 78 $dumps{'objsksub'} = _dumptostr($obj); 79 80 is($dumps{'ddsksub'}, $dumps{'objsksub'}, 81 "\$Data::Dumper::Sortkeys = CODEREF and Sortkeys(CODEREF) are equivalent"); 82 like($dumps{'ddsksub'}, 83 qr/gamma.*?delta.*?beta.*?alpha/s, 84 "Sortkeys returned hash keys per sorting subroutine"); 85 %dumps = (); 86 87 } 88 89 { 90 my ($obj, %dumps, $starting); 91 92 note("\$Data::Dumper::Sortkeys and Sortkeys() set to coderef with filter"); 93 $starting = $Data::Dumper::Sortkeys; 94 local $Data::Dumper::Sortkeys = \&reversekeystrim; 95 $obj = Data::Dumper->new( [ \%d ] ); 96 $dumps{'ddsksub'} = _dumptostr($obj); 97 local $Data::Dumper::Sortkeys = $starting; 98 99 $obj = Data::Dumper->new( [ \%d ] ); 100 $obj->Sortkeys(\&reversekeystrim); 101 $dumps{'objsksub'} = _dumptostr($obj); 102 103 is($dumps{'ddsksub'}, $dumps{'objsksub'}, 104 "\$Data::Dumper::Sortkeys = CODEREF and Sortkeys(CODEREF) select same keys"); 105 like($dumps{'ddsksub'}, 106 qr/gamma.*?delta.*?beta/s, 107 "Sortkeys returned hash keys per sorting subroutine"); 108 unlike($dumps{'ddsksub'}, 109 qr/alpha/s, 110 "Sortkeys filtered out one key per request"); 111 %dumps = (); 112 113 } 114 115 { 116 my ($obj, %dumps, $sortkeys, $starting); 117 118 note("\$Data::Dumper::Sortkeys(undef) and Sortkeys(undef)"); 119 120 $starting = $Data::Dumper::Sortkeys; 121 $sortkeys = 0; 122 local $Data::Dumper::Sortkeys = $sortkeys; 123 $obj = Data::Dumper->new( [ \%d ] ); 124 $dumps{'ddskzero'} = _dumptostr($obj); 125 local $Data::Dumper::Sortkeys = $starting; 126 127 $obj = Data::Dumper->new( [ \%d ] ); 128 $obj->Sortkeys($sortkeys); 129 $dumps{'objskzero'} = _dumptostr($obj); 130 131 $sortkeys = undef; 132 local $Data::Dumper::Sortkeys = $sortkeys; 133 $obj = Data::Dumper->new( [ \%d ] ); 134 $dumps{'ddskundef'} = _dumptostr($obj); 135 local $Data::Dumper::Sortkeys = $starting; 136 137 $obj = Data::Dumper->new( [ \%d ] ); 138 $obj->Sortkeys($sortkeys); 139 $dumps{'objskundef'} = _dumptostr($obj); 140 141 is($dumps{'ddskzero'}, $dumps{'objskzero'}, 142 "\$Data::Dumper::Sortkeys = 0 and Sortkeys(0) are equivalent"); 143 is($dumps{'ddskzero'}, $dumps{'ddskundef'}, 144 "\$Data::Dumper::Sortkeys = 0 and = undef equivalent"); 145 is($dumps{'objkzero'}, $dumps{'objkundef'}, 146 "Sortkeys(0) and Sortkeys(undef) are equivalent"); 147 %dumps = (); 148 149 } 150 151 note("Internal subroutine _sortkeys"); 152 my %e = ( 153 nu => 'n', 154 lambda => 'l', 155 kappa => 'k', 156 mu => 'm', 157 omicron => 'o', 158 ); 159 my $rv = Data::Dumper::_sortkeys(\%e); 160 is(ref($rv), 'ARRAY', "Data::Dumper::_sortkeys returned an array ref"); 161 is_deeply($rv, [ qw( kappa lambda mu nu omicron ) ], 162 "Got keys in Perl default order"); 163 { 164 my $warning = ''; 165 local $SIG{__WARN__} = sub { $warning = $_[0] }; 166 167 my ($obj, %dumps, $starting); 168 169 note("\$Data::Dumper::Sortkeys and Sortkeys() set to coderef"); 170 171 $starting = $Data::Dumper::Sortkeys; 172 local $Data::Dumper::Sortkeys = \&badreturnvalue; 173 $obj = Data::Dumper->new( [ \%d ] ); 174 $dumps{'ddsksub'} = _dumptostr($obj); 175 like($warning, qr/^Sortkeys subroutine did not return ARRAYREF/, 176 "Got expected warning: sorting routine did not return array ref"); 177 } 178 179} 180 181sub reversekeys { return [ reverse sort keys %{+shift} ]; } 182 183sub reversekeystrim { 184 my $hr = shift; 185 my @keys = sort keys %{$hr}; 186 shift(@keys); 187 return [ reverse @keys ]; 188} 189 190sub badreturnvalue { return { %{+shift} }; } 191