#!/usr/bin/perl -w
use
lib
$ENV
{PERL_CORE} ?
'../lib/Module/Build/t/lib'
:
't/lib'
;
use_ok
'Module::Build::ModuleInfo'
;
ensure_blib(
'Module::Build::ModuleInfo'
);
my
$tmp
= MBTest->tmpdir;
my
$dist
= DistGen->new(
dir
=>
$tmp
);
$dist
->regen;
$dist
->chdir_in;
my
$module
= Module::Build::ModuleInfo->find_module_by_name(
'Module::Build::ModuleInfo'
);
ok( -e
$module
,
'find_module_by_name() succeeds'
);
my
$pm_info
= Module::Build::ModuleInfo->new_from_module(
'Foo::Bar'
,
inc
=> [] );
ok( !
defined
(
$pm_info
),
'fail if can\'t find module by module name'
);
my
$file
= File::Spec->catfile(
'Foo'
,
'Bar.pm'
);
$pm_info
= Module::Build::ModuleInfo->new_from_file(
$file
,
inc
=> [] );
ok( !
defined
(
$pm_info
),
'fail if can\'t find module by file name'
);
$file
= File::Spec->catfile(
'lib'
,
split
( /::/,
$dist
->name ) ) .
'.pm'
;
$pm_info
= Module::Build::ModuleInfo->new_from_file(
$file
);
ok(
defined
(
$pm_info
),
'new_from_file() succeeds'
);
$pm_info
= Module::Build::ModuleInfo->new_from_module(
$dist
->name,
inc
=> [
'lib'
,
@INC
] );
ok(
defined
(
$pm_info
),
'new_from_module() succeeds'
);
my
@modules
= (
<<'---', # declared & defined on same line with 'our'
package Simple;
our $VERSION = '1.23';
---
<<'---', # declared & defined on seperate lines with 'our'
package Simple;
our $VERSION;
$VERSION = '1.23';
---
<<'---', # use vars
package Simple;
use vars qw( $VERSION );
$VERSION = '1.23';
---
<<'---', # choose the right default package based on package/file name
package Simple::_private;
$VERSION = '0';
package Simple;
$VERSION = '1.23'; # this should be chosen for version
---
<<'---', # just read the first $VERSION line
package Simple;
$VERSION = '1.23'; # we should see this line
$VERSION = eval $VERSION; # and ignore this one
---
<<'---', # just read the first $VERSION line in reopened package (1)
package Simple;
$VERSION = '1.23';
package Error::Simple;
$VERSION = '2.34';
package Simple;
---
<<'---', # just read the first $VERSION line in reopened package (2)
package Simple;
package Error::Simple;
$VERSION = '2.34';
package Simple;
$VERSION = '1.23';
---
<<'---', # mentions another module's $VERSION
package Simple;
$VERSION = '1.23';
if ( $Other::VERSION ) {
# whatever
}
---
<<'---', # mentions another module's $VERSION in a different package
package Simple;
$VERSION = '1.23';
package Simple2;
if ( $Simple::VERSION ) {
# whatever
}
---
<<'---', # $VERSION checked only in assignments, not regexp ops
package Simple;
$VERSION = '1.23';
if ( $VERSION =~ /1\.23/ ) {
# whatever
}
---
<<'---', # $VERSION checked only in assignments, not relational ops
package Simple;
$VERSION = '1.23';
if ( $VERSION == 3.45 ) {
# whatever
}
---
<<'---', # $VERSION checked only in assignments, not relational ops
package Simple;
$VERSION = '1.23';
package Simple2;
if ( $Simple::VERSION == 3.45 ) {
# whatever
}
---
<<'---', # Fully qualified $VERSION declared in package
package Simple;
$Simple::VERSION = 1.23;
---
<<'---', # Differentiate fully qualified $VERSION in a package
package Simple;
$Simple2::VERSION = '999';
$Simple::VERSION = 1.23;
---
<<'---', # Differentiate fully qualified $VERSION and unqualified
package Simple;
$Simple2::VERSION = '999';
$VERSION = 1.23;
---
<<'---', # $VERSION declared as package variable from within 'main' package
$Simple::VERSION = '1.23';
{
package Simple;
$x = $y, $cats = $dogs;
}
---
<<'---', # $VERSION wrapped in parens - space inside
package Simple;
( $VERSION ) = '1.23';
---
<<'---', # $VERSION wrapped in parens - no space inside
package Simple;
($VERSION) = '1.23';
---
<<'---', # $VERSION follows a spurious 'package' in a quoted construct
package Simple;
__PACKAGE__->mk_accessors(qw(
program socket proc
package filename line codeline subroutine finished));
our $VERSION = "1.23";
---
<<'---', # $VERSION using version.pm
package Simple;
use version; our $VERSION = version->new('1.23');
---
<<'---', # $VERSION using version.pm and qv()
package Simple;
use version; our $VERSION = qv('1.230');
---
<<'---', # Two version assignments, should ignore second one
$Simple::VERSION = '1.230';
$Simple::VERSION = eval $Simple::VERSION;
---
);
my
(
$i
,
$n
) = ( 1,
scalar
(
@modules
) );
foreach
my
$module
(
@modules
) {
SKIP: {
skip(
"No our() support until perl 5.6"
, 2 )
if
$] < 5.006 &&
$module
=~ /\bour\b/;
$dist
->change_file(
'lib/Simple.pm'
,
$module
);
$dist
->regen;
my
$warnings
=
''
;
local
$SIG
{__WARN__} =
sub
{
$warnings
.=
$_
for
@_
};
my
$pm_info
= Module::Build::ModuleInfo->new_from_file(
$file
);
ok(
$pm_info
->version eq
'1.23'
,
"correct module version ($i of $n)"
);
is(
$warnings
,
''
,
'no warnings from parsing'
);
$i
++;
}
}
$dist
->remove;
$dist
= DistGen->new(
dir
=>
$tmp
);
$dist
->regen;
$dist
->chdir_in;
$dist
->change_file(
'lib/Simple.pm'
,
<<'---' );
package Simple;
$VERSION = '1.23';
package Error::Simple;
$VERSION = '2.34';
package Simple;
---
$dist
->regen;
$pm_info
= Module::Build::ModuleInfo->new_from_file(
$file
);
my
@packages
=
$pm_info
->packages_inside;
is(
@packages
, 2,
'record only one occurence of each package'
);
$dist
->change_file(
'lib/Simple.pm'
,
<<'---' );
package Simple::Not;
$VERSION = '1.23';
---
$dist
->regen;
$pm_info
= Module::Build::ModuleInfo->new_from_file(
$file
);
is(
$pm_info
->name,
undef
,
'no default package'
);
is(
$pm_info
->version,
undef
,
'no version w/o default package'
);
$dist
->change_file(
'lib/Simple.pm'
,
<<'---' );
package Simple;
$VERSION = '1.23_01';
$VERSION = eval $VERSION;
---
$dist
->regen;
$pm_info
= Module::Build::ModuleInfo->new_from_file(
$file
);
is(
$pm_info
->version,
'1.23_01'
,
'alpha version reported'
);
ok(
$pm_info
->version > 1.23,
'alpha version greater than non'
);
$dist
->remove;
$dist
= DistGen->new(
dir
=>
$tmp
);
$dist
->regen;
$dist
->chdir_in;
my
@scripts
= (
<<'---', # package main declared
#!perl -w
package main;
$VERSION = '0.01';
---
<<'---', # on first non-comment line, non declared package main
#!perl -w
$VERSION = '0.01';
---
<<'---', # after non-comment line
#!perl -w
use strict;
$VERSION = '0.01';
---
<<'---', # 1st declared package
#!perl -w
package main;
$VERSION = '0.01';
package _private;
$VERSION = '999';
---
<<'---', # 2nd declared package
#!perl -w
package _private;
$VERSION = '999';
package main;
$VERSION = '0.01';
---
<<'---', # split package
#!perl -w
package main;
package _private;
$VERSION = '999';
package main;
$VERSION = '0.01';
---
<<'---', # define 'main' version from other package
package _private;
$::VERSION = 0.01;
$VERSION = '999';
---
<<'---', # define 'main' version from other package
package _private;
$VERSION = '999';
$::VERSION = 0.01;
---
);
(
$i
,
$n
) = ( 1,
scalar
(
@scripts
) );
foreach
my
$script
(
@scripts
) {
$dist
->change_file(
'bin/simple.plx'
,
$script
);
$dist
->regen;
$pm_info
= Module::Build::ModuleInfo->new_from_file(
File::Spec->catfile(
'bin'
,
'simple.plx'
) );
is(
$pm_info
->version,
'0.01'
,
"correct script version ($i of $n)"
);
$i
++;
}
(
$i
,
$n
) = (1,
scalar
(
@scripts
) - 3);
foreach
my
$script
(
@scripts
[3 ..
$#scripts
]) {
$dist
->change_file(
'bin/simple.plx'
,
$script
);
$dist
->regen;
$pm_info
= Module::Build::ModuleInfo->new_from_file(
File::Spec->catfile(
'bin'
,
'simple.plx'
),
module
=>
'_private'
,
);
is(
$pm_info
->version,
'999'
,
"correct script version ($i of $n)"
);
$i
++;
}
$dist
->change_file(
'lib/Simple.pm'
,
<<'---' );
package Simple;
$VERSION = '0.01';
package Simple::Ex;
$VERSION = '0.02';
=head1 NAME
Simple - It's easy.
=head1 AUTHOR
Simple Simon
=cut
---
$dist
->regen;
$pm_info
= Module::Build::ModuleInfo->new_from_module(
$dist
->name,
inc
=> [
'lib'
,
@INC
] );
is(
$pm_info
->name,
'Simple'
,
'found default package'
);
is(
$pm_info
->version,
'0.01'
,
'version for default package'
);
is(
$pm_info
->version(
'Simple::Ex'
),
'0.02'
,
'version for secondary package'
);
my
$filename
=
$pm_info
->filename;
ok(
defined
(
$filename
) && -e
$filename
,
'filename() returns valid path to module file'
);
@packages
=
$pm_info
->packages_inside;
is(
@packages
, 2,
'found correct number of packages'
);
is(
$packages
[0],
'Simple'
,
'packages stored in order found'
);
ok(
$pm_info
->contains_pod,
'contains_pod() succeeds'
);
my
@pod
=
$pm_info
->pod_inside;
is_deeply( \
@pod
, [
qw(NAME AUTHOR)
],
'found all pod sections'
);
is(
$pm_info
->pod(
'NONE'
) ,
undef
,
'return undef() if pod section not present'
);
is(
$pm_info
->pod(
'NAME'
),
undef
,
'return undef() if pod section not collected'
);
$pm_info
= Module::Build::ModuleInfo->new_from_module(
$dist
->name,
inc
=> [
'lib'
,
@INC
],
collect_pod
=> 1 );
my
$name
=
$pm_info
->pod(
'NAME'
);
if
(
$name
) {
$name
=~ s/^\s+//;
$name
=~ s/\s+$//;
}
is(
$name
,
q|Simple - It's easy.|
, 'collected pod section' );
{
$dist
->change_file(
'lib/Simple.pm'
,
<<'---' );
package Simple;
$VERSION = '0.01';
__DATA__
*UNIVERSAL::VERSION = sub {
foo();
};
---
$dist
->regen;
$pm_info
= Module::Build::ModuleInfo->new_from_file(
'lib/Simple.pm'
);
is(
$pm_info
->name,
'Simple'
,
'found default package'
);
is(
$pm_info
->version,
'0.01'
,
'version for default package'
);
my
@packages
=
$pm_info
->packages_inside;
is_deeply(\
@packages
, [
'Simple'
]);
}
{
$dist
->change_file(
'lib/Simple.pm'
,
<<'---' );
package Simple;
$VERSION = version->new('0.60.' . (qw$Revision: 128 $)[1]);
package Simple::Simon;
$VERSION = version->new('0.61.' . (qw$Revision: 129 $)[1]);
---
$dist
->regen;
$pm_info
= Module::Build::ModuleInfo->new_from_file(
'lib/Simple.pm'
);
is(
$pm_info
->name,
'Simple'
,
'found default package'
);
is(
$pm_info
->version,
'0.60.128'
,
'version for default package'
);
my
@packages
=
$pm_info
->packages_inside;
is_deeply([
sort
@packages
], [
'Simple'
,
'Simple::Simon'
]);
is(
$pm_info
->version(
'Simple::Simon'
),
'0.61.129'
,
'version for embedded package'
);
}
$dist
->remove;