+{
+ local *foo = sub { 'a' };
+ {
+ {
+ localize *foo, sub { 'b' } => UP;
+ is foo(), 'a', 'localize *foo, sub { "b" } => UP [not yet 1]';
+ {
+ no warnings 'redefine';
+ local *foo = sub { 'c' };
+ is foo(), 'c', 'localize *foo, sub { "b" } => UP [localized 1]';
+ }
+ is foo(), 'a', 'localize *foo, sub { "b" } => UP [not yet 2]';
+ }
+ is foo(), 'b', 'localize *foo, sub { "b" } => UP [ok 1]';
+ {
+ no warnings 'redefine';
+ local *foo = sub { 'd' };
+ is foo(), 'd', 'localize *foo, sub { "b" } => UP [localized 2]';
+ }
+ is foo(), 'b', 'localize *foo, sub { "b" } => UP [ok 2]';
+ }
+ is foo(), 'a', 'localize *foo, sub { "b" } => UP [end]';
+}
+
+{
+ local *foo = sub { 'x' };
+ {
+ {
+ localize *foo, sub { 'y' } => UP;
+ is foo(), 'x', 'localize *foo, sub { "y" } => UP [not yet]';
+ }
+ is foo(), 'y', 'localize *foo, sub { "y" } => UP [ok]';
+ no warnings 'redefine';
+ *foo = sub { 'z' };
+ is foo(), 'z', 'localize *foo, sub { "y" } => UP [replaced]';
+ }
+ is foo(), 'x', 'localize *foo, sub { "y" } => UP [end]';
+}
+
+sub X::foo { 'X::foo' }
+
+{
+ {
+ {
+ localize 'X::foo', sub { 'X::foo 2' } => UP;
+ is(X->foo, 'X::foo', 'localize "X::foo", sub { "X::foo 2" } => UP [not yet]')
+ }
+ is(X->foo, 'X::foo 2', 'localize "X::foo", sub { "X::foo 2" } => UP [ok]');
+ }
+ is(X->foo, 'X::foo', 'localize "X::foo", sub { "X::foo 2" } => UP [end]');
+}
+
+@Y::ISA = 'X';
+
+{
+ {
+ {
+ localize 'X::foo', sub { 'X::foo 3' } => UP;
+ is(Y->foo, 'X::foo', 'localize "X::foo", sub { "X::foo 3" } => UP [not yet]')
+ }
+ is(Y->foo, 'X::foo 3', 'localize "X::foo", sub { "X::foo 3" } => UP [ok]');
+ }
+ is(Y->foo, 'X::foo', 'localize "X::foo", sub { "X::foo 2" } => UP [end]');
+}
+
+{
+ {
+ {
+ localize 'Y::foo', sub { 'Y::foo' } => UP;
+ is(Y->foo, 'X::foo', 'localize "Y::foo", sub { "Y::foo" } => UP [not yet]');
+ }
+ is(Y->foo, 'Y::foo', 'localize "Y::foo", sub { "Y::foo" } => UP [ok]');
+ }
+ is(Y->foo, 'X::foo', 'localize "Y::foo", sub { "Y::foo" } => UP [end]');
+}
+
+# Import
+
+sub is_imported {
+ my ($pkg, $sig, $val) = @_;
+ my $exp = $sig eq '$' ? \$val : $val;
+ my $var = 'daffodil'; # don't use 'x' or eval will capture $main::x
+ my $spec = $sig . $pkg . '::' . $var;
+ localize $spec, $val => HERE;
+ {
+ my $desc = "localize imported ${sig}${var} to $val";
+ my $got = eval "package $pkg; \\${sig}${var}";
+ if ($@) {
+ fail "$desc test did not compile: $@";
+ } else {
+ is_deeply $got, $exp, $desc;
+ }
+ }
+ {
+ my $desc = "localize defined ${sig}${var} to $val";
+ my $got = eval "\\${sig}${pkg}::${var}";
+ if ($@) {
+ fail "$desc test did not compile: $@";
+ } else {
+ is_deeply $got, $exp, $desc;
+ }
+ }
+}
+
+{
+ is_imported 'Scope::Upper::Test::Mock10', '$', 0;
+ is_imported 'Scope::Upper::Test::Mock11', '$', \1;
+ is_imported 'Scope::Upper::Test::Mock12', '@', [ 2, 3 ];
+ is_imported 'Scope::Upper::Test::Mock13', '%', { a => 4 };
+ is_imported 'Scope::Upper::Test::Mock14', '&', sub { 5 };
+}
+