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