#!./perl
BEGIN {
chdir 't' if -d 't';
@INC = qw(../lib);
}
use strict;
use warnings;
no warnings 'once';
use Test::More tests => 14;
# line 50
use_ok( 'B::Xref' );
my $file = 'xreftest.out';
open SAVEOUT, ">&STDOUT" or diag $!;
close STDOUT;
# line 100
our $compilesub = B::Xref::compile("-o$file");
ok( ref $compilesub eq 'CODE', "compile() returns a coderef ($compilesub)" );
$compilesub->(); # Compile this test script
close STDOUT;
open STDOUT, ">&SAVEOUT" or diag $!;
# Now parse the output
# line 200
my ($curfile, $cursub, $curpack) = ('') x 3;
our %xreftable = ();
open XREF, $file or die "# Can't open $file: $!\n";
while (<XREF>) {
chomp;
if (/^File (.*)/) {
$curfile = $1;
} elsif (/^ Subroutine (.*)/) {
$cursub = $1;
} elsif (/^ Package (.*)/) {
$curpack = $1;
} elsif ($curpack eq '?' && /^ (".*") +(.*)/
or /^ (\S+)\s+(.*)/) {
$xreftable{$curfile}{$cursub}{$curpack}{$1} = $2;
}
}
close XREF;
my $thisfile = __FILE__;
ok(
defined $xreftable{$thisfile}{'(main)'}{main}{'$compilesub'},
'$compilesub present in main program'
);
like(
$xreftable{$thisfile}{'(main)'}{main}{'$compilesub'},
qr/\bi100\b/,
'$compilesub introduced at line 100'
);
like(
$xreftable{$thisfile}{'(main)'}{main}{'$compilesub'},
qr/&102\b/,
'$compilesub coderef called at line 102'
);
ok(
defined $xreftable{$thisfile}{'(main)'}{'(lexical)'}{'$curfile'},
'$curfile present in main program'
);
like(
$xreftable{$thisfile}{'(main)'}{'(lexical)'}{'$curfile'},
qr/\bi200\b/,
'$curfile introduced at line 200'
);
ok(
defined $xreftable{$thisfile}{'(main)'}{main}{'%xreftable'},
'$xreftable present in main program'
);
ok(
defined $xreftable{$thisfile}{'Testing::Xref::foo'}{main}{'%xreftable'},
'$xreftable used in subroutine bar'
);
is(
$xreftable{$thisfile}{'(main)'}{main}{'&use_ok'}, '&50',
'use_ok called at line 50'
);
is(
$xreftable{$thisfile}{'(definitions)'}{'Testing::Xref'}{'&foo'}, 's1001',
'subroutine foo defined at line 1001'
);
is(
$xreftable{$thisfile}{'(definitions)'}{'Testing::Xref'}{'&bar'}, 's1002',
'subroutine bar defined at line 1002'
);
is(
$xreftable{$thisfile}{'Testing::Xref::bar'}{'Testing::Xref'}{'&foo'},
'&1002', 'subroutine foo called at line 1002 by bar'
);
is(
$xreftable{$thisfile}{'Testing::Xref::foo'}{'Testing::Xref'}{'*FOO'},
'1001', 'glob FOO used in subroutine foo'
);
END {
1 while unlink $file;
}
# End of tests.
# Now some stuff to feed B::Xref
# line 1000
package Testing::Xref;
sub foo { print FOO %::xreftable; }
sub bar { print FOO foo; }