1#!./perl 2 3BEGIN { 4 chdir 't' if -d 't'; 5 @INC = '../lib'; 6 require './test.pl'; 7} 8 9plan tests => 39; 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 109is (keys(hash), 10, "keys (hash)"); 110 111$i = 0; 112%h = (a => A, b => B, c=> C, d => D, abc => ABC); 113@keys = keys(h); 114@values = values(h); 115while (($key, $value) = each(h)) { 116 if ($key eq $keys[$i] && $value eq $values[$i] && $key eq lc($value)) { 117 $i++; 118 } 119} 120is ($i, 5); 121 122@tests = (&next_test, &next_test, &next_test); 123{ 124 package Obj; 125 sub DESTROY { print "ok $::tests[1] # DESTROY called\n"; } 126 { 127 my $h = { A => bless [], __PACKAGE__ }; 128 while (my($k,$v) = each %$h) { 129 print "ok $::tests[0]\n" if $k eq 'A' and ref($v) eq 'Obj'; 130 } 131 } 132 print "ok $::tests[2]\n"; 133} 134 135# Check for Unicode hash keys. 136%u = ("\x{12}", "f", "\x{123}", "fo", "\x{1234}", "foo"); 137$u{"\x{12345}"} = "bar"; 138@u{"\x{10FFFD}"} = "zap"; 139 140my %u2; 141foreach (keys %u) { 142 is (length(), 1, "Check length of " . _qq $_); 143 $u2{$_} = $u{$_}; 144} 145ok (eq_hash(\%u, \%u2), "copied unicode hash keys correctly?"); 146 147$a = "\xe3\x81\x82"; $A = "\x{3042}"; 148%b = ( $a => "non-utf8"); 149%u = ( $A => "utf8"); 150 151is (exists $b{$A}, '', "utf8 key in bytes hash"); 152is (exists $u{$a}, '', "bytes key in utf8 hash"); 153print "# $b{$_}\n" for keys %b; # Used to core dump before change #8056. 154pass ("if we got here change 8056 worked"); 155print "# $u{$_}\n" for keys %u; # Used to core dump before change #8056. 156pass ("change 8056 is thanks to Inaba Hiroto"); 157 158# on EBCDIC chars are mapped differently so pick something that needs encoding 159# there too. 160$d = pack("U*", 0xe3, 0x81, 0xAF); 161{ use bytes; $ol = bytes::length($d) } 162cmp_ok ($ol, '>', 3, "check encoding on EBCDIC"); 163%u = ($d => "downgrade"); 164for (keys %u) { 165 is (length, 3, "check length"); 166 is ($_, pack("U*", 0xe3, 0x81, 0xAF), "check value"); 167} 168{ 169 { use bytes; is (bytes::length($d), $ol) } 170} 171 172{ 173 my %u; 174 my $u0 = pack("U0U", 0x00FF); 175 my $b0 = "\xC3\xBF"; # 0xCB 0xBF is U+00FF in UTF-8 176 my $u1 = pack("U0U", 0x0100); 177 my $b1 = "\xC4\x80"; # 0xC4 0x80 is U+0100 in UTF-8 178 179 $u{$u0} = 1; 180 $u{$b0} = 2; 181 $u{$u1} = 3; 182 $u{$b1} = 4; 183 184 is(scalar keys %u, 4, "four different Unicode keys"); 185 is($u{$u0}, 1, "U+00FF -> 1"); 186 is($u{$b0}, 2, "U+00C3 U+00BF -> 2"); 187 is($u{$u1}, 3, "U+0100 -> 3 "); 188 is($u{$b1}, 4, "U+00C4 U+0080 -> 4"); 189} 190