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