The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

use strict;
use warnings;

use Test::More 0.88;
use FindBin 0.05;
use File::Spec::Functions;
use Devel::FindPerl qw(find_perl_interpreter);
use Cwd qw/ abs_path /;

my $PERL  = find_perl_interpreter() || die "can't find perl!\n";
my $MPATH = catfile( $FindBin::Bin, updir(), qw(bin mpath) );
my $path;
my $expected_path;

#
# The mpath script's hashbang line is:
#
#   #!/usr/bin/env perl
#
# This can result in it being run with a different perl than being used to run
# this test. So the path to strict may be different. So we use $^X to run
# mpath with the same perl binary being used to run this test.
# Instead of explicitly using $^X, we use Devel::FindPerl to get the
# path to perl
#
chomp($path = `"$PERL" "$MPATH" strict 2>&1`);

# This test does "use strict", so %INC should include the path where
# strict.pm was found, and module_path should find the same
$expected_path = abs_path($INC{'strict.pm'});
ok($? == 0 && defined($path) && $path eq $expected_path,
   "check 'mpath strict' matches \%INC") || do {
    warn "\n",
         "    \%INC          : $INC{'strict.pm'}\n",
         "    expected_path : $expected_path\n",
         "    module_path   : $path\n",
         "    \$^O           : $^O\n";
};

# module_path() returns undef if module not found in @INC
chomp($path = `"$PERL" "$MPATH" No::Such::Module 2>&1`);
ok($? != 0 && defined($path) && $path eq 'No::Such::Module not found',
   "non-existent module should result in failure");

chomp($path = `"$PERL" "$MPATH" strict warnings 2>&1`);

ok($? == 0, 'exit status is 0');
ok(defined($path), 'path for both strict.pm and warnings.pm are defined');
is($path, abs_path($INC{'strict.pm'}).$/.abs_path($INC{'warnings.pm'}), 'and they match %INC');

chomp($path = `"$PERL" "$MPATH" strict warnings No::Such::Module 2>&1`);

ok($? != 0,        'exit status is not zero');
ok(defined($path), 'path is defined');
is(
    $path,
    abs_path($INC{'strict.pm'}).$/.abs_path($INC{'warnings.pm'})."$/No::Such::Module not found",
    'got expected output'
);

chomp($path = `"$PERL" "$MPATH" --quiet strict warnings No::Such::Module 2>&1`);

ok($? != 0,        'exit status is not zero');
ok(defined($path), 'path is defined');
is(
    $path,
    abs_path($INC{'strict.pm'}).$/.abs_path($INC{'warnings.pm'}),
    "error message should not be printed when the option --quiet is specified"
);

chomp($path = `"$PERL" "$MPATH" --full strict warnings 2>&1`);

ok($? == 0,        'exit status is zero');
ok(defined($path), 'path is defined');
is(
    $path,
    "strict ".abs_path($INC{'strict.pm'})."$/warnings ".abs_path($INC{'warnings.pm'}),
    "module name should be printed right before its path if the option --full is specified"
);

done_testing;