Merge branch 'vincent/rvalue_stmt_given' into blead
[p5sagit/p5-mst-13.2.git] / cpan / Module-Build / t / basic.t
CommitLineData
bb4e9162 1#!/usr/bin/perl -w
2
3use strict;
10b84a45 4use lib 't/lib';
613f422f 5use MBTest tests => 58;
bb4e9162 6
613f422f 7blib_load('Module::Build');
738349a8 8
7a827510 9my $tmp = MBTest->tmpdir;
bb4e9162 10
11use DistGen;
12my $dist = DistGen->new( dir => $tmp );
13$dist->regen;
14
738349a8 15$dist->chdir_in;
bb4e9162 16
17#########################
18
19
bb4e9162 20# Test object creation
21{
22 my $mb = Module::Build->new( module_name => $dist->name );
23 ok $mb;
24 is $mb->module_name, $dist->name;
25 is $mb->build_class, 'Module::Build';
26 is $mb->dist_name, $dist->name;
27
28 $mb = Module::Build->new( dist_name => $dist->name, dist_version => 7 );
29 ok $mb;
613f422f 30 ok $mb->module_name; # Set via heuristics
bb4e9162 31 is $mb->dist_name, $dist->name;
32}
33
34# Make sure actions are defined, and known_actions works as class method
35{
36 my %actions = map {$_, 1} Module::Build->known_actions;
37 ok $actions{clean};
38 ok $actions{distdir};
39}
40
41# Test prerequisite checking
42{
43 local @INC = (File::Spec->catdir( $dist->dirname, 'lib' ), @INC);
44 my $flagged = 0;
45 local $SIG{__WARN__} = sub { $flagged = 1 if $_[0] =~ /@{[$dist->name]}/};
46 my $mb = Module::Build->new(
47 module_name => $dist->name,
48 requires => {$dist->name => 0},
49 );
50 ok ! $flagged;
51 ok ! $mb->prereq_failures;
52 $mb->dispatch('realclean');
53 $dist->clean;
54
55 $flagged = 0;
56 $mb = Module::Build->new(
57 module_name => $dist->name,
58 requires => {$dist->name => 3.14159265},
59 );
60 ok $flagged;
61 ok $mb->prereq_failures;
62 ok $mb->prereq_failures->{requires}{$dist->name};
63 is $mb->prereq_failures->{requires}{$dist->name}{have}, 0.01;
64 is $mb->prereq_failures->{requires}{$dist->name}{need}, 3.14159265;
65
66 $mb->dispatch('realclean');
67 $dist->clean;
68
69 # Make sure check_installed_status() works as a class method
70 my $info = Module::Build->check_installed_status('File::Spec', 0);
71 ok $info->{ok};
72 is $info->{have}, $File::Spec::VERSION;
73
74 # Make sure check_installed_status() works with an advanced spec
75 $info = Module::Build->check_installed_status('File::Spec', '> 0');
76 ok $info->{ok};
77
78 # Use 2 lines for this, to avoid a "used only once" warning
79 local $Foo::Module::VERSION;
80 $Foo::Module::VERSION = '1.01_02';
81
82 $info = Module::Build->check_installed_status('Foo::Module', '1.01_02');
83 ok $info->{ok} or diag($info->{message});
84}
85
86{
87 # Make sure the correct warning message is generated when an
88 # optional prereq isn't installed
89 my $flagged = 0;
90 local $SIG{__WARN__} = sub { $flagged = 1 if $_[0] =~ /ModuleBuildNonExistent is not installed/};
91
92 my $mb = Module::Build->new(
93 module_name => $dist->name,
94 recommends => {ModuleBuildNonExistent => 3},
95 );
96 ok $flagged;
97 $dist->clean;
98}
99
100# Test verbosity
101{
102 my $mb = Module::Build->new(module_name => $dist->name);
103
104 $mb->add_to_cleanup('save_out');
105 # Use uc() so we don't confuse the current test output
106 like uc(stdout_of( sub {$mb->dispatch('test', verbose => 1)} )), qr/^OK \d/m;
738349a8 107 like uc(stdout_of( sub {$mb->dispatch('test', verbose => 0)} )), qr/\.\. ?OK/;
bb4e9162 108
109 $mb->dispatch('realclean');
110 $dist->clean;
111}
112
113# Make sure 'config' entries are respected on the command line, and that
114# Getopt::Long specs work as expected.
115{
116 use Config;
7a827510 117 $dist->change_build_pl
118 ({
119 module_name => @{[$dist->name]},
120 license => 'perl',
121 get_options => { foo => {},
122 bar => { type => '+' },
123 bat => { type => '=s' },
124 dee => { type => '=s',
125 default => 'goo'
126 },
127 }
128 });
bb4e9162 129
130 $dist->regen;
131 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'])};
132 is $@, '';
133
134 my $mb = Module::Build->resume;
77e96e88 135 ok $mb->valid_property('config');
136
bb4e9162 137 is $mb->config('cc'), $Config{cc};
138 is $mb->config('foocakes'), 'barcakes';
139
140 # Test args().
141 is $mb->args('foo'), 1;
142 is $mb->args('bar'), 2, 'bar';
143 is $mb->args('bat'), 'hello', 'bat';
144 is $mb->args('gee'), 'whiz';
145 is $mb->args('any'), 'hey';
146 is $mb->args('dee'), 'goo';
147 is $mb->destdir, 'yo';
77e96e88 148 my %runtime = $mb->runtime_params;
7dc9e1b4 149 is_deeply \%runtime,
77e96e88 150 {
151 verbose => 1,
152 destdir => 'yo',
153 use_rcfile => 0,
154 config => { foocakes => 'barcakes' },
155 };
bb4e9162 156
157 ok my $argsref = $mb->args;
158 is $argsref->{foo}, 1;
159 $argsref->{doo} = 'hee';
160 is $mb->args('doo'), 'hee';
161 ok my %args = $mb->args;
162 is $args{foo}, 1;
163
164 # revert test distribution to pristine state because we modified a file
613f422f 165 $dist->regen( clean => 1 );
bb4e9162 166}
167
168# Test author stuff
169{
170 my $mb = Module::Build->new(
171 module_name => $dist->name,
172 dist_author => 'Foo Meister <foo@example.com>',
173 build_class => 'My::Big::Fat::Builder',
174 );
175 ok $mb;
176 ok ref($mb->dist_author), 'dist_author converted to array if simple string';
177 is $mb->dist_author->[0], 'Foo Meister <foo@example.com>';
178 is $mb->build_class, 'My::Big::Fat::Builder';
179}
180
181# Test conversion of shell strings
182{
183 my $mb = Module::Build->new(
184 module_name => $dist->name,
185 dist_author => 'Foo Meister <foo@example.com>',
186 extra_compiler_flags => '-I/foo -I/bar',
187 extra_linker_flags => '-L/foo -L/bar',
188 );
189 ok $mb;
190 is_deeply $mb->extra_compiler_flags, ['-I/foo', '-I/bar'], "Should split shell string into list";
191 is_deeply $mb->extra_linker_flags, ['-L/foo', '-L/bar'], "Should split shell string into list";
c1d8f74e 192
193 # Try again with command-line args
194 eval {Module::Build->run_perl_script('Build.PL', [], ['--extra_compiler_flags', '-I/foo -I/bar',
195 '--extra_linker_flags', '-L/foo -L/bar'])};
196 $mb = Module::Build->resume;
197 ok $mb;
198 is_deeply $mb->extra_compiler_flags, ['-I/foo', '-I/bar'], "Should split shell string into list";
199 is_deeply $mb->extra_linker_flags, ['-L/foo', '-L/bar'], "Should split shell string into list";
bb4e9162 200}
201
23837600 202# Test include_dirs.
203{
204 ok my $mb = Module::Build->new(
205 module_name => $dist->name,
206 include_dirs => [qw(/foo /bar)],
207 );
208 is_deeply $mb->include_dirs, ['/foo', '/bar'], 'Should have include dirs';
209
210 # Try a string.
211 ok $mb = Module::Build->new(
212 module_name => $dist->name,
213 include_dirs => '/foo',
214 );
215 is_deeply $mb->include_dirs, ['/foo'], 'Should have string include dir';
216
217 # Try again with command-line args
218 eval { Module::Build->run_perl_script(
219 'Build.PL', [],
220 ['--include_dirs', '/foo', '--include_dirs', '/bar' ],
221 ) };
222
223 ok $mb = Module::Build->resume;
224 is_deeply $mb->include_dirs, ['/foo', '/bar'], 'Should have include dirs';
225
226 eval { Module::Build->run_perl_script(
227 'Build.PL', [],
228 ['--include_dirs', '/foo' ],
229 ) };
230
231 ok $mb = Module::Build->resume;
232 is_deeply $mb->include_dirs, ['/foo'], 'Should have single include dir';
233}
bb4e9162 234