X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=t%2F30-localize_elem-target.t;h=878670fcba5036a8e1d381b7f14a8d67a282ffec;hb=e7846e7f6fded4c4a3139054c5206c1480711867;hp=fe538e40ddb7ff92cfb6be93982f0cfcee2d114f;hpb=cd7bfde845927d38ca43bd7430503f388260d53a;p=perl%2Fmodules%2FScope-Upper.git diff --git a/t/30-localize_elem-target.t b/t/30-localize_elem-target.t index fe538e4..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/; +use Scope::Upper qw; # Arrays @@ -14,37 +14,37 @@ our @a; { local @a = (4 .. 6); { - localize_elem '@main::a', 1, 8, 0; - is_deeply \@a, [ 4, 8, 6 ], 'localize_elem "@a", 1, 8, 0 [ok]'; + localize_elem '@main::a', 1, 8 => HERE; + is_deeply \@a, [ 4, 8, 6 ], 'localize_elem "@a", 1, 8 => HERE [ok]'; } - is_deeply \@a, [ 4 .. 6 ], 'localize_elem "@a", 1, 8, 0 [end]'; + is_deeply \@a, [ 4 .. 6 ], 'localize_elem "@a", 1, 8 => HERE [end]'; } { local @a = (4 .. 6); { - localize_elem '@main::a', 4, 8, 0; - is_deeply \@a, [ 4 .. 6, undef, 8 ], 'localize_elem "@a", 4, 8, 0 [ok]'; + localize_elem '@main::a', 4, 8 => HERE; + is_deeply \@a, [ 4 .. 6, undef, 8 ], 'localize_elem "@a", 4, 8 => HERE [ok]'; } - is_deeply \@a, [ 4 .. 6 ], 'localize_elem "@a", 4, 8, 0 [end]'; + is_deeply \@a, [ 4 .. 6 ], 'localize_elem "@a", 4, 8 => HERE [end]'; } { local @a = (4 .. 6); { - localize_elem '@main::a', -2, 8, 0; - is_deeply \@a, [ 4, 8, 6 ], 'localize_elem "@a", -2, 8, 0 [ok]'; + localize_elem '@main::a', -2, 8 => HERE; + is_deeply \@a, [ 4, 8, 6 ], 'localize_elem "@a", -2, 8 => HERE [ok]'; } - is_deeply \@a, [ 4 .. 6 ], 'localize_elem "@a", -2, 8, 0 [end]'; + is_deeply \@a, [ 4 .. 6 ], 'localize_elem "@a", -2, 8 => HERE [end]'; } { local @a = (4 .. 6); { - eval { localize_elem '@main::a', -4, 8, 0 }; - like $@, qr/Modification of non-creatable array value attempted, subscript -4/, 'localize_elem "@a", -4, 8, 0 [ok]'; + eval { localize_elem '@main::a', -4, 8 => HERE }; + like $@, qr/Modification of non-creatable array value attempted, subscript -4/, 'localize_elem "@a", -4, 8 => HERE [ok]'; } - is_deeply \@a, [ 4 .. 6 ], 'localize_elem "@a", -4, 8, 0 [end]'; + is_deeply \@a, [ 4 .. 6 ], 'localize_elem "@a", -4, 8 => HERE [end]'; } { @@ -52,12 +52,12 @@ our @a; { local @a = (5 .. 7); { - localize_elem '@main::a', 1, 12, 1; - is_deeply \@a, [ 5 .. 7 ], 'localize_elem "@a", 1, 12, 1 [not yet]'; + localize_elem '@main::a', 1, 12 => UP; + is_deeply \@a, [ 5 .. 7 ], 'localize_elem "@a", 1, 12 => UP [not yet]'; } - is_deeply \@a, [ 5, 12, 7 ], 'localize_elem "@a", 1, 12, 1 [ok]'; + is_deeply \@a, [ 5, 12, 7 ], 'localize_elem "@a", 1, 12 => UP [ok]'; } - is_deeply \@a, [ 4 .. 6 ], 'localize_elem "@a", 1, 12, 1 [end]'; + is_deeply \@a, [ 4 .. 6 ], 'localize_elem "@a", 1, 12 => UP [end]'; } { @@ -65,12 +65,22 @@ our @a; { local @a = (5 .. 7); { - localize_elem '@main::a', 4, 12, 1; - is_deeply \@a, [ 5 .. 7 ], 'localize_elem "@a", 4, 12, 1 [not yet]'; + localize_elem '@main::a', 4, 12 => UP; + is_deeply \@a, [ 5 .. 7 ], 'localize_elem "@a", 4, 12 => UP [not yet]'; } - is_deeply \@a, [ 5 .. 7, undef, 12 ], 'localize_elem "@a", 4, 12, 1 [ok]'; + is_deeply \@a, [ 5 .. 7, undef, 12 ], 'localize_elem "@a", 4, 12 => UP [ok]'; } - is_deeply \@a, [ 4 .. 6 ], 'localize_elem "@a", 4, 12, 1 [end]'; + 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 @@ -80,19 +90,19 @@ our %h; { local %h = (a => 1, b => 2); { - localize_elem '%main::h', 'a', 3, 0; - is_deeply \%h, { a => 3, b => 2 }, 'localize_elem "%h", "a", 3, 0 [ok]'; + localize_elem '%main::h', 'a', 3 => HERE; + is_deeply \%h, { a => 3, b => 2 }, 'localize_elem "%h", "a", 3 => HERE [ok]'; } - is_deeply \%h, { a => 1, b => 2 }, 'localize_elem "%h", "a", 3, 0 [end]'; + is_deeply \%h, { a => 1, b => 2 }, 'localize_elem "%h", "a", 3 => HERE [end]'; } { local %h = (a => 1, b => 2); { - localize_elem '%main::h', 'c', 3, 0; - is_deeply \%h, { a => 1, b => 2, c => 3 }, 'localize_elem "%h", "c", 3, 0 [ok]'; + localize_elem '%main::h', 'c', 3 => HERE; + is_deeply \%h, { a => 1, b => 2, c => 3 }, 'localize_elem "%h", "c", 3 => HERE [ok]'; } - is_deeply \%h, { a => 1, b => 2 }, 'localize_elem "%h", "c", 3, 0 [end]'; + is_deeply \%h, { a => 1, b => 2 }, 'localize_elem "%h", "c", 3 => HERE [end]'; } { @@ -100,11 +110,103 @@ our %h; { local %h = (a => 3, c => 4); { - localize_elem '%main::h', 'a', 5, 1; - is_deeply \%h, { a => 3, c => 4 }, 'localize_elem "%h", "a", 5, 1 [not yet]'; + localize_elem '%main::h', 'a', 5 => UP; + is_deeply \%h, { a => 3, c => 4 }, 'localize_elem "%h", "a", 5 => UP [not yet]'; } - is_deeply \%h, { a => 5, c => 4 }, 'localize_elem "%h", "a", 5, 1 [ok]'; + is_deeply \%h, { a => 5, c => 4 }, 'localize_elem "%h", "a", 5 => UP [ok]'; + } + 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 \%h, { a => 1, b => 2 }, 'localize_elem "%h", "a", 5, 1 [end]'; + 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'; +}