#!perl -w package AnyWillDo; use strict; no strict "vars"; use Data::Locations; use FileHandle; use IO::File; # ====================================================================== # $location->tie("FILEHANDLE"); # ====================================================================== $err = ''; $handler_1 = sub { $err = join('', @_); }; $handler_2 = sub { print STDERR @_; }; $nonzero = 1; $empty = 0; $unlink = 1; $preserve = 0; $reopen = 1; $closed = 0; print "1..92\n"; $n = 1; $self = $0; $self =~ s!^.*[^0-9a-zA-Z_\.]!!; $temp = $ENV{'TMP'} || $ENV{'TEMP'} || $ENV{'TMPDIR'} || $ENV{'TEMPDIR'} || '/tmp'; $temp =~ s!/+$!!; $file = "$temp/$self.$$"; unlink($file); unless (-f $file) {print "ok $n\n";} else {print "not ok $n\n";} $n++; &write_file(); &check_file($empty,$unlink,$reopen); print FILE "This is some dummy text."; &check_file($nonzero,$preserve,$closed); &read_file(); $txt = join('', ); close(FILE); if ($txt eq "This is some dummy text.") {print "ok $n\n";} else {print "not ok $n\n";} $n++; unlink($file); unless (-f $file) {print "ok $n\n";} else {print "not ok $n\n";} $n++; &write_file(); $loc = Data::Locations->new(); if (tied(*{$loc}) eq $loc) {print "ok $n\n";} else {print "not ok $n\n";} $n++; print $loc "First"; $loc->reset(); if (join('|', <$loc>) eq 'First') {print "ok $n\n";} else {print "not ok $n\n";} $n++; $loc->tie("FILE"); if (tied(*FILE) eq $loc) {print "ok $n\n";} else {print "not ok $n\n";} $n++; print FILE "Second"; $loc->reset(); if (join('|', <$loc>) eq 'First|Second') {print "ok $n\n";} else {print "not ok $n\n";} $n++; $SIG{__WARN__} = $handler_1; $err = ''; untie(*FILE); if ($err =~ /untie attempted while 1 inner references still exist/) {print "ok $n\n";} else {print "not ok $n\n";} $n++; unless (defined tied(*FILE)) {print "ok $n\n";} else {print "not ok $n\n";} $n++; print FILE "Double-check..."; &check_file($nonzero,$preserve,$closed); &read_file(); $txt = join('', ); close(FILE); if ($txt eq "Double-check...") {print "ok $n\n";} else {print "not ok $n\n";} $n++; unlink($file); unless (-f $file) {print "ok $n\n";} else {print "not ok $n\n";} $n++; &write_file(); $loc->tie(*FILE); if (tied(*FILE) eq $loc) {print "ok $n\n";} else {print "not ok $n\n";} $n++; $temp = select(FILE); print "Third"; select($temp); $loc->reset(); if (join('|', <$loc>) eq 'First|Second|Third') {print "ok $n\n";} else {print "not ok $n\n";} $n++; $err = ''; untie(*FILE); if ($err =~ /untie attempted while 1 inner references still exist/) {print "ok $n\n";} else {print "not ok $n\n";} $n++; unless (defined tied(*FILE)) {print "ok $n\n";} else {print "not ok $n\n";} $n++; &check_file($empty,$unlink,$reopen); $loc->tie(\*FILE); if (tied(*FILE) eq $loc) {print "ok $n\n";} else {print "not ok $n\n";} $n++; print FILE "Fourth"; $loc->reset(); if (join('|', <$loc>) eq 'First|Second|Third|Fourth') {print "ok $n\n";} else {print "not ok $n\n";} $n++; $err = ''; untie(*FILE); if ($err =~ /untie attempted while 1 inner references still exist/) {print "ok $n\n";} else {print "not ok $n\n";} $n++; unless (defined tied(*FILE)) {print "ok $n\n";} else {print "not ok $n\n";} $n++; &check_file($empty,$unlink,$reopen); $loc->tie(*{FILE}); if (tied(*FILE) eq $loc) {print "ok $n\n";} else {print "not ok $n\n";} $n++; if (tied(*AnyWillDo::FILE) eq $loc) {print "ok $n\n";} else {print "not ok $n\n";} $n++; unless (defined tied(*main::FILE)) {print "ok $n\n";} else {print "not ok $n\n";} $n++; print FILE "Fifth"; $loc->reset(); if (join('|', <$loc>) eq 'First|Second|Third|Fourth|Fifth') {print "ok $n\n";} else {print "not ok $n\n";} $n++; $err = ''; untie(*FILE); if ($err =~ /untie attempted while 1 inner references still exist/) {print "ok $n\n";} else {print "not ok $n\n";} $n++; unless (defined tied(*FILE)) {print "ok $n\n";} else {print "not ok $n\n";} $n++; unless (defined tied(*AnyWillDo::FILE)) {print "ok $n\n";} else {print "not ok $n\n";} $n++; unless (defined tied(*main::FILE)) {print "ok $n\n";} else {print "not ok $n\n";} $n++; &check_file($empty,$unlink,$reopen); no strict "refs"; $loc->tie(*{'FILE'}); use strict "refs"; if (tied(*FILE) eq $loc) {print "ok $n\n";} else {print "not ok $n\n";} $n++; print FILE "Sixth"; $loc->reset(); if (join('|', ) eq 'First|Second|Third|Fourth|Fifth|Sixth') {print "ok $n\n";} else {print "not ok $n\n";} $n++; $err = ''; untie(*FILE); if ($err =~ /untie attempted while 1 inner references still exist/) {print "ok $n\n";} else {print "not ok $n\n";} $n++; unless (defined tied(*FILE)) {print "ok $n\n";} else {print "not ok $n\n";} $n++; &check_file($empty,$unlink,$reopen); $loc->tie(\*{main::FILE}); if (tied(*main::FILE) eq $loc) {print "ok $n\n";} else {print "not ok $n\n";} $n++; unless (defined tied(*FILE)) {print "ok $n\n";} else {print "not ok $n\n";} $n++; unless (defined tied(*AnyWillDo::FILE)) {print "ok $n\n";} else {print "not ok $n\n";} $n++; print main::FILE "Seventh"; $loc->reset(); if (join('|', <$loc>) eq 'First|Second|Third|Fourth|Fifth|Sixth|Seventh') {print "ok $n\n";} else {print "not ok $n\n";} $n++; $err = ''; untie(*main::FILE); if ($err =~ /untie attempted while 1 inner references still exist/) {print "ok $n\n";} else {print "not ok $n\n";} $n++; unless (defined tied(*main::FILE)) {print "ok $n\n";} else {print "not ok $n\n";} $n++; unless (defined tied(*FILE)) {print "ok $n\n";} else {print "not ok $n\n";} $n++; unless (defined tied(*AnyWillDo::FILE)) {print "ok $n\n";} else {print "not ok $n\n";} $n++; $FileHandle = FileHandle->new(); $loc->tie($FileHandle); if (tied(*{$FileHandle}) eq $loc) {print "ok $n\n";} else {print "not ok $n\n";} $n++; print $FileHandle "Eighth"; $loc->reset(); if (join('|', <$loc>) eq 'First|Second|Third|Fourth|Fifth|Sixth|Seventh|Eighth') {print "ok $n\n";} else {print "not ok $n\n";} $n++; $err = ''; untie(*{$FileHandle}); if ($err =~ /untie attempted while 1 inner references still exist/) {print "ok $n\n";} else {print "not ok $n\n";} $n++; unless (defined tied(*{$FileHandle})) {print "ok $n\n";} else {print "not ok $n\n";} $n++; $IO_File = IO::File->new(); $loc->tie($IO_File); if (tied(*{$IO_File}) eq $loc) {print "ok $n\n";} else {print "not ok $n\n";} $n++; print $IO_File "Nineth"; $loc->reset(); if (join('|', <$IO_File>) eq 'First|Second|Third|Fourth|Fifth|Sixth|Seventh|Eighth|Nineth') {print "ok $n\n";} else {print "not ok $n\n";} $n++; $err = ''; untie(*{$IO_File}); if ($err =~ /untie attempted while 1 inner references still exist/) {print "ok $n\n";} else {print "not ok $n\n";} $n++; unless (defined tied(*{$IO_File})) {print "ok $n\n";} else {print "not ok $n\n";} $n++; $loc->tie(*STDIN); if (tied(*STDIN) eq $loc) {print "ok $n\n";} else {print "not ok $n\n";} $n++; $loc->reset(); $txt = ; if ($txt eq 'First') {print "ok $n\n";} else {print "not ok $n\n";} $n++; print STDIN "Tenth"; $txt = ; if ($txt eq 'Second') {print "ok $n\n";} else {print "not ok $n\n";} $n++; if (join('|', ) eq 'Third|Fourth|Fifth|Sixth|Seventh|Eighth|Nineth|Tenth') {print "ok $n\n";} else {print "not ok $n\n";} $n++; $err = ''; untie(*STDIN); if ($err =~ /untie attempted while 1 inner references still exist/) {print "ok $n\n";} else {print "not ok $n\n";} $n++; unless (defined tied(*STDIN)) {print "ok $n\n";} else {print "not ok $n\n";} $n++; $loc->delete(); $temp = select($loc); print "Dummy"; select($temp); $loc->reset(); if (join('|', <$loc>) eq 'Dummy') {print "ok $n\n";} else {print "not ok $n\n";} $n++; $loc->tie('STDOUT'); print "via STDOUT"; $loc->reset(); $txt = join('|', ); $err = ''; untie(*STDOUT); if ($err =~ /untie attempted while 1 inner references still exist/) {print "ok $n\n";} else {print "not ok $n\n";} $n++; if ($txt eq 'Dummy|via STDOUT') {print "ok $n\n";} else {print "not ok $n\n";} $n++; $loc->tie('STDERR'); if (tied(*STDERR) eq $loc) {print "ok $n\n";} else {print "not ok $n\n";} $n++; print STDERR "via STDERR"; $loc->reset(); if (join('|', ) eq 'Dummy|via STDOUT|via STDERR') {print "ok $n\n";} else {print "not ok $n\n";} $n++; $SIG{__WARN__} = $handler_2; warn "This is a dummy warning"; $loc->reset(); $txt = join('|', ); if ($txt =~ /^Dummy\|via STDOUT\|via STDERR\|(?:#\s+)?This is a dummy warning\b/) {print "ok $n\n";} else {print "not ok $n\n";} $n++; $SIG{__WARN__} = $handler_1; $err = ''; untie(*STDERR); if ($err =~ /untie attempted while 1 inner references still exist/) {print "ok $n\n";} else {print "not ok $n\n";} $n++; unless (defined tied(*STDERR)) {print "ok $n\n";} else {print "not ok $n\n";} $n++; $loc->delete(); print $loc "Last test"; $loc->reset(); if (join('|', <$loc>) eq "Last test") {print "ok $n\n";} else {print "not ok $n\n";} $n++; tie(*FILE, 'Data::Locations', $loc); if (tied(*FILE) eq $loc) {print "ok $n\n";} else {print "not ok $n\n";} $n++; if (tied(*AnyWillDo::FILE) eq $loc) {print "ok $n\n";} else {print "not ok $n\n";} $n++; unless (defined tied(*main::FILE)) {print "ok $n\n";} else {print "not ok $n\n";} $n++; print FILE "tied via built-in operator"; $loc->reset(); if (join('|', <$loc>) eq "Last test|tied via built-in operator") {print "ok $n\n";} else {print "not ok $n\n";} $n++; $err = ''; untie(*FILE); if ($err =~ /untie attempted while 1 inner references still exist/) {print "ok $n\n";} else {print "not ok $n\n";} $n++; unless (defined tied(*FILE)) {print "ok $n\n";} else {print "not ok $n\n";} $n++; unless (defined tied(*AnyWillDo::FILE)) {print "ok $n\n";} else {print "not ok $n\n";} $n++; unless (defined tied(*main::FILE)) {print "ok $n\n";} else {print "not ok $n\n";} $n++; &check_file($empty,$unlink,$closed); exit; sub write_file { unless (open(FILE, ">$file")) { die "$self: can't write '$file': \L$!\E\n"; } } sub read_file { unless (open(FILE, "<$file")) { die "$self: can't read '$file': \L$!\E\n"; } } sub check_file { my($nonzero,$unlink,$reopen) = @_; close(FILE); if (-f $file) {print "ok $n\n";} else {print "not ok $n\n";} $n++; if ($nonzero) { if (-s $file > 0) {print "ok $n\n";} else {print "not ok $n\n";} $n++; } else { if (-s $file == 0) {print "ok $n\n";} else {print "not ok $n\n";} $n++; } if ($unlink) { unlink($file); unless (-f $file) {print "ok $n\n";} else {print "not ok $n\n";} $n++; } if ($reopen) { &write_file(); } } __END__