X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Fop%2Ftie.t;h=9a651555fc486444fe4ad5416cd114c39e1d7934;hb=95e8664e86da93255f26600f44bbbd70bf5b5b0e;hp=cf116519e61f94f507a4c696d3a5d909ea6400a8;hpb=49d42823aebe110c9951956039be0e2cd0dde978;p=p5sagit%2Fp5-mst-13.2.git diff --git a/t/op/tie.t b/t/op/tie.t old mode 100644 new mode 100755 index cf11651..9a65155 --- a/t/op/tie.t +++ b/t/op/tie.t @@ -3,14 +3,18 @@ # This test harness will (eventually) test the "tie" functionality # without the need for a *DBM* implementation. -# Currently it only tests use strict "untie". +# Currently it only tests the untie warning chdir 't' if -d 't'; -@INC = "../lib"; +@INC = '../lib'; $ENV{PERL5LIB} = "../lib"; $|=1; +# catch warnings into fatal errors +$SIG{__WARN__} = sub { die "WARNING: @_" } ; +$SIG{__DIE__} = sub { die @_ }; + undef $/; @prgs = split "\n########\n", ; print "1..", scalar @prgs, "\n"; @@ -22,7 +26,7 @@ for (@prgs){ $results = $@ ; $results =~ s/\n+$//; $expected =~ s/\n+$//; - if ( $status or $results !~ /^$expected/){ + if ( $status or $results and $results !~ /^(WARNING: )?$expected/){ print STDERR "STATUS: $status\n"; print STDERR "PROG: $prog\n"; print STDERR "EXPECTED:\n$expected\n"; @@ -41,6 +45,21 @@ untie %h; EXPECT ######## +# standard behaviour, without any extra references +use Tie::Hash ; +{package Tie::HashUntie; + use base 'Tie::StdHash'; + sub UNTIE + { + warn "Untied\n"; + } +} +tie %h, Tie::HashUntie; +untie %h; +EXPECT +Untied +######## + # standard behaviour, with 1 extra reference use Tie::Hash ; $a = tie %h, Tie::StdHash; @@ -74,7 +93,7 @@ EXPECT ######## # strict behaviour, without any extra references -use strict 'untie'; +use warnings 'untie'; use Tie::Hash ; tie %h, Tie::StdHash; untie %h; @@ -82,26 +101,26 @@ EXPECT ######## # strict behaviour, with 1 extra references generating an error -use strict 'untie'; +use warnings 'untie'; use Tie::Hash ; $a = tie %h, Tie::StdHash; untie %h; EXPECT -Can't untie: 1 inner references still exist at +untie attempted while 1 inner references still exist ######## # strict behaviour, with 1 extra references via tied generating an error -use strict 'untie'; +use warnings 'untie'; use Tie::Hash ; tie %h, Tie::StdHash; $a = tied %h; untie %h; EXPECT -Can't untie: 1 inner references still exist at +untie attempted while 1 inner references still exist ######## # strict behaviour, with 1 extra references which are destroyed -use strict 'untie'; +use warnings 'untie'; use Tie::Hash ; $a = tie %h, Tie::StdHash; $a = 0 ; @@ -110,7 +129,7 @@ EXPECT ######## # strict behaviour, with extra 1 references via tied which are destroyed -use strict 'untie'; +use warnings 'untie'; use Tie::Hash ; tie %h, Tie::StdHash; $a = tied %h; @@ -120,25 +139,66 @@ EXPECT ######## # strict error behaviour, with 2 extra references -use strict 'untie'; +use warnings 'untie'; use Tie::Hash ; $a = tie %h, Tie::StdHash; $b = tied %h ; untie %h; EXPECT -Can't untie: 2 inner references still exist at +untie attempted while 2 inner references still exist ######## # strict behaviour, check scope of strictness. -no strict 'untie'; +no warnings 'untie'; use Tie::Hash ; $A = tie %H, Tie::StdHash; $C = $B = tied %H ; { - use strict 'untie'; + use warnings 'untie'; use Tie::Hash ; tie %h, Tie::StdHash; untie %h; } untie %H; EXPECT +######## +# Forbidden aggregate self-ties +my ($a, $b) = (0, 0); +sub Self::TIEHASH { bless $_[1], $_[0] } +sub Self::DESTROY { $b = $_[0] + 1; } +{ + my %c = 42; + tie %c, 'Self', \%c; +} +EXPECT +Self-ties of arrays and hashes are not supported +######## +# Allowed scalar self-ties +my ($a, $b) = (0, 0); +sub Self::TIESCALAR { bless $_[1], $_[0] } +sub Self::DESTROY { $b = $_[0] + 1; } +{ + my $c = 42; + $a = $c + 0; + tie $c, 'Self', \$c; +} +die unless $a == 0 && $b == 43; +EXPECT +######## +# Interaction of tie and vec + +my ($a, $b); +use Tie::Scalar; +tie $a,Tie::StdScalar or die; +vec($b,1,1)=1; +$a = $b; +vec($a,1,1)=0; +vec($b,1,1)=0; +die unless $a eq $b; +EXPECT +######## +# An attempt at lvalueable barewords broke this + +tie FH, 'main'; +EXPECT +