Upgrade to version-0.7203.
[p5sagit/p5-mst-13.2.git] / lib / Module / Build / t / moduleinfo.t
CommitLineData
bb4e9162 1#!/usr/bin/perl -w
2
3use strict;
4use lib $ENV{PERL_CORE} ? '../lib/Module/Build/t/lib' : 't/lib';
77e96e88 5use MBTest tests => 81;
bb4e9162 6
7use Cwd ();
8my $cwd = Cwd::cwd;
9my $tmp = File::Spec->catdir( $cwd, 't', '_tmp' );
10
11use DistGen;
12my $dist = DistGen->new( dir => $tmp );
13$dist->regen;
14
15chdir( $dist->dirname ) or die "Can't chdir to '@{[$dist->dirname]}': $!";
16
17#########################
18
19
20use_ok( 'Module::Build::ModuleInfo' );
21
22# class method C<find_module_by_name>
23my $module = Module::Build::ModuleInfo->find_module_by_name(
24 'Module::Build::ModuleInfo' );
25ok( -e $module, 'find_module_by_name() succeeds' );
26
27
28# fail on invalid module name
29my $pm_info = Module::Build::ModuleInfo->new_from_module(
30 'Foo::Bar', inc => [] );
31ok( !defined( $pm_info ), 'fail if can\'t find module by module name' );
32
33
34# fail on invalid filename
35my $file = File::Spec->catfile( 'Foo', 'Bar.pm' );
36$pm_info = Module::Build::ModuleInfo->new_from_file( $file, inc => [] );
37ok( !defined( $pm_info ), 'fail if can\'t find module by file name' );
38
39
40# construct from module filename
41$file = File::Spec->catfile( 'lib', split( /::/, $dist->name ) ) . '.pm';
42$pm_info = Module::Build::ModuleInfo->new_from_file( $file );
43ok( defined( $pm_info ), 'new_from_file() succeeds' );
44
45# construct from module name, using custom include path
46$pm_info = Module::Build::ModuleInfo->new_from_module(
47 $dist->name, inc => [ 'lib', @INC ] );
48ok( defined( $pm_info ), 'new_from_module() succeeds' );
49
50
51# parse various module $VERSION lines
52my @modules = (
53 <<'---', # declared & defined on same line with 'our'
54package Simple;
55our $VERSION = '1.23';
56---
57 <<'---', # declared & defined on seperate lines with 'our'
58package Simple;
59our $VERSION;
60$VERSION = '1.23';
61---
62 <<'---', # use vars
63package Simple;
64use vars qw( $VERSION );
65$VERSION = '1.23';
66---
67 <<'---', # choose the right default package based on package/file name
68package Simple::_private;
69$VERSION = '0';
70package Simple;
71$VERSION = '1.23'; # this should be chosen for version
72---
73 <<'---', # just read the first $VERSION line
74package Simple;
75$VERSION = '1.23'; # we should see this line
76$VERSION = eval $VERSION; # and ignore this one
77---
78 <<'---', # just read the first $VERSION line in reopened package (1)
79package Simple;
80$VERSION = '1.23';
81package Error::Simple;
82$VERSION = '2.34';
83package Simple;
84---
85 <<'---', # just read the first $VERSION line in reopened package (2)
86package Simple;
87package Error::Simple;
88$VERSION = '2.34';
89package Simple;
90$VERSION = '1.23';
91---
92 <<'---', # mentions another module's $VERSION
93package Simple;
94$VERSION = '1.23';
95if ( $Other::VERSION ) {
96 # whatever
97}
98---
99 <<'---', # mentions another module's $VERSION in a different package
100package Simple;
101$VERSION = '1.23';
102package Simple2;
103if ( $Simple::VERSION ) {
104 # whatever
105}
106---
107 <<'---', # $VERSION checked only in assignments, not regexp ops
108package Simple;
109$VERSION = '1.23';
110if ( $VERSION =~ /1\.23/ ) {
111 # whatever
112}
113---
114 <<'---', # $VERSION checked only in assignments, not relational ops
115package Simple;
116$VERSION = '1.23';
117if ( $VERSION == 3.45 ) {
118 # whatever
119}
120---
121 <<'---', # $VERSION checked only in assignments, not relational ops
122package Simple;
123$VERSION = '1.23';
124package Simple2;
125if ( $Simple::VERSION == 3.45 ) {
126 # whatever
127}
128---
129 <<'---', # Fully qualified $VERSION declared in package
130package Simple;
131$Simple::VERSION = 1.23;
132---
133 <<'---', # Differentiate fully qualified $VERSION in a package
134package Simple;
135$Simple2::VERSION = '999';
136$Simple::VERSION = 1.23;
137---
138 <<'---', # Differentiate fully qualified $VERSION and unqualified
139package Simple;
140$Simple2::VERSION = '999';
141$VERSION = 1.23;
142---
143 <<'---', # $VERSION declared as package variable from within 'main' package
144$Simple::VERSION = '1.23';
145{
146 package Simple;
147 $x = $y, $cats = $dogs;
148}
149---
150 <<'---', # $VERSION wrapped in parens - space inside
151package Simple;
152( $VERSION ) = '1.23';
153---
154 <<'---', # $VERSION wrapped in parens - no space inside
155package Simple;
156($VERSION) = '1.23';
157---
158 <<'---', # $VERSION follows a spurious 'package' in a quoted construct
159package Simple;
160__PACKAGE__->mk_accessors(qw(
161 program socket proc
162 package filename line codeline subroutine finished));
163
164our $VERSION = "1.23";
165---
b3dfda33 166 <<'---', # $VERSION using version.pm
167 package Simple;
168 use version; our $VERSION = version->new('1.23');
169---
170 <<'---', # $VERSION using version.pm and qv()
171 package Simple;
172 use version; our $VERSION = qv('1.230');
173---
77e96e88 174 <<'---', # Two version assignments, should ignore second one
175 $Simple::VERSION = '1.230';
176 $Simple::VERSION = eval $Simple::VERSION;
177---
bb4e9162 178);
179
180my( $i, $n ) = ( 1, scalar( @modules ) );
181foreach my $module ( @modules ) {
182 SKIP: {
183 skip( "No our() support until perl 5.6", 2 )
184 if $] < 5.006 && $module =~ /\bour\b/;
185
186 $dist->change_file( 'lib/Simple.pm', $module );
187 $dist->regen;
188
189 my $warnings = '';
190 local $SIG{__WARN__} = sub { $warnings .= $_ for @_ };
191 my $pm_info = Module::Build::ModuleInfo->new_from_file( $file );
192
0ec9ad96 193 # Test::Builder will prematurely numify objects, so use this form
194 ok( $pm_info->version eq '1.23',
bb4e9162 195 "correct module version ($i of $n)" );
196 is( $warnings, '', 'no warnings from parsing' );
197 $i++;
198 }
199}
200
201# revert to pristine state
202chdir( $cwd ) or die "Can''t chdir to '$cwd': $!";
203$dist->remove;
204$dist = DistGen->new( dir => $tmp );
205$dist->regen;
206chdir( $dist->dirname ) or die "Can't chdir to '@{[$dist->dirname]}': $!";
207
208
209# Find each package only once
210$dist->change_file( 'lib/Simple.pm', <<'---' );
211package Simple;
212$VERSION = '1.23';
213package Error::Simple;
214$VERSION = '2.34';
215package Simple;
216---
217
218$dist->regen;
219
220$pm_info = Module::Build::ModuleInfo->new_from_file( $file );
221
222my @packages = $pm_info->packages_inside;
223is( @packages, 2, 'record only one occurence of each package' );
224
225
226# Module 'Simple.pm' does not contain package 'Simple';
227# constructor should not complain, no default module name or version
228$dist->change_file( 'lib/Simple.pm', <<'---' );
229package Simple::Not;
230$VERSION = '1.23';
231---
232
233$dist->regen;
234$pm_info = Module::Build::ModuleInfo->new_from_file( $file );
235
236is( $pm_info->name, undef, 'no default package' );
237is( $pm_info->version, undef, 'no version w/o default package' );
238
b3dfda33 239# Module 'Simple.pm' contains an alpha version
240# constructor should report first $VERSION found
241$dist->change_file( 'lib/Simple.pm', <<'---' );
242package Simple;
243$VERSION = '1.23_01';
244$VERSION = eval $VERSION;
245---
246
247$dist->regen;
248$pm_info = Module::Build::ModuleInfo->new_from_file( $file );
249
250is( $pm_info->version, '1.23_01', 'alpha version reported');
251
252# NOTE the following test has be done this way because Test::Builder is
253# too smart for our own good and tries to see if the version object is a
254# dual-var, which breaks with alpha versions:
255# Argument "1.23_0100" isn't numeric in addition (+) at
256# /usr/lib/perl5/5.8.7/Test/Builder.pm line 505.
257
258ok( $pm_info->version > 1.23, 'alpha version greater than non');
bb4e9162 259
260# revert to pristine state
261chdir( $cwd ) or die "Can''t chdir to '$cwd': $!";
262$dist->remove;
263$dist = DistGen->new( dir => $tmp );
264$dist->regen;
265chdir( $dist->dirname ) or die "Can't chdir to '@{[$dist->dirname]}': $!";
266
267
268# parse $VERSION lines scripts for package main
269my @scripts = (
270 <<'---', # package main declared
271#!perl -w
272package main;
273$VERSION = '0.01';
274---
275 <<'---', # on first non-comment line, non declared package main
276#!perl -w
277$VERSION = '0.01';
278---
279 <<'---', # after non-comment line
280#!perl -w
281use strict;
282$VERSION = '0.01';
283---
284 <<'---', # 1st declared package
285#!perl -w
286package main;
287$VERSION = '0.01';
288package _private;
289$VERSION = '999';
290---
291 <<'---', # 2nd declared package
292#!perl -w
293package _private;
294$VERSION = '999';
295package main;
296$VERSION = '0.01';
297---
298 <<'---', # split package
299#!perl -w
300package main;
301package _private;
302$VERSION = '999';
303package main;
304$VERSION = '0.01';
305---
306 <<'---', # define 'main' version from other package
307package _private;
308$::VERSION = 0.01;
309$VERSION = '999';
310---
311 <<'---', # define 'main' version from other package
312package _private;
313$VERSION = '999';
314$::VERSION = 0.01;
315---
316);
317
318( $i, $n ) = ( 1, scalar( @scripts ) );
319foreach my $script ( @scripts ) {
320 $dist->change_file( 'bin/simple.plx', $script );
321 $dist->regen;
322 $pm_info = Module::Build::ModuleInfo->new_from_file(
323 File::Spec->catfile( 'bin', 'simple.plx' ) );
324
325 is( $pm_info->version, '0.01', "correct script version ($i of $n)" );
326 $i++;
327}
328
329
330# examine properties of a module: name, pod, etc
331$dist->change_file( 'lib/Simple.pm', <<'---' );
332package Simple;
333$VERSION = '0.01';
334package Simple::Ex;
335$VERSION = '0.02';
336=head1 NAME
337
338Simple - It's easy.
339
340=head1 AUTHOR
341
342Simple Simon
343
344=cut
345---
346$dist->regen;
347
348$pm_info = Module::Build::ModuleInfo->new_from_module(
349 $dist->name, inc => [ 'lib', @INC ] );
350
351is( $pm_info->name, 'Simple', 'found default package' );
bb4e9162 352is( $pm_info->version, '0.01', 'version for default package' );
353
354# got correct version for secondary package
355is( $pm_info->version( 'Simple::Ex' ), '0.02',
356 'version for secondary package' );
357
358my $filename = $pm_info->filename;
359ok( defined( $filename ) && -e $filename,
360 'filename() returns valid path to module file' );
361
362@packages = $pm_info->packages_inside;
363is( @packages, 2, 'found correct number of packages' );
364is( $packages[0], 'Simple', 'packages stored in order found' );
365
366# we can detect presence of pod regardless of whether we are collecting it
367ok( $pm_info->contains_pod, 'contains_pod() succeeds' );
368
369my @pod = $pm_info->pod_inside;
370is_deeply( \@pod, [qw(NAME AUTHOR)], 'found all pod sections' );
371
372is( $pm_info->pod('NONE') , undef,
373 'return undef() if pod section not present' );
374
375is( $pm_info->pod('NAME'), undef,
376 'return undef() if pod section not collected' );
377
378
379# collect_pod
380$pm_info = Module::Build::ModuleInfo->new_from_module(
381 $dist->name, inc => [ 'lib', @INC ], collect_pod => 1 );
382
383my $name = $pm_info->pod('NAME');
384if ( $name ) {
385 $name =~ s/^\s+//;
386 $name =~ s/\s+$//;
387}
388is( $name, q|Simple - It's easy.|, 'collected pod section' );
389
390
0ec9ad96 391{
77e96e88 392 # Make sure processing stops after __DATA__
0ec9ad96 393 $dist->change_file( 'lib/Simple.pm', <<'---' );
394package Simple;
395$VERSION = '0.01';
396__DATA__
397*UNIVERSAL::VERSION = sub {
398 foo();
399};
400---
401 $dist->regen;
402
403 $pm_info = Module::Build::ModuleInfo->new_from_file('lib/Simple.pm');
404 is( $pm_info->name, 'Simple', 'found default package' );
405 is( $pm_info->version, '0.01', 'version for default package' );
406 my @packages = $pm_info->packages_inside;
407 is_deeply(\@packages, ['Simple']);
408}
409
77e96e88 410{
411 # Make sure we handle version.pm $VERSIONs well
412 $dist->change_file( 'lib/Simple.pm', <<'---' );
413package Simple;
7253302f 414$VERSION = version->new('0.60.' . (qw$Revision: 128 $)[1]);
77e96e88 415package Simple::Simon;
7253302f 416$VERSION = version->new('0.61.' . (qw$Revision: 129 $)[1]);
77e96e88 417---
418 $dist->regen;
419
420 $pm_info = Module::Build::ModuleInfo->new_from_file('lib/Simple.pm');
421 is( $pm_info->name, 'Simple', 'found default package' );
8cb289bd 422 is( $pm_info->version, '0.60.128', 'version for default package' );
77e96e88 423 my @packages = $pm_info->packages_inside;
424 is_deeply([sort @packages], ['Simple', 'Simple::Simon']);
8cb289bd 425 is( $pm_info->version('Simple::Simon'), '0.61.129', 'version for embedded package' );
77e96e88 426}
427
0ec9ad96 428
bb4e9162 429# cleanup
0ec9ad96 430chdir( $cwd ) or die "Can't chdir to '$cwd': $!";
bb4e9162 431$dist->remove;
432
433use File::Path;
434rmtree( $tmp );