Add ExtUtils::Miniperl to the list of core modules for all versions >= 5.00504
[p5sagit/p5-mst-13.2.git] / lib / Module / Build / t / moduleinfo.t
CommitLineData
bb4e9162 1#!/usr/bin/perl -w
738349a8 2# -*- mode: cperl; tab-width: 8; indent-tabs-mode: nil; basic-offset: 2 -*-
3# vim:ts=8:sw=2:et:sta:sts=2
bb4e9162 4
5use strict;
6use lib $ENV{PERL_CORE} ? '../lib/Module/Build/t/lib' : 't/lib';
738349a8 7use MBTest tests => 82;
8
9use_ok 'Module::Build::ModuleInfo';
10ensure_blib('Module::Build::ModuleInfo');
bb4e9162 11
7a827510 12my $tmp = MBTest->tmpdir;
bb4e9162 13
14use DistGen;
15my $dist = DistGen->new( dir => $tmp );
16$dist->regen;
17
738349a8 18$dist->chdir_in;
bb4e9162 19
20#########################
21
bb4e9162 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
bb4e9162 202$dist->remove;
203$dist = DistGen->new( dir => $tmp );
204$dist->regen;
738349a8 205$dist->chdir_in;
bb4e9162 206
207
208# Find each package only once
209$dist->change_file( 'lib/Simple.pm', <<'---' );
210package Simple;
211$VERSION = '1.23';
212package Error::Simple;
213$VERSION = '2.34';
214package Simple;
215---
216
217$dist->regen;
218
219$pm_info = Module::Build::ModuleInfo->new_from_file( $file );
220
221my @packages = $pm_info->packages_inside;
222is( @packages, 2, 'record only one occurence of each package' );
223
224
225# Module 'Simple.pm' does not contain package 'Simple';
226# constructor should not complain, no default module name or version
227$dist->change_file( 'lib/Simple.pm', <<'---' );
228package Simple::Not;
229$VERSION = '1.23';
230---
231
232$dist->regen;
233$pm_info = Module::Build::ModuleInfo->new_from_file( $file );
234
235is( $pm_info->name, undef, 'no default package' );
236is( $pm_info->version, undef, 'no version w/o default package' );
237
b3dfda33 238# Module 'Simple.pm' contains an alpha version
239# constructor should report first $VERSION found
240$dist->change_file( 'lib/Simple.pm', <<'---' );
241package Simple;
242$VERSION = '1.23_01';
243$VERSION = eval $VERSION;
244---
245
246$dist->regen;
247$pm_info = Module::Build::ModuleInfo->new_from_file( $file );
248
249is( $pm_info->version, '1.23_01', 'alpha version reported');
250
251# NOTE the following test has be done this way because Test::Builder is
252# too smart for our own good and tries to see if the version object is a
253# dual-var, which breaks with alpha versions:
254# Argument "1.23_0100" isn't numeric in addition (+) at
255# /usr/lib/perl5/5.8.7/Test/Builder.pm line 505.
256
257ok( $pm_info->version > 1.23, 'alpha version greater than non');
bb4e9162 258
259# revert to pristine state
bb4e9162 260$dist->remove;
261$dist = DistGen->new( dir => $tmp );
262$dist->regen;
738349a8 263$dist->chdir_in;
bb4e9162 264
265
266# parse $VERSION lines scripts for package main
267my @scripts = (
268 <<'---', # package main declared
269#!perl -w
270package main;
271$VERSION = '0.01';
272---
273 <<'---', # on first non-comment line, non declared package main
274#!perl -w
275$VERSION = '0.01';
276---
277 <<'---', # after non-comment line
278#!perl -w
279use strict;
280$VERSION = '0.01';
281---
282 <<'---', # 1st declared package
283#!perl -w
284package main;
285$VERSION = '0.01';
286package _private;
287$VERSION = '999';
288---
289 <<'---', # 2nd declared package
290#!perl -w
291package _private;
292$VERSION = '999';
293package main;
294$VERSION = '0.01';
295---
296 <<'---', # split package
297#!perl -w
298package main;
299package _private;
300$VERSION = '999';
301package main;
302$VERSION = '0.01';
303---
304 <<'---', # define 'main' version from other package
305package _private;
306$::VERSION = 0.01;
307$VERSION = '999';
308---
309 <<'---', # define 'main' version from other package
310package _private;
311$VERSION = '999';
312$::VERSION = 0.01;
313---
314);
315
316( $i, $n ) = ( 1, scalar( @scripts ) );
317foreach my $script ( @scripts ) {
318 $dist->change_file( 'bin/simple.plx', $script );
319 $dist->regen;
320 $pm_info = Module::Build::ModuleInfo->new_from_file(
321 File::Spec->catfile( 'bin', 'simple.plx' ) );
322
323 is( $pm_info->version, '0.01', "correct script version ($i of $n)" );
324 $i++;
325}
326
327
328# examine properties of a module: name, pod, etc
329$dist->change_file( 'lib/Simple.pm', <<'---' );
330package Simple;
331$VERSION = '0.01';
332package Simple::Ex;
333$VERSION = '0.02';
334=head1 NAME
335
336Simple - It's easy.
337
338=head1 AUTHOR
339
340Simple Simon
341
342=cut
343---
344$dist->regen;
345
346$pm_info = Module::Build::ModuleInfo->new_from_module(
347 $dist->name, inc => [ 'lib', @INC ] );
348
349is( $pm_info->name, 'Simple', 'found default package' );
bb4e9162 350is( $pm_info->version, '0.01', 'version for default package' );
351
352# got correct version for secondary package
353is( $pm_info->version( 'Simple::Ex' ), '0.02',
354 'version for secondary package' );
355
356my $filename = $pm_info->filename;
357ok( defined( $filename ) && -e $filename,
358 'filename() returns valid path to module file' );
359
360@packages = $pm_info->packages_inside;
361is( @packages, 2, 'found correct number of packages' );
362is( $packages[0], 'Simple', 'packages stored in order found' );
363
364# we can detect presence of pod regardless of whether we are collecting it
365ok( $pm_info->contains_pod, 'contains_pod() succeeds' );
366
367my @pod = $pm_info->pod_inside;
368is_deeply( \@pod, [qw(NAME AUTHOR)], 'found all pod sections' );
369
370is( $pm_info->pod('NONE') , undef,
371 'return undef() if pod section not present' );
372
373is( $pm_info->pod('NAME'), undef,
374 'return undef() if pod section not collected' );
375
376
377# collect_pod
378$pm_info = Module::Build::ModuleInfo->new_from_module(
379 $dist->name, inc => [ 'lib', @INC ], collect_pod => 1 );
380
381my $name = $pm_info->pod('NAME');
382if ( $name ) {
383 $name =~ s/^\s+//;
384 $name =~ s/\s+$//;
385}
386is( $name, q|Simple - It's easy.|, 'collected pod section' );
387
388
0ec9ad96 389{
77e96e88 390 # Make sure processing stops after __DATA__
0ec9ad96 391 $dist->change_file( 'lib/Simple.pm', <<'---' );
392package Simple;
393$VERSION = '0.01';
394__DATA__
395*UNIVERSAL::VERSION = sub {
396 foo();
397};
398---
399 $dist->regen;
400
401 $pm_info = Module::Build::ModuleInfo->new_from_file('lib/Simple.pm');
402 is( $pm_info->name, 'Simple', 'found default package' );
403 is( $pm_info->version, '0.01', 'version for default package' );
404 my @packages = $pm_info->packages_inside;
405 is_deeply(\@packages, ['Simple']);
406}
407
77e96e88 408{
409 # Make sure we handle version.pm $VERSIONs well
410 $dist->change_file( 'lib/Simple.pm', <<'---' );
411package Simple;
7253302f 412$VERSION = version->new('0.60.' . (qw$Revision: 128 $)[1]);
77e96e88 413package Simple::Simon;
7253302f 414$VERSION = version->new('0.61.' . (qw$Revision: 129 $)[1]);
77e96e88 415---
416 $dist->regen;
417
418 $pm_info = Module::Build::ModuleInfo->new_from_file('lib/Simple.pm');
419 is( $pm_info->name, 'Simple', 'found default package' );
8cb289bd 420 is( $pm_info->version, '0.60.128', 'version for default package' );
77e96e88 421 my @packages = $pm_info->packages_inside;
422 is_deeply([sort @packages], ['Simple', 'Simple::Simon']);
8cb289bd 423 is( $pm_info->version('Simple::Simon'), '0.61.129', 'version for embedded package' );
77e96e88 424}
425
0ec9ad96 426
bb4e9162 427# cleanup
bb4e9162 428$dist->remove;