xref: /openbsd-src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/vstrings.t (revision eac174f2741a08d8deb8aae59a7f778ef9b5d770)
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