1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
#!/usr/bin/perl -w
# test support for various forms of vstring versions in PREREQ_PM
# Magic for core
BEGIN {
# Always run in t to unify behaviour with core
chdir 't' if -d 't';
}
# Use things from t/lib/
use lib './lib';
use strict;
use warnings;
use TieOut;
use MakeMaker::Test::Utils qw(makefile_name);
use File::Temp qw[tempdir];
use Test::More;
use ExtUtils::MakeMaker;
my $tmpdir = tempdir( DIR => '.', CLEANUP => 1 );
use Cwd; my $cwd = getcwd; END { chdir $cwd } # so File::Temp can cleanup
chdir $tmpdir;
my $UNDEFRE = qr/Undefined requirement .* treated as '0'/;
my $UNPARSABLERE = qr/Unparsable\s+version/;
# [ pkg, version, okwarningRE, descrip, nocmrRE ]
# only supply nocmrRE if want to treat differently when no CMR
my @DATA = (
[ Undef => undef, $UNDEFRE, 'Undef' ],
[ ZeroLength => '', $UNDEFRE, 'Zero-length' ],
[ SemiColon => '0;', $UNPARSABLERE, 'Semi-colon after 0' ],
[ BrokenString => 'nan', $UNPARSABLERE, 'random string' ],
[ Decimal2 => 1.2, qr/^$/, '2-part Decimal' ],
[ Decimal2String => '1.2', qr/^$/, '2-part Decimal String' ],
[ Decimal2Underscore => '1.02_03', qr/^$/, '2-part Underscore String' ],
[ Decimal3String => '1.2.3', qr/^$/, '3-part Decimal String', $UNPARSABLERE ],
[ BareV2String => v1.2, qr/^$/, '2-part bare v-string', $UNPARSABLERE ],
[ BareV3String => v1.2.3, qr/^$/, '3-part bare V-string', $UNPARSABLERE ],
[ V2DecimalString => 'v1.2', qr/^$/, '2-part v-decimal string', $UNPARSABLERE ],
[ V3DecimalString => 'v1.2.3', qr/^$/, '3-part v-Decimal String', $UNPARSABLERE ],
[ RangeString => '>= 5.0, <= 6.0', qr/^$/, 'Version range', $UNPARSABLERE ],
[ Scientific => 0.000005, qr/^$/, 'Scientific Notation' ],
);
plan tests => (1 + (@DATA * 4));
ok my $stdout = tie(*STDOUT, 'TieOut'), 'tie STDOUT';
# fake CMR to test fallback if CMR not present
my $CMR = 'CPAN/Meta/Requirements.pm';
my $CM = 'CPAN/Meta.pm';
$INC{$CMR} = undef;
$INC{$CM} = undef;
run_test(0, @$_) for @DATA;
# now try to load real CMR
delete $INC{$CMR};
delete $INC{$CM};
SKIP: {
skip 'No actual CMR found', 2 * @DATA
unless ExtUtils::MakeMaker::_has_cpan_meta_requirements;
run_test(1, @$_) for @DATA;
}
sub capture_make {
my ($package, $version) = @_ ;
my $warnings = '';
local $SIG{__WARN__} = sub {
$warnings .= join '', @_;
};
local $ExtUtils::MakeMaker::UNDER_CORE = 0;
WriteMakefile(
NAME => 'VString::Test',
PREREQ_PM => { $package , $version }
);
return $warnings;
}
sub makefile_content {
my $file = makefile_name;
open my $fh, '<', $file or return "$file: $!\n";
join q{}, grep { $_ =~ /Fake/i } <$fh>;
}
sub run_test {
my ($gotrealcmr, $pkg, $version, $okwarningRE, $descrip, $nocmrRE) = @_;
local $_;
SKIP: {
skip "No vstring test <5.8", 2
if "$]" < 5.008 && $pkg eq 'BareV2String' && $descrip =~ m!^2-part!;
my $warnings;
eval { $warnings = capture_make("Fake::$pkg" => $version); };
is($@, '', "$descrip not fatal") or skip "$descrip WM failed", 1;
$warnings =~ s#^Warning: prerequisite Fake::$pkg.* not found\.\n##m;
my $re = (!$gotrealcmr && $nocmrRE) ? $nocmrRE : $okwarningRE;
like $warnings, $re, "$descrip handled right";
}
# diag makefile_content();
}
|