]> git.vpit.fr Git - perl/modules/Scope-Upper.git/blobdiff - t/30-localize_elem-target.t
Be stricter about what localize_elem() accepts
[perl/modules/Scope-Upper.git] / t / 30-localize_elem-target.t
index 79ce8eec59c6bc9c70ed010b4ca47d14f18f5caa..5db7d0b808c5227b5884174158c0e994ad02c835 100644 (file)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 21;
+use Test::More tests => 25 + 8;
 
 use Scope::Upper qw/localize_elem UP HERE/;
 
@@ -73,6 +73,16 @@ our @a;
  is_deeply \@a, [ 4 .. 6 ], 'localize_elem "@a", 4, 12 => UP [end]';
 }
 
+{
+ {
+  localize_elem '@nonexistent', 2, 7;
+  is_deeply eval('*nonexistent{ARRAY}'), [ undef, undef, 7 ],
+                             'localize_elem "@nonexistent", 2, 7 => HERE [ok]';
+ }
+ is_deeply eval('*nonexistent{ARRAY}'), [ ],
+                             'localize_elem "@nonexistent", 2, 7 => HERE [end]';
+}
+
 # Hashes
 
 our %h;
@@ -108,3 +118,71 @@ our %h;
  is_deeply \%h, { a => 1, b => 2 }, 'localize_elem "%h", "a", 5 => UP [end]';
 }
 
+{
+ {
+  localize_elem '%nonexistent', 'a', 13;
+  is_deeply eval('*nonexistent{HASH}'), { a => 13 },
+                          'localize_elem "%nonexistent", "a", 13 => HERE [ok]';
+ }
+ is_deeply eval('*nonexistent{HASH}'), { },
+                          'localize_elem "%nonexistent", "a", 13 => HERE [end]';
+}
+
+my $invalid_glob = qr/^Can't infer the element localization type from a glob and the value/;
+my $invalid_type = qr/^Can't localize an element of something that isn't an array or a hash/;
+
+{
+ local *x;
+
+ eval { localize_elem '$x', 0, 1 };
+ like $@, $invalid_type, 'invalid localize_elem "$x", 0, 1';
+}
+
+{
+ local *x;
+
+ eval { localize_elem '&x', 0, sub { } };
+ like $@, $invalid_type, 'invalid localize_elem "&x", 0, sub { }';
+}
+
+{
+ local *x;
+
+ eval { localize_elem '*x', 0, \1 };
+ like $@, $invalid_type, 'invalid localize_elem "*x", 0, \1';
+}
+
+{
+ local *x;
+
+ eval { localize_elem *x, 0, \1 };
+ like $@, $invalid_glob, 'invalid localize_elem *x, 0, \1';
+}
+
+{
+ local *x;
+
+ eval { localize_elem *x, 0, [ 1 ] };
+ like $@, $invalid_glob, 'invalid localize_elem *x, 0, [ 1 ]';
+}
+
+{
+ local *x;
+
+ eval { localize_elem *x, 0, { a => 1 } };
+ like $@, $invalid_glob, 'invalid localize_elem *x, 0, { a => 1 }';
+}
+
+{
+ local *x;
+
+ eval { localize_elem *x, 0, sub { } };
+ like $@, $invalid_glob, 'invalid localize_elem *x, 0, sub { }';
+}
+
+{
+ local *x;
+
+ eval { localize_elem *x, 0, *x };
+ like $@, $invalid_glob, 'invalid localize_elem *x, 0, *x';
+}