This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
027393ccca61ef8baa13c76799f407efe6418bc7
[perl5.git] / cpan / ExtUtils-MakeMaker / t / several_authors.t
1 #!/usr/bin/perl -w
2
3 # This is a test checking various aspects of the optional argument
4 # MIN_PERL_VERSION to WriteMakefile.
5
6 BEGIN {
7     unshift @INC, 't/lib';
8 }
9
10 use strict;
11
12 use TieOut;
13 use MakeMaker::Test::Utils;
14 use Config;
15 use ExtUtils::MM;
16 use Test::More
17     !MM->can_run(make()) && $ENV{PERL_CORE} && $Config{'usecrosscompile'}
18     ? (skip_all => "cross-compiling and make not available")
19     : (tests => 19);
20 use File::Path;
21 use File::Temp qw[tempdir];
22
23 use ExtUtils::MakeMaker;
24 my $CM = eval { require CPAN::Meta; };
25
26 my $DIRNAME = 'Multiple-Authors';
27 my %FILES = (
28     'Makefile.PL'   => <<'END',
29 use ExtUtils::MakeMaker;
30 WriteMakefile(
31     NAME             => 'Multiple::Authors',
32     AUTHOR           => ['John Doe <jd@example.com>', 'Jane Doe <jd@example.com>'],
33     VERSION_FROM     => 'lib/Multiple/Authors.pm',
34     PREREQ_PM        => { strict => 0 },
35 );
36 END
37
38     'lib/Multiple/Authors.pm'    => <<'END',
39 package Multiple::Authors;
40
41 $VERSION = 0.05;
42
43 =head1 NAME
44
45 Multiple::Authors - several authors
46
47 =cut
48
49 1;
50 END
51
52 );
53
54 # avoid environment variables interfering with our make runs
55 delete @ENV{qw(LIB MAKEFLAGS PERL_CORE)};
56
57 my $perl     = which_perl();
58 my $make     = make_run();
59 my $makefile = makefile_name();
60
61 chdir 't';
62 perl_lib; # sets $ENV{PERL5LIB} relative to t/
63
64 my $tmpdir = tempdir( DIR => '../t', CLEANUP => 1 );
65 use Cwd; my $cwd = getcwd; END { chdir $cwd } # so File::Temp can cleanup
66 chdir $tmpdir;
67
68 hash2files($DIRNAME, \%FILES);
69 END {
70     ok( chdir(File::Spec->updir), 'leaving dir' );
71     ok( rmtree($DIRNAME), 'teardown' );
72 }
73
74 ok( chdir $DIRNAME, "entering dir $DIRNAME" ) ||
75     diag("chdir failed: $!");
76
77 note "argument verification"; {
78     my $stdout = tie *STDOUT, 'TieOut';
79     ok( $stdout, 'capturing stdout' );
80     my $warnings = '';
81     local $SIG{__WARN__} = sub {
82         $warnings .= join '', @_;
83     };
84
85     eval {
86         WriteMakefile(
87             NAME             => 'Multiple::Authors',
88             AUTHOR           => ['John Doe <jd@example.com>', 'Jane Doe <jd@example.com>'],
89         );
90     };
91     is( $warnings, '', 'arrayref in AUTHOR does not trigger a warning' );
92     is( $@, '',        '  nor a hard failure' );
93
94 }
95
96
97 note "argument verification via CONFIGURE"; {
98     my $stdout = tie *STDOUT, 'TieOut';
99     ok( $stdout, 'capturing stdout' );
100     my $warnings = '';
101     local $SIG{__WARN__} = sub {
102         $warnings .= join '', @_;
103     };
104
105     eval {
106         WriteMakefile(
107             NAME             => 'Multiple::Authors',
108             CONFIGURE => sub {
109                return {AUTHOR => 'John Doe <jd@example.com>',};
110             },
111         );
112     };
113     is( $warnings, '', 'scalar in AUTHOR inside CONFIGURE does not trigger a warning' );
114     is( $@, '',        '  nor a hard failure' );
115
116 }
117
118
119 note "generated files verification"; {
120     unlink $makefile;
121     my @mpl_out = run(qq{$perl Makefile.PL});
122     END { unlink $makefile, makefile_backup() }
123
124     cmp_ok( $?, '==', 0, 'Makefile.PL exiting normally' ) || diag(@mpl_out);
125     ok( -e $makefile, 'Makefile present' );
126 }
127
128
129 note "ppd output"; {
130     my $ppd_file = 'Multiple-Authors.ppd';
131     my @make_out = run(qq{$make ppd});
132     END { unlink $ppd_file }
133
134     cmp_ok( $?, '==', 0,    'Make ppd exiting normally' ) || diag(@make_out);
135
136     my $ppd_html = slurp($ppd_file);
137     ok( defined($ppd_html), '  .ppd file present' );
138
139     like( $ppd_html, qr{John Doe &lt;jd\@example.com&gt;, Jane Doe &lt;jd\@example.com&gt;},
140                             '  .ppd file content good' );
141 }
142
143
144 note "META.yml output"; SKIP: {
145     skip 'Failed to load CPAN::Meta', 5 unless $CM;
146     my $distdir  = 'Multiple-Authors-0.05';
147     $distdir =~ s{\.}{_}g if $Is_VMS;
148
149     my $meta_yml = "$distdir/META.yml";
150     my $meta_json = "$distdir/META.json";
151     my @make_out    = run(qq{$make metafile});
152     END { rmtree $distdir if defined $distdir }
153
154     cmp_ok( $?, '==', 0, 'Make metafile exiting normally' ) || diag(@make_out);
155
156     for my $case (
157         ['META.yml', $meta_yml],
158         ['META.json', $meta_json],
159     ) {
160         my ($label, $meta_name) = @$case;
161         ok(
162           my $obj = eval {
163             CPAN::Meta->load_file($meta_name, {lazy_validation => 0})
164           },
165           "$label validates"
166         );
167         is_deeply( [ $obj->authors ],
168           [
169             q{John Doe <jd@example.com>},
170             q{Jane Doe <jd@example.com>},
171           ],
172           "$label content good"
173         );
174     }
175 }