| #!/usr/bin/perl -w |
| |
| use strict; |
| use lib 't/lib'; |
| use MBTest tests => 58; |
| |
| blib_load('Module::Build'); |
| |
| my $tmp = MBTest->tmpdir; |
| |
| use DistGen; |
| my $dist = DistGen->new( dir => $tmp ); |
| $dist->regen; |
| |
| $dist->chdir_in; |
| |
| ######################### |
| |
| |
| # Test object creation |
| { |
| my $mb = Module::Build->new( module_name => $dist->name ); |
| ok $mb; |
| is $mb->module_name, $dist->name; |
| is $mb->build_class, 'Module::Build'; |
| is $mb->dist_name, $dist->name; |
| |
| $mb = Module::Build->new( dist_name => $dist->name, dist_version => 7 ); |
| ok $mb; |
| ok $mb->module_name; # Set via heuristics |
| is $mb->dist_name, $dist->name; |
| } |
| |
| # Make sure actions are defined, and known_actions works as class method |
| { |
| my %actions = map {$_, 1} Module::Build->known_actions; |
| ok $actions{clean}; |
| ok $actions{distdir}; |
| } |
| |
| # Test prerequisite checking |
| { |
| local @INC = (File::Spec->catdir( $dist->dirname, 'lib' ), @INC); |
| my $flagged = 0; |
| local $SIG{__WARN__} = sub { $flagged = 1 if $_[0] =~ /@{[$dist->name]}/}; |
| my $mb = Module::Build->new( |
| module_name => $dist->name, |
| requires => {$dist->name => 0}, |
| ); |
| ok ! $flagged; |
| ok ! $mb->prereq_failures; |
| $mb->dispatch('realclean'); |
| $dist->clean; |
| |
| $flagged = 0; |
| $mb = Module::Build->new( |
| module_name => $dist->name, |
| requires => {$dist->name => 3.14159265}, |
| ); |
| ok $flagged; |
| ok $mb->prereq_failures; |
| ok $mb->prereq_failures->{requires}{$dist->name}; |
| is $mb->prereq_failures->{requires}{$dist->name}{have}, "0.01"; |
| is $mb->prereq_failures->{requires}{$dist->name}{need}, "3.14159265"; |
| |
| $mb->dispatch('realclean'); |
| $dist->clean; |
| |
| # Make sure check_installed_status() works as a class method |
| my $info = Module::Build->check_installed_status('File::Spec', 0); |
| ok $info->{ok}; |
| is $info->{have}, $File::Spec::VERSION; |
| |
| # Make sure check_installed_status() works with an advanced spec |
| $info = Module::Build->check_installed_status('File::Spec', '> 0'); |
| ok $info->{ok}; |
| |
| # Use 2 lines for this, to avoid a "used only once" warning |
| local $Foo::Module::VERSION; |
| $Foo::Module::VERSION = '1.01_02'; |
| |
| $info = Module::Build->check_installed_status('Foo::Module', '1.01_02'); |
| ok $info->{ok} or diag($info->{message}); |
| } |
| |
| { |
| # Make sure the correct warning message is generated when an |
| # optional prereq isn't installed |
| my $flagged = 0; |
| local $SIG{__WARN__} = sub { $flagged = 1 if $_[0] =~ /ModuleBuildNonExistent is not installed/}; |
| |
| my $mb = Module::Build->new( |
| module_name => $dist->name, |
| recommends => {ModuleBuildNonExistent => 3}, |
| ); |
| ok $flagged; |
| $dist->clean; |
| } |
| |
| # Test verbosity |
| { |
| my $mb = Module::Build->new(module_name => $dist->name); |
| |
| $mb->add_to_cleanup('save_out'); |
| # Use uc() so we don't confuse the current test output |
| like uc(stdout_of( sub {$mb->dispatch('test', verbose => 1)} )), qr/^OK \d/m; |
| like uc(stdout_of( sub {$mb->dispatch('test', verbose => 0)} )), qr/\.\. ?OK/; |
| |
| $mb->dispatch('realclean'); |
| $dist->clean; |
| } |
| |
| # Make sure 'config' entries are respected on the command line, and that |
| # Getopt::Long specs work as expected. |
| { |
| use Config; |
| $dist->change_build_pl |
| ({ |
| module_name => @{[$dist->name]}, |
| license => 'perl', |
| get_options => { foo => {}, |
| bar => { type => '+' }, |
| bat => { type => '=s' }, |
| dee => { type => '=s', |
| default => 'goo' |
| }, |
| } |
| }); |
| |
| $dist->regen; |
| eval {Module::Build->run_perl_script('Build.PL', [], ['--nouse-rcfile', '--config', "foocakes=barcakes", '--foo', '--bar', '--bar', '-bat=hello', 'gee=whiz', '--any', 'hey', '--destdir', 'yo', '--verbose', '1'])}; |
| is $@, ''; |
| |
| my $mb = Module::Build->resume; |
| ok $mb->valid_property('config'); |
| |
| is $mb->config('cc'), $Config{cc}; |
| is $mb->config('foocakes'), 'barcakes'; |
| |
| # Test args(). |
| is $mb->args('foo'), 1; |
| is $mb->args('bar'), 2, 'bar'; |
| is $mb->args('bat'), 'hello', 'bat'; |
| is $mb->args('gee'), 'whiz'; |
| is $mb->args('any'), 'hey'; |
| is $mb->args('dee'), 'goo'; |
| is $mb->destdir, 'yo'; |
| my %runtime = $mb->runtime_params; |
| is_deeply \%runtime, |
| { |
| verbose => 1, |
| destdir => 'yo', |
| use_rcfile => 0, |
| config => { foocakes => 'barcakes' }, |
| }; |
| |
| ok my $argsref = $mb->args; |
| is $argsref->{foo}, 1; |
| $argsref->{doo} = 'hee'; |
| is $mb->args('doo'), 'hee'; |
| ok my %args = $mb->args; |
| is $args{foo}, 1; |
| |
| # revert test distribution to pristine state because we modified a file |
| $dist->regen( clean => 1 ); |
| } |
| |
| # Test author stuff |
| { |
| my $mb = Module::Build->new( |
| module_name => $dist->name, |
| dist_author => 'Foo Meister <foo@example.com>', |
| build_class => 'My::Big::Fat::Builder', |
| ); |
| ok $mb; |
| ok ref($mb->dist_author), 'dist_author converted to array if simple string'; |
| is $mb->dist_author->[0], 'Foo Meister <foo@example.com>'; |
| is $mb->build_class, 'My::Big::Fat::Builder'; |
| } |
| |
| # Test conversion of shell strings |
| { |
| my $mb = Module::Build->new( |
| module_name => $dist->name, |
| dist_author => 'Foo Meister <foo@example.com>', |
| extra_compiler_flags => '-I/foo -I/bar', |
| extra_linker_flags => '-L/foo -L/bar', |
| ); |
| ok $mb; |
| is_deeply $mb->extra_compiler_flags, ['-I/foo', '-I/bar'], "Should split shell string into list"; |
| is_deeply $mb->extra_linker_flags, ['-L/foo', '-L/bar'], "Should split shell string into list"; |
| |
| # Try again with command-line args |
| eval {Module::Build->run_perl_script('Build.PL', [], ['--extra_compiler_flags', '-I/foo -I/bar', |
| '--extra_linker_flags', '-L/foo -L/bar'])}; |
| $mb = Module::Build->resume; |
| ok $mb; |
| is_deeply $mb->extra_compiler_flags, ['-I/foo', '-I/bar'], "Should split shell string into list"; |
| is_deeply $mb->extra_linker_flags, ['-L/foo', '-L/bar'], "Should split shell string into list"; |
| } |
| |
| # Test include_dirs. |
| { |
| ok my $mb = Module::Build->new( |
| module_name => $dist->name, |
| include_dirs => [qw(/foo /bar)], |
| ); |
| is_deeply $mb->include_dirs, ['/foo', '/bar'], 'Should have include dirs'; |
| |
| # Try a string. |
| ok $mb = Module::Build->new( |
| module_name => $dist->name, |
| include_dirs => '/foo', |
| ); |
| is_deeply $mb->include_dirs, ['/foo'], 'Should have string include dir'; |
| |
| # Try again with command-line args |
| eval { Module::Build->run_perl_script( |
| 'Build.PL', [], |
| ['--include_dirs', '/foo', '--include_dirs', '/bar' ], |
| ) }; |
| |
| ok $mb = Module::Build->resume; |
| is_deeply $mb->include_dirs, ['/foo', '/bar'], 'Should have include dirs'; |
| |
| eval { Module::Build->run_perl_script( |
| 'Build.PL', [], |
| ['--include_dirs', '/foo' ], |
| ) }; |
| |
| ok $mb = Module::Build->resume; |
| is_deeply $mb->include_dirs, ['/foo'], 'Should have single include dir'; |
| } |
| |