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

use 5.010;
use strict;
use warnings;

use Data::Unixish qw(
                       aduxa cduxa fduxa lduxa
                       aduxc cduxc fduxc lduxc
                       aduxf cduxf fduxf lduxf
                       aduxl cduxl fduxl lduxl
                );
use File::Temp qw(tempfile);
use Test::More 0.98;

my $filename;
{
    my $fh;
    ($fh, $filename) = tempfile();
    for ("d", "a", "c", "b") { print $fh "$_\n" }
    close $fh;
}

subtest "a input" => sub {
    is_deeply(  aduxa('sum' , [1, 2, 3, 4, 5]), [15]);
    # aduxf in "f output"
    # aduxc in "c output"
    is_deeply(~~aduxl([lpad => {width=>2, char=>"0"}], [3, 2, 5, 1, 4]) , "03");
};

subtest "a output" => sub {
    # aduxa in "a input"
    # fduxa in "f input"
    # lduxa in "l input"
    ok 1;
};

subtest "l input" => sub {
    is_deeply(  lduxa([lpad => {width=>2, char=>"0"}],  3, 2, 5, 1, 4 ), ["03", "02", "05", "01", "04"]);
    # lduxc in "c output"
    # lduxf in "f output"
    # lduxl in "l output"
};

subtest "l output" => sub {
    # lduxa in "a output"
    # lduxc in "c output"
    is_deeply( [lduxl('sort',  1, 3, 2)],  [1, 2, 3]);
};

subtest "f input" => sub {
    plan skip_all => "fdux* is currently fudged on Windows" if $^O =~ /mswin32/i;
    is_deeply( fduxa('sort', $filename) , [qw/a b c d/]);
    # fduxc in "c output"
    # fduxf in "f output"
    is_deeply([fduxl('sort', $filename)], [qw/a b c d/]);
};

subtest "f output" => sub {
    plan skip_all => "*duxf not available on Windows (no support for open '-|')" if $^O =~ /mswin32/i;
    my (@a, $fh);

    @a = (); $fh = aduxf('sort', [1, 3, 2]); push @a, $_ while <$fh>;
    is_deeply(\@a, ["1\n", "2\n", "3\n"]);

    # cduxf in "c input"

    @a = (); $fh = lduxf('sort', 1, 3, 2); push @a, $_ while <$fh>;
    is_deeply(\@a, ["1\n", "2\n", "3\n"]);

    @a = (); $fh = fduxf('sort', $filename); push @a, $_ while <$fh>;
    is_deeply(\@a, ["a\n", "b\n", "c\n", "d\n"]);
};

subtest "c input" => sub {
    my @in;
    my $icb = sub { if (!@in) { return () } else { return shift(@in) x 2 } };

    @in = (2,3,1); is_deeply(cduxa('sort', $icb), [11,22,33]);

    # cduxc in "c output"

    subtest "cduxf" => sub {
        plan skip_all => "cduxf not available on Windows (no support for open '-|')" if $^O =~ /mswin32/i;
        @in = (2,3,1);
        my (@a, $fh);
        @a = (); $fh = cduxf('sort', $icb); push @a, $_ while <$fh>;
        is_deeply(\@a, ["11\n","22\n","33\n"]);
    };

    @in = (2,3,1); is_deeply([cduxl('sort', $icb)], [11,22,33]);
};

subtest "c output" => sub {
    my @a;

    @a = (); aduxc('sort', sub { push @a, shift }, [1, 3, 2]);
    is_deeply(\@a, [1, 2, 3]);

    @a = (); lduxc('sort', sub { push @a, shift }, 1, 3, 2);
    is_deeply(\@a, [1, 2, 3]);

    my @in = (2,3,1);
    my $icb = sub { if (!@in) { return () } else { return shift(@in) x 2 } };
    @a = (); cduxc('sort', $icb, sub { push @a, shift });
    is_deeply(\@a, [11, 22, 33]);

    subtest fduxc => sub {
        plan skip_all => "fdux* is currently fudged on Windows" if $^O =~ /mswin32/i;
        @a = (); fduxc('sort', sub { push @a, shift }, $filename);
        is_deeply(\@a, [qw/a b c d/]);
    };
};

done_testing;