4
use Test::More tests => 58;
7
my $Mod_Info_VERSION = '0.24';
9
my @old5lib = defined $ENV{PERL5LIB} ? ($ENV{PERL5LIB}) : ();
10
$ENV{PERL5LIB} = join $Config{path_sep}, 'blib/lib', @old5lib;
12
use_ok('Module::Info');
13
my @expected_subs = qw(
31
die_on_compilation_error
41
can_ok('Module::Info', @expected_subs);
43
my $mod_info = Module::Info->new_from_file('lib/Module/Info.pm');
44
isa_ok($mod_info, 'Module::Info', 'new_from_file');
46
ok( !$mod_info->name, ' has no name' );
47
$mod_info->name('Module::Info');
48
ok( $mod_info->name, ' name set' );
49
is( $mod_info->version, $Mod_Info_VERSION, ' version()' );
50
ok( !$mod_info->inc_dir, ' has no inc_dir' );
51
is( $mod_info->file, File::Spec->rel2abs('lib/Module/Info.pm'),
53
ok( !$mod_info->is_core, ' not a core module' );
56
skip "Only works on 5.6.1 and up.", 8 unless $] >= 5.006001;
58
@expected_subs = map "Module::Info::$_", @expected_subs;
60
my @packages = $mod_info->packages_inside;
61
is( @packages, 1, 'Found a single package inside' );
62
is( $packages[0], 'Module::Info', ' and its what we want' );
64
my %versions = $mod_info->package_versions;
65
is( keys %versions, 1, '1 package with package_versions()');
66
is( $versions{Module::Info}, $Mod_Info_VERSION, 'version is correct');
68
my %subs = $mod_info->subroutines;
69
is( keys %subs, @expected_subs, 'Found all the subroutines' );
70
is_deeply( [sort keys %subs],
71
[sort @expected_subs], ' names' );
73
my @mods = $mod_info->modules_used;
74
is( @mods, 6, 'Found all modules used' );
75
is_deeply( [sort @mods], [sort qw(strict File::Spec Config
76
Carp IPC::Open3 vars)],
81
$mod_info = Module::Info->new_from_module('Module::Info');
82
isa_ok($mod_info, 'Module::Info', 'new_from_module');
84
is( $mod_info->name, 'Module::Info', ' name()' );
85
is( $mod_info->version, $Mod_Info_VERSION, ' version()' );
86
is( $mod_info->inc_dir, File::Spec->rel2abs('blib/lib'),
88
is( $mod_info->file, File::Spec->rel2abs('blib/lib/Module/Info.pm'),
90
ok( !$mod_info->is_core, ' not a core module' );
93
# Grab the core version of Text::Soundex and hope it hasn't been
95
@core_inc = map { File::Spec->canonpath($_) }
96
($Config{installarchlib}, $Config{installprivlib});
97
$mod_info = Module::Info->new_from_module('Text::Soundex', @core_inc);
98
is( $mod_info->name, 'Text::Soundex', ' name()' );
100
# dunno what the version will be, 5.004's had none.
102
ok( grep($mod_info->inc_dir eq $_, @core_inc), ' inc_dir()' );
104
File::Spec->catfile( $mod_info->inc_dir, 'Text', 'Soundex.pm' ),
106
ok( $mod_info->is_core, ' core module' );
109
$mod_info = Module::Info->new_from_loaded('Module::Info');
110
isa_ok($mod_info, 'Module::Info', 'new_from_module');
112
is( $mod_info->name, 'Module::Info', ' name()' );
113
is( $mod_info->version, $Mod_Info_VERSION, ' version()' );
114
is( $mod_info->inc_dir, File::Spec->rel2abs('blib/lib'),
116
is( $mod_info->file, File::Spec->rel2abs('blib/lib/Module/Info.pm'),
118
ok( !$mod_info->is_core, ' not a core module' );
121
@modules = Module::Info->all_installed('Module::Info');
122
ok( @modules, 'all_installed() returned something' );
123
ok( !(grep { !defined $_ || !$_->isa('Module::Info') } @modules),
124
" they're all Module::Info objects"
127
# I have no idea how many I'm going to get, so I'll only play with the
128
# first one. It's the current one.
129
$mod_info = $modules[0];
130
isa_ok($mod_info, 'Module::Info', 'all_installed');
132
is( $mod_info->name, 'Module::Info', ' name()' );
133
is( $mod_info->version, $Mod_Info_VERSION, ' version()' );
134
ok( !$mod_info->is_core, ' not a core module' );
137
# Ensure that code refs in @INC are skipped.
138
my @mods = Module::Info->all_installed('Module::Info', (@INC, sub { die }));
139
ok( @modules, 'all_installed() returned something' );
140
ok( !(grep { !defined $_ || !$_->isa('Module::Info') } @modules),
141
" they're all Module::Info objects"
146
skip "Only works on 5.6.1 and up.", 17 unless $] >= 5.006001;
148
my $module = Module::Info->new_from_file('t/lib/Foo.pm');
149
my @packages = $module->packages_inside;
150
is( @packages, 2, 'Found two packages inside' );
151
ok( eq_set(\@packages, [qw(Foo Bar)]), " they're right" );
153
my %versions = $module->package_versions;
154
is( keys %versions, 2, '2 packages with package_versions()');
155
is( $versions{Foo}, '7.254', 'version is correct');
156
is( $versions{Bar}, undef, 'no version present');
158
my %subs = $module->subroutines;
159
is( keys %subs, 2, 'Found two subroutine' );
160
ok( exists $subs{'Foo::wibble'}, ' its right' );
162
my($start, $end) = @{$subs{'Foo::wibble'}}{qw(start end)};
163
print "# start $start, end $end\n";
164
is( $start, 21, ' start line' );
165
is( $end, 22, ' end line' );
167
my @mods = $module->modules_used;
168
is( @mods, 7, 'modules_used' );
169
is_deeply( [sort @mods],
170
[sort qw(strict vars Carp Exporter t/lib/Bar.pm t/lib/Foo.pm lib)] );
172
$module->name('Foo');
173
my @isa = $module->superclasses;
174
is( @isa, 3, 'isa' );
175
is_deeply( [sort @isa], [sort qw(This That What::Ever)] );
177
my @calls = $module->subroutines_called;
180
my @expected_calls = ({
187
line => $startline + 1,
189
type => 'symbolic function',
193
line => $startline + 2,
195
type => 'class method',
199
line => $startline + 3,
201
type => 'object method',
205
line => $startline + 5,
207
type => 'object method',
211
line => $startline + 7,
213
type => 'dynamic class method',
217
line => $startline + 8,
219
type => 'dynamic object method',
223
line => $startline + 9,
225
type => 'dynamic object method',
229
line => $startline + 10,
231
type => 'dynamic class method',
235
line => $startline + 14,
237
type => 'object method',
241
line => $startline + 27,
247
is_deeply(\@calls, \@expected_calls, 'subroutines_called');
248
is_deeply([$module->dynamic_method_calls],
249
[grep $_->{type} =~ /dynamic/, @expected_calls]);
251
$module = Module::Info->new_from_file('t/lib/Bar.pm');
252
@mods = $module->modules_used;
253
is( @mods, 3, 'modules_used with complex BEGIN block' );
254
is_deeply( sort @mods,
255
(sort qw(Cwd Carp strict)) );