use strict;
use warnings;
-use Test::More tests => 36;
+use Test::More tests => 53 + 4;
-use Scope::Upper qw/localize_delete UP HERE/;
+use Scope::Upper qw<localize_delete UP HERE>;
# Arrays
is_deeply \@a, [ 4 .. 6 ], 'localize_delete "@a", 4 (exists) => UP [end]';
}
+{
+ {
+ localize_delete '@nonexistent', 2;
+ is_deeply eval('*nonexistent{ARRAY}'), [ ],
+ 'localize_delete "@nonexistent", anything => HERE [ok]';
+ }
+ is_deeply eval('*nonexistent{ARRAY}'), [ ],
+ 'localize_delete "@nonexistent", anything => HERE [end]';
+}
+
# Hashes
our %h;
is_deeply \%h, { a => 1, b => 2 }, 'localize_delete "%h", "a" => UP [end]';
}
-# Others
+{
+ {
+ localize_delete '%nonexistent', 'a';
+ is_deeply eval('*nonexistent{HASH}'), { },
+ 'localize_delete "%nonexistent", anything => HERE [ok]';
+ }
+ is_deeply eval('*nonexistent{HASH}'), { },
+ 'localize_delete "%nonexistent", anything => HERE [end]';
+}
+
+# Scalars
our $x = 1;
{
localize_delete '$x', 2 => HERE;
- is $x, undef, 'localize "$x", anything => HERE [ok]';
+ is $x, undef, 'localize_delete "$x", anything => HERE [ok]';
+}
+is $x, 1, 'localize_delete "$x", anything => HERE [end]';
+
+{
+ {
+ localize_delete '$nonexistent', 2;
+ is eval('${*nonexistent{SCALAR}}'), undef,
+ 'localize_delete "$nonexistent", anything => HERE [ok]';
+ }
+ is eval('${*nonexistent{SCALAR}}'), undef,
+ 'localize_delete "$nonexistent", anything => HERE [end]';
}
-is $x, 1, 'localize "$x", anything => HERE [end]';
+
+# Code
sub x { 1 };
{
localize_delete '&x', 2 => HERE;
- ok !exists(&x), 'localize "&x", anything => HERE [ok]';
+ ok !exists(&x), 'localize_delete "&x", anything => HERE [ok]';
+}
+is x(), 1, 'localize_delete "&x", anything => HERE [end]';
+
+{
+ {
+ localize_delete '&nonexistent', 2;
+ is eval('exists &nonexistent'), !1,
+ 'localize_delete "&nonexistent", anything => HERE [ok]';
+ }
+ is eval('exists &nonexistent'), !1,
+ 'localize_delete "&nonexistent", anything => HERE [end]';
}
-is x(), 1, 'localize "&x", anything => HERE [end]';
{
localize_delete *x, sub { } => HERE;
- is !exists(&x), 1, 'localize *x, anything => HERE [ok 1]';
- is !defined($x), 1, 'localize *x, anything => HERE [ok 2]';
+ is !exists(&x), 1, 'localize_delete *x, anything => HERE [ok 1]';
+ is !defined($x), 1, 'localize_delete *x, anything => HERE [ok 2]';
+}
+is x(), 1, 'localize_delete *x, anything => HERE [end 1]';
+is $x, 1, 'localize_delete *x, anything => HERE [end 2]';
+
+sub X::foo { 'X::foo' }
+
+{
+ {
+ {
+ localize_delete '&X::foo', undef => UP;
+ is(X->foo(), 'X::foo', 'localize_delete "&X::foo", undef => UP [not yet X]');
+ }
+ ok(!X->can('foo'), 'localize_delete "&X::foo", undef => UP [ok X]');
+ }
+ is(X->foo(), 'X::foo', 'localize_delete "&X::foo", undef => UP [end X]');
+}
+
+@Y::ISA = 'X';
+
+{
+ {
+ {
+ localize_delete '&X::foo', undef => UP;
+ is(Y->foo(), 'X::foo', 'localize_delete "&X::foo", undef => UP [not yet Y]');
+ }
+ ok(!Y->can('foo'), 'localize_delete "&X::foo", undef => UP [ok Y]');
+ }
+ is(Y->foo(), 'X::foo', 'localize_delete "&X::foo", undef => UP [end Y]');
+}
+
+
+{
+ local *Y::foo = sub { 'Y::foo' };
+ {
+ {
+ localize_delete '&Y::foo', undef => UP;
+ is(Y->foo(), 'Y::foo', 'localize_delete "&Y::foo", undef => UP [not yet]');
+ }
+ is(Y->foo(), 'X::foo', 'localize_delete "&Y::foo", undef => UP [ok]');
+ }
+ is(Y->foo(), 'Y::foo', 'localize_delete "&Y::foo", undef => UP [end]');
+}
+
+{
+ # Prevent 'only once' warnings
+ local *Y::foo = *Y::foo;
+}
+
+# Invalid
+
+sub invalid_ref { qr/^Invalid \Q$_[0]\E reference as the localization target/ }
+
+{
+ eval { localize_delete \1, 0 => HERE };
+ like $@, invalid_ref('SCALAR'), 'invalid localize_delete \1, 0 => HERE';
+}
+
+{
+ eval { localize_delete [ ], 0 => HERE };
+ like $@, invalid_ref('ARRAY'), 'invalid localize_delete [ ], 0 => HERE';
+}
+
+{
+ eval { localize_delete { }, 0 => HERE };
+ like $@, invalid_ref('HASH'), 'invalid localize_delete { }, 0 => HERE';
+}
+
+{
+ eval { localize_delete sub { }, 0 => HERE };
+ like $@, invalid_ref('CODE'), 'invalid localize_delete sub { }, 0 => HERE';
}
-is x(), 1, 'localize *x, anything => HERE [end 1]';
-is $x, 1, 'localize *x, anything => HERE [end 2]';