test_U_hash(\%hash, \%placebo, [f => 9, g => 10, h => 11], $mapping,
$name);
}
+ foreach my $upgrade_o (0, 1) {
+ foreach my $upgrade_n (0, 1) {
+ my (%hash, %placebo);
+ XS::APItest::Hash::bitflip_hash(\%hash);
+ foreach my $new (["7", 65, 67, 80],
+ ["8", 163, 171, 215],
+ ["U", 2603, 2604, 2604],
+ ) {
+ foreach my $code (78, 240, 256, 1336) {
+ my $key = chr $code;
+ # This is the UTF-8 byte sequence for the key.
+ my $key_utf8 = $key;
+ utf8::encode($key_utf8);
+ if ($upgrade_o) {
+ $key .= chr 256;
+ chop $key;
+ }
+ $hash{$key} = $placebo{$key} = $code;
+ $hash{$key_utf8} = $placebo{$key_utf8} = "$code as UTF-8";
+ }
+ my $name = 'bitflip ' . shift @$new;
+ my @new_kv;
+ foreach my $code (@$new) {
+ my $key = chr $code;
+ if ($upgrade_n) {
+ $key .= chr 256;
+ chop $key;
+ }
+ push @new_kv, $key, $_;
+ }
+
+ $name .= ' upgraded(orig) ' if $upgrade_o;
+ $name .= ' upgraded(new) ' if $upgrade_n;
+ test_U_hash(\%hash, \%placebo, \@new_kv, \&bitflip, $name);
+ }
+ }
+ }
}
exit;
is ("@keys", join(' ', sort($mapping->(keys %$placebo))),
"uvar magic called exactly once on store");
- is (keys %$hash, 4);
+ is (keys %$hash, keys %$placebo);
my $victim = shift @hitlist;
is (delete $hash->{$victim}, delete $placebo->{$victim});
- is (keys %$hash, 3);
+ is (keys %$hash, keys %$placebo);
@keys = sort keys %$hash;
is ("@keys", join(' ', sort($mapping->(keys %$placebo))));
is (XS::APItest::Hash::delete_ent ($hash, $victim,
XS::APItest::HV_DISABLE_UVAR_XKEY),
undef, "Deleting a known key with conversion disabled fails (ent)");
- is (keys %$hash, 3);
+ is (keys %$hash, keys %$placebo);
is (XS::APItest::Hash::delete_ent ($hash, $victim, 0),
delete $placebo->{$victim},
"Deleting a known key with conversion enabled works (ent)");
- is (keys %$hash, 2);
+ is (keys %$hash, keys %$placebo);
@keys = sort keys %$hash;
is ("@keys", join(' ', sort($mapping->(keys %$placebo))));
is (XS::APItest::Hash::delete ($hash, $victim,
XS::APItest::HV_DISABLE_UVAR_XKEY),
undef, "Deleting a known key with conversion disabled fails");
- is (keys %$hash, 2);
+ is (keys %$hash, keys %$placebo);
is (XS::APItest::Hash::delete ($hash, $victim, 0),
delete $placebo->{$victim},
"Deleting a known key with conversion enabled works");
- is(keys %$hash, 1);
+ is (keys %$hash, keys %$placebo);
@keys = sort keys %$hash;
is ("@keys", join(' ', sort($mapping->(keys %$placebo))));
my ($k, $v) = splice @$new, 0, 2;
$hash->{$k} = $v;
$placebo->{$k} = $v;
- is(keys %$hash, 2);
+ is (keys %$hash, keys %$placebo);
@keys = sort keys %$hash;
is ("@keys", join(' ', sort($mapping->(keys %$placebo))));
($k, $v) = splice @$new, 0, 2;
is (XS::APItest::Hash::store_ent($hash, $k, $v), $v, "store_ent");
$placebo->{$k} = $v;
- is (keys %$hash, 3);
+ is (keys %$hash, keys %$placebo);
@keys = sort keys %$hash;
is ("@keys", join(' ', sort($mapping->(keys %$placebo))));
($k, $v) = splice @$new, 0, 2;
is (XS::APItest::Hash::store($hash, $k, $v), $v, "store");
- is (keys %$hash, 4);
$placebo->{$k} = $v;
+ is (keys %$hash, keys %$placebo);
@keys = sort keys %$hash;
is ("@keys", join(' ', sort($mapping->(keys %$placebo))));