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

BEGIN {
    @INC = qw(../win32 ../lib);
    require './test.pl';
    skip_all('FindExt not portable')
	if $^O eq 'VMS';
}
use strict;
use Config;

# Test that Win32/FindExt.pm is consistent with Configure in determining the
# types of extensions.

if ($^O eq "MSWin32" && !defined $ENV{PERL_STATIC_EXT}) {
    skip_all "PERL_STATIC_EXT must be set to the list of static extensions";
}

if ( $Config{usecrosscompile} ) {
  skip_all( "Not all files are available during cross-compilation" );
}

require FindExt;

FindExt::apply_config(\%Config);
FindExt::scan_ext("../$_")
    foreach qw(cpan dist ext);
FindExt::set_static_extensions(split ' ', $^O eq 'MSWin32'
                               ? $ENV{PERL_STATIC_EXT} : $Config{static_ext});

sub compare {
    my ($desc, $want, @have) = @_;
    $want = [sort split ' ', $want]
        unless ref $want eq 'ARRAY';
    local $::Level = $::Level + 1;
    is(scalar @have, scalar @$want, "We find the same number of $desc");
    is("@have", "@$want", "We find the same list of $desc");
}

unless (join (' ', sort split ' ', $Config{extensions})
        eq join(' ', FindExt::extensions())) {
    # There are various things that break our assumptions.
    # If Encode is a static extension, then Configure has special case logic
    # to add Encode/* as static extensions
    # -Uusedl causes Encode to be a static extension, and drops building
    # XS::APItest and XS::Typemap
    # Any use of -Dnoextensions to choose not to build a extension

    plan(tests => 2);
    note("configured extension list doesn't match, so only minimal testing is possible");
    compare('known_extensions', $Config{known_extensions},
            FindExt::known_extensions());
} else {
    # dynamic linking, and all possible extensions for this system were built,
    # so can test everything.
    plan(tests => 12);

    compare('known_extensions', $Config{known_extensions},
            FindExt::known_extensions());

    # Config.pm and FindExt.pm make different choices about what should be built
    my @config_built;
    my @found_built;

    foreach my $type (qw(static dynamic nonxs)) {
        my @this_found = eval "FindExt::${type}_ext()";
        push @found_built, @this_found;
	push @config_built, split ' ', $Config{"${type}_ext"};
        compare("${type}_ext", $Config{"${type}_ext"}, @this_found);
    }

    compare('"config" dynamic + static + nonxs', $Config{extensions},
            sort @config_built);
    compare('"found" dynamic + static + nonxs', [FindExt::extensions()],
            sort @found_built);
}

# ex: set ts=8 sts=4 sw=4 et: