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

use strict;

use Carp;
use File::Spec;
use Test::More tests => 15;

%ENV = (); # required for running under -T

my $result;
my $rootdir = findup('Makefile.PL');
my $testapp = "perl -I$rootdir/lib " . File::Spec->catfile($rootdir, 't', 'test-app');
my $fail_str = 'FAILED';

# Test that insufficient mandatory args result in failure
isnt(system( "$testapp     >/dev/null" ), 0, 'Running with no params fails');
isnt(system( "$testapp a   >/dev/null" ), 0, 'Running with 1 param fails');
isnt(system( "$testapp a b >/dev/null" ), 0, 'Running with 2 params fails');

# Testing params
ok(qx( $testapp a b c )   eq 'a|b|c|-|-|-|-|-|', 'Running with 3 params succeeds');
ok(qx( $testapp a b c d ) eq 'a|b,c|d|-|-|-|-|-|', 'Running with 4 params succeeds');

# Testing options
ok(qx( $testapp a b c -v )                      eq 'a|b|c|1|-|-|-|-|', 'Using -v sets verbose to 1');
ok(qx( $testapp a b c -v -v )                   eq 'a|b|c|2|-|-|-|-|', 'Using -v -v sets verbose to 2');
ok(qx( $testapp a b c --verbose )               eq 'a|b|c|1|-|-|-|-|', 'Using --verbose sets verbose to 1');
ok(qx( $testapp a b c --verbose --verbose )     eq 'a|b|c|2|-|-|-|-|', 'Using --verbose --verbose sets verbose to 2');

ok(qx( $testapp a b c -n alf )                  eq 'a|b|c|-|alf|-|-|-|', 'Using -n alf sets name to alf');
ok(qx( $testapp a b c -n alf -n bob )           eq 'a|b|c|-|alf,bob|-|-|-|', 'Using -n alf -n bob sets name to alf,bob');
ok(qx( $testapp a b c --names alf )             eq 'a|b|c|-|alf|-|-|-|', 'Using --names alf sets name to alf');
ok(qx( $testapp a b c --names alf --names bob ) eq 'a|b|c|-|alf,bob|-|-|-|', 'Using --names alf --names bob sets name to (alf, bob)');

ok(qx( $testapp a b c --foo-bar 3 )             eq 'a|b|c|-|-|3|3|-|', 'Option with hyphen works');

ok(qx( $testapp a b c --ages=f=2 )              eq 'a|b|c|-|-|-|-|f|', 'Option with hyphen works');


sub findup {
    my $file_to_find = shift or croak "Usage: findup(\$FILENAME)";
    my $dir = File::Spec->curdir();
    
    my $found = 0;
    while (!$found) {
        return $dir if -e File::Spec->catfile($dir, $file_to_find);

        my $tmpdir = File::Spec->updir($dir);
        if ($dir eq File::Spec->rootdir() || $dir eq $tmpdir) {
            # no further to go
            croak "$file_to_find not found in path";
        }
        $dir = $tmpdir;
    }
}