The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#!/usr/bin/perl -w

use strict;
use Test::More;
use vars '$loaded';

BEGIN { $loaded = eval { require PAR::Dist; 1 } };
BEGIN {
  my $tests = 29;
  if ($loaded) {  
    # skip these tests without YAML loader or without (A::Zip or zipo/unzip)
    $PAR::Dist::DEBUG = 1;
    my $tools = PAR::Dist::_check_tools();
    $PAR::Dist::DEBUG = 0;
    if (not defined $tools->{DumpFile}) {
      plan skip_all => "Skip because no YAML loader/dumper could be found";
      exit();
    }
    elsif (not defined $tools->{zip}) {
      plan skip_all => "Skip because neither Archive::Zip nor zip/unzip could be found";
      exit();
    }
    else {
      plan tests => $tests;
      ok(1);
    }
  }
  else {
    plan tests => $tests;
    ok(0, "Could not load PAR::Dist: $@");
    exit();
  }
}

ok (eval { require PAR::Dist; 1 });

chdir('t') if -d 't';

my @dist = (
  'data/dist1.par',
  'data/dist2.par',
);

my @tmp = map {my $f = $_; $f =~ s/^data\///; $f} @dist;

require File::Copy;
for (0..$#dist) {
  ok(-f $dist[$_]);
  ok(File::Copy::copy($dist[$_], $tmp[$_]));
}

sub cleanup {
  unlink($_) for @tmp;
}
$SIG{INT} = \&cleanup;
$SIG{TERM} = \&cleanup;
END { cleanup(); }

my %provides_expect = (
  "Math::Symbolic::Custom::Transformation" => {
    file => "lib/Math/Symbolic/Custom/Transformation.pm",
    version => "2.01",
  },
  "Math::Symbolic::Custom::Transformation::Group" => {
    file => "lib/Math/Symbolic/Custom/Transformation/Group.pm",
    version => "1.25",
  },
  "Test::Kit" => {
    file => "lib/Test/Kit.pm",
    version => "0.02",
  },
  "Test::Kit::Features" => {
    file => "lib/Test/Kit/Features.pm",
    version => "0.02",
  },
  "Test::Kit::Result" => {
    file => "lib/Test/Kit/Features.pm",
  },
);

my %requires_expect = (
  "Math::Symbolic" => '0.507',
  "Math::Symbolic::Custom::Pattern" => '1.20',
  "base" =>  '2.11',
  "namespace::clean" =>  '0.08',
  "Test::More" => '0',
);

my %build_requires_expect = (
  "Test::More" => '0.1',
  "Test::Differences" => undef,
);

my %recommends_expect = (
  "Test::Pod" => '1.0',
  "Test::Pod::Coverage" => '1.0',
);


PAR::Dist::merge_par(@tmp);

ok(1); # got to this point

my ($y_func) = PAR::Dist::_get_yaml_functions();

my $meta = PAR::Dist::get_meta($tmp[0]);
ok(defined($meta));

my $result = $y_func->{Load}->( $meta );
ok(defined $result);
$result = $result->[0] if ref($result) eq 'ARRAY';

my $provides = $result->{provides};
ok(ref($provides) eq 'HASH');

foreach my $module (keys %provides_expect) {
  ok(ref($provides->{$module}) eq 'HASH');
  my $modhash = $provides->{$module};
  my $exphash = $provides_expect{$module};

  ok($exphash->{file} eq $modhash->{file});
  if (exists $exphash->{version}) {
    ok($exphash->{version} eq $modhash->{version});
  }
  else {
    ok(!exists($modhash->{version}));
  }
}

is_deeply($result->{requires}, \%requires_expect, "requires merged as expected");
is_deeply($result->{build_requires}, \%build_requires_expect, "build_requires merged as expected");
is_deeply($result->{configure_requires}, undef, "configure_requires merged as expected");
is_deeply($result->{recommends}, \%recommends_expect, "recommends merged as expected");

__END__