X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=t%2F30-localize_elem-target.t;h=878670fcba5036a8e1d381b7f14a8d67a282ffec;hb=e7846e7f6fded4c4a3139054c5206c1480711867;hp=79ce8eec59c6bc9c70ed010b4ca47d14f18f5caa;hpb=0a6221d3f467b5f819e3c119b4cda0218399cb51;p=perl%2Fmodules%2FScope-Upper.git diff --git a/t/30-localize_elem-target.t b/t/30-localize_elem-target.t index 79ce8ee..878670f 100644 --- a/t/30-localize_elem-target.t +++ b/t/30-localize_elem-target.t @@ -3,9 +3,9 @@ use strict; use warnings; -use Test::More tests => 21; +use Test::More tests => 25 + 12; -use Scope::Upper qw/localize_elem UP HERE/; +use Scope::Upper qw; # Arrays @@ -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,95 @@ 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]'; +} + +# Invalid + +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'; +} + +sub invalid_ref { qr/^Invalid \Q$_[0]\E reference as the localization target/ } + +{ + eval { localize_elem \1, 0, 0 => HERE }; + like $@, invalid_ref('SCALAR'), 'invalid localize_elem \1, 0, 0 => HERE'; +} + +{ + eval { localize_elem [ ], 0, 0 => HERE }; + like $@, invalid_ref('ARRAY'), 'invalid localize_elem [ ], 0, 0 => HERE'; +} + +{ + eval { localize_elem { }, 0, 0 => HERE }; + like $@, invalid_ref('HASH'), 'invalid localize_elem { }, 0, 0 => HERE'; +} + +{ + eval { localize_elem sub { }, 0, 0 => HERE }; + like $@, invalid_ref('CODE'), 'invalid localize_elem sub { }, 0, 0 => HERE'; +}