1b8851fccSafresh1#!/usr/bin/perl -w 2b8851fccSafresh1 3b8851fccSafresh1# test support for various forms of vstring versions in PREREQ_PM 4b8851fccSafresh1 5b8851fccSafresh1# Magic for core 6b8851fccSafresh1BEGIN { 7b8851fccSafresh1 # Always run in t to unify behaviour with core 8b8851fccSafresh1 chdir 't' if -d 't'; 9b8851fccSafresh1} 10b8851fccSafresh1 11b8851fccSafresh1# Use things from t/lib/ 12b8851fccSafresh1use lib './lib'; 13b8851fccSafresh1use strict; 14b8851fccSafresh1use warnings; 15b8851fccSafresh1use TieOut; 16b8851fccSafresh1use MakeMaker::Test::Utils qw(makefile_name); 17b8851fccSafresh1use File::Temp qw[tempdir]; 18b8851fccSafresh1use Test::More; 19b8851fccSafresh1 205759b3d2Safresh1use ExtUtils::MakeMaker; 215759b3d2Safresh1 22b8851fccSafresh1my $tmpdir = tempdir( DIR => '.', CLEANUP => 1 ); 235759b3d2Safresh1use Cwd; my $cwd = getcwd; END { chdir $cwd } # so File::Temp can cleanup 24b8851fccSafresh1chdir $tmpdir; 25b8851fccSafresh1 265759b3d2Safresh1my $UNDEFRE = qr/Undefined requirement .* treated as '0'/; 275759b3d2Safresh1my $UNPARSABLERE = qr/Unparsable\s+version/; 285759b3d2Safresh1# [ pkg, version, okwarningRE, descrip, nocmrRE ] 295759b3d2Safresh1# only supply nocmrRE if want to treat differently when no CMR 305759b3d2Safresh1my @DATA = ( 315759b3d2Safresh1 [ Undef => undef, $UNDEFRE, 'Undef' ], 325759b3d2Safresh1 [ ZeroLength => '', $UNDEFRE, 'Zero-length' ], 335759b3d2Safresh1 [ SemiColon => '0;', $UNPARSABLERE, 'Semi-colon after 0' ], 345759b3d2Safresh1 [ BrokenString => 'nan', $UNPARSABLERE, 'random string' ], 355759b3d2Safresh1 [ Decimal2 => 1.2, qr/^$/, '2-part Decimal' ], 365759b3d2Safresh1 [ Decimal2String => '1.2', qr/^$/, '2-part Decimal String' ], 375759b3d2Safresh1 [ Decimal2Underscore => '1.02_03', qr/^$/, '2-part Underscore String' ], 385759b3d2Safresh1 [ Decimal3String => '1.2.3', qr/^$/, '3-part Decimal String', $UNPARSABLERE ], 395759b3d2Safresh1 [ BareV2String => v1.2, qr/^$/, '2-part bare v-string', $UNPARSABLERE ], 405759b3d2Safresh1 [ BareV3String => v1.2.3, qr/^$/, '3-part bare V-string', $UNPARSABLERE ], 415759b3d2Safresh1 [ V2DecimalString => 'v1.2', qr/^$/, '2-part v-decimal string', $UNPARSABLERE ], 425759b3d2Safresh1 [ V3DecimalString => 'v1.2.3', qr/^$/, '3-part v-Decimal String', $UNPARSABLERE ], 435759b3d2Safresh1 [ RangeString => '>= 5.0, <= 6.0', qr/^$/, 'Version range', $UNPARSABLERE ], 445759b3d2Safresh1 [ Scientific => 0.000005, qr/^$/, 'Scientific Notation' ], 455759b3d2Safresh1); 465759b3d2Safresh1 475759b3d2Safresh1plan tests => (1 + (@DATA * 4)); 485759b3d2Safresh1 495759b3d2Safresh1ok my $stdout = tie(*STDOUT, 'TieOut'), 'tie STDOUT'; 505759b3d2Safresh1 515759b3d2Safresh1# fake CMR to test fallback if CMR not present 525759b3d2Safresh1my $CMR = 'CPAN/Meta/Requirements.pm'; 535759b3d2Safresh1my $CM = 'CPAN/Meta.pm'; 545759b3d2Safresh1$INC{$CMR} = undef; 555759b3d2Safresh1$INC{$CM} = undef; 565759b3d2Safresh1run_test(0, @$_) for @DATA; 575759b3d2Safresh1 585759b3d2Safresh1# now try to load real CMR 595759b3d2Safresh1delete $INC{$CMR}; 605759b3d2Safresh1delete $INC{$CM}; 615759b3d2Safresh1SKIP: { 625759b3d2Safresh1 skip 'No actual CMR found', 2 * @DATA 635759b3d2Safresh1 unless ExtUtils::MakeMaker::_has_cpan_meta_requirements; 645759b3d2Safresh1 run_test(1, @$_) for @DATA; 655759b3d2Safresh1} 665759b3d2Safresh1 67b8851fccSafresh1sub capture_make { 68b8851fccSafresh1 my ($package, $version) = @_ ; 69b8851fccSafresh1 70b8851fccSafresh1 my $warnings = ''; 71b8851fccSafresh1 local $SIG{__WARN__} = sub { 72b8851fccSafresh1 $warnings .= join '', @_; 73b8851fccSafresh1 }; 74b8851fccSafresh1 75b8851fccSafresh1 local $ExtUtils::MakeMaker::UNDER_CORE = 0; 76b8851fccSafresh1 77b8851fccSafresh1 WriteMakefile( 78b8851fccSafresh1 NAME => 'VString::Test', 79b8851fccSafresh1 PREREQ_PM => { $package , $version } 80b8851fccSafresh1 ); 81b8851fccSafresh1 82b8851fccSafresh1 return $warnings; 83b8851fccSafresh1} 84b8851fccSafresh1 85b8851fccSafresh1sub makefile_content { 865759b3d2Safresh1 my $file = makefile_name; 875759b3d2Safresh1 open my $fh, '<', $file or return "$file: $!\n"; 885759b3d2Safresh1 join q{}, grep { $_ =~ /Fake/i } <$fh>; 89b8851fccSafresh1} 90b8851fccSafresh1 915759b3d2Safresh1sub run_test { 925759b3d2Safresh1 my ($gotrealcmr, $pkg, $version, $okwarningRE, $descrip, $nocmrRE) = @_; 935759b3d2Safresh1 local $_; 945759b3d2Safresh1 SKIP: { 955759b3d2Safresh1 skip "No vstring test <5.8", 2 96*eac174f2Safresh1 if "$]" <= 5.008 && $pkg eq 'BareV2String' && $descrip =~ m!^2-part!; 975759b3d2Safresh1 my $warnings; 985759b3d2Safresh1 eval { $warnings = capture_make("Fake::$pkg" => $version); }; 995759b3d2Safresh1 is($@, '', "$descrip not fatal") or skip "$descrip WM failed", 1; 1005759b3d2Safresh1 $warnings =~ s#^Warning: prerequisite Fake::$pkg.* not found\.\n##m; 1015759b3d2Safresh1 my $re = (!$gotrealcmr && $nocmrRE) ? $nocmrRE : $okwarningRE; 1025759b3d2Safresh1 like $warnings, $re, "$descrip handled right"; 103b8851fccSafresh1 } 1045759b3d2Safresh1# diag makefile_content(); 105b8851fccSafresh1} 106