1#!./perl 2 3BEGIN { 4 chdir 't' if -d 't'; 5 @INC = '../lib'; 6 require './test.pl'; 7} 8 9plan tests => 54; 10 11$h{'abc'} = 'ABC'; 12$h{'def'} = 'DEF'; 13$h{'jkl','mno'} = "JKL\034MNO"; 14$h{'a',2,3,4,5} = join("\034",'A',2,3,4,5); 15$h{'a'} = 'A'; 16$h{'b'} = 'B'; 17$h{'c'} = 'C'; 18$h{'d'} = 'D'; 19$h{'e'} = 'E'; 20$h{'f'} = 'F'; 21$h{'g'} = 'G'; 22$h{'h'} = 'H'; 23$h{'i'} = 'I'; 24$h{'j'} = 'J'; 25$h{'k'} = 'K'; 26$h{'l'} = 'L'; 27$h{'m'} = 'M'; 28$h{'n'} = 'N'; 29$h{'o'} = 'O'; 30$h{'p'} = 'P'; 31$h{'q'} = 'Q'; 32$h{'r'} = 'R'; 33$h{'s'} = 'S'; 34$h{'t'} = 'T'; 35$h{'u'} = 'U'; 36$h{'v'} = 'V'; 37$h{'w'} = 'W'; 38$h{'x'} = 'X'; 39$h{'y'} = 'Y'; 40$h{'z'} = 'Z'; 41 42@keys = keys %h; 43@values = values %h; 44 45is ($#keys, 29, "keys"); 46is ($#values, 29, "values"); 47 48$i = 0; # stop -w complaints 49 50while (($key,$value) = each(%h)) { 51 if ($key eq $keys[$i] && $value eq $values[$i] 52 && (('a' lt 'A' && $key lt $value) || $key gt $value)) { 53 $key =~ y/a-z/A-Z/; 54 $i++ if $key eq $value; 55 } 56} 57 58is ($i, 30, "each count"); 59 60@keys = ('blurfl', keys(%h), 'dyick'); 61is ($#keys, 31, "added a key"); 62 63$size = ((split('/',scalar %h))[1]); 64keys %h = $size * 5; 65$newsize = ((split('/',scalar %h))[1]); 66is ($newsize, $size * 8, "resize"); 67keys %h = 1; 68$size = ((split('/',scalar %h))[1]); 69is ($size, $newsize, "same size"); 70%h = (1,1); 71$size = ((split('/',scalar %h))[1]); 72is ($size, $newsize, "still same size"); 73undef %h; 74%h = (1,1); 75$size = ((split('/',scalar %h))[1]); 76is ($size, 8, "size 8"); 77 78# test scalar each 79%hash = 1..20; 80$total = 0; 81$total += $key while $key = each %hash; 82is ($total, 100, "test scalar each"); 83 84for (1..3) { @foo = each %hash } 85keys %hash; 86$total = 0; 87$total += $key while $key = each %hash; 88is ($total, 100, "test scalar keys resets iterator"); 89 90for (1..3) { @foo = each %hash } 91$total = 0; 92$total += $key while $key = each %hash; 93isnt ($total, 100, "test iterator of each is being maintained"); 94 95for (1..3) { @foo = each %hash } 96values %hash; 97$total = 0; 98$total += $key while $key = each %hash; 99is ($total, 100, "test values keys resets iterator"); 100 101$size = (split('/', scalar %hash))[1]; 102keys(%hash) = $size / 2; 103is ($size, (split('/', scalar %hash))[1]); 104keys(%hash) = $size + 100; 105isnt ($size, (split('/', scalar %hash))[1]); 106 107is (keys(%hash), 10, "keys (%hash)"); 108 109{ 110 no warnings 'deprecated'; 111 is (keys(hash), 10, "keys (hash)"); 112} 113 114$i = 0; 115%h = (a => A, b => B, c=> C, d => D, abc => ABC); 116{ 117 no warnings 'deprecated'; 118 @keys = keys(h); 119 @values = values(h); 120 while (($key, $value) = each(h)) { 121 if ($key eq $keys[$i] && $value eq $values[$i] && $key eq lc($value)) { 122 $i++; 123 } 124 } 125} 126is ($i, 5); 127 128@tests = (&next_test, &next_test, &next_test); 129{ 130 package Obj; 131 sub DESTROY { print "ok $::tests[1] # DESTROY called\n"; } 132 { 133 my $h = { A => bless [], __PACKAGE__ }; 134 while (my($k,$v) = each %$h) { 135 print "ok $::tests[0]\n" if $k eq 'A' and ref($v) eq 'Obj'; 136 } 137 } 138 print "ok $::tests[2]\n"; 139} 140 141# Check for Unicode hash keys. 142%u = ("\x{12}", "f", "\x{123}", "fo", "\x{1234}", "foo"); 143$u{"\x{12345}"} = "bar"; 144@u{"\x{10FFFD}"} = "zap"; 145 146my %u2; 147foreach (keys %u) { 148 is (length(), 1, "Check length of " . _qq $_); 149 $u2{$_} = $u{$_}; 150} 151ok (eq_hash(\%u, \%u2), "copied unicode hash keys correctly?"); 152 153$a = "\xe3\x81\x82"; $A = "\x{3042}"; 154%b = ( $a => "non-utf8"); 155%u = ( $A => "utf8"); 156 157is (exists $b{$A}, '', "utf8 key in bytes hash"); 158is (exists $u{$a}, '', "bytes key in utf8 hash"); 159print "# $b{$_}\n" for keys %b; # Used to core dump before change #8056. 160pass ("if we got here change 8056 worked"); 161print "# $u{$_}\n" for keys %u; # Used to core dump before change #8056. 162pass ("change 8056 is thanks to Inaba Hiroto"); 163 164# on EBCDIC chars are mapped differently so pick something that needs encoding 165# there too. 166$d = pack("U*", 0xe3, 0x81, 0xAF); 167{ use bytes; $ol = bytes::length($d) } 168cmp_ok ($ol, '>', 3, "check encoding on EBCDIC"); 169%u = ($d => "downgrade"); 170for (keys %u) { 171 is (length, 3, "check length"); 172 is ($_, pack("U*", 0xe3, 0x81, 0xAF), "check value"); 173} 174{ 175 { use bytes; is (bytes::length($d), $ol) } 176} 177 178{ 179 my %u; 180 my $u0 = pack("U0U", 0x00FF); 181 my $b0 = "\xC3\xBF"; # 0xCB 0xBF is U+00FF in UTF-8 182 my $u1 = pack("U0U", 0x0100); 183 my $b1 = "\xC4\x80"; # 0xC4 0x80 is U+0100 in UTF-8 184 185 $u{$u0} = 1; 186 $u{$b0} = 2; 187 $u{$u1} = 3; 188 $u{$b1} = 4; 189 190 is(scalar keys %u, 4, "four different Unicode keys"); 191 is($u{$u0}, 1, "U+00FF -> 1"); 192 is($u{$b0}, 2, "U+00C3 U+00BF -> 2"); 193 is($u{$u1}, 3, "U+0100 -> 3 "); 194 is($u{$b1}, 4, "U+00C4 U+0080 -> 4"); 195} 196 197# test for syntax errors 198for my $k (qw(each keys values)) { 199 eval $k; 200 like($@, qr/^Not enough arguments for $k/, "$k demands argument"); 201} 202 203{ 204 my %foo=(1..10); 205 my ($k,$v); 206 my $count=keys %foo; 207 my ($k1,$v1)=each(%foo); 208 my $yes = 0; 209 if (%foo) { $yes++ } 210 my ($k2,$v2)=each(%foo); 211 my $rest=0; 212 while (each(%foo)) {$rest++}; 213 is($yes,1,"if(%foo) was true"); 214 isnt($k1,$k2,"if(%foo) didnt mess with each (key)"); 215 isnt($v1,$v2,"if(%foo) didnt mess with each (value)"); 216 is($rest,3,"Got the expect number of keys"); 217 my $hsv=1 && %foo; 218 like($hsv,'/',"Got bucket stats from %foo in scalar assignment context"); 219 my @arr=%foo&&%foo; 220 is(@arr,10,"Got expected number of elements in list context"); 221} 222{ 223 our %foo=(1..10); 224 my ($k,$v); 225 my $count=keys %foo; 226 my ($k1,$v1)=each(%foo); 227 my $yes = 0; 228 if (%foo) { $yes++ } 229 my ($k2,$v2)=each(%foo); 230 my $rest=0; 231 while (each(%foo)) {$rest++}; 232 is($yes,1,"if(%foo) was true"); 233 isnt($k1,$k2,"if(%foo) didnt mess with each (key)"); 234 isnt($v1,$v2,"if(%foo) didnt mess with each (value)"); 235 is($rest,3,"Got the expect number of keys"); 236 my $hsv=1 && %foo; 237 like($hsv,'/',"Got bucket stats from %foo in scalar assignment context"); 238 my @arr=%foo&&%foo; 239 is(@arr,10,"Got expected number of elements in list context"); 240} 241