The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl
#
# This file is part of MooX-Options
#
# This software is copyright (c) 2013 by celogeek <me@celogeek.com>.
#
# This is free software; you can redistribute it and/or modify it under
# the same terms as the Perl 5 programming language system itself.
#

use strict;
use warnings;
use Test::More;
use Test::Trap;
use Carp;
use FindBin qw/$RealBin/;
use Try::Tiny;

local $ENV{TEST_FORCE_COLUMN_SIZE} = 78;

{

    package plain;
    use Moo;
    use MooX::Options protect_argv => 0;

    option 'bool' => ( is => 'ro' );

    1;
}
{

    package plain2;
    use Moo;
    use MooX::Options protect_argv => 0, flavour => undef;

    option 'bool' => ( is => 'ro' );

    1;
}

{

    package FlavourTest;
    use Moo;
    use MooX::Options flavour => [qw(pass_through)], protect_argv => 0;

    option 'bool' => ( is => 'ro' );

    1;
}

for my $noflavour (qw/plain plain2/) {
    subtest "unknown option $noflavour" => sub {
        note "Without flavour $noflavour";
        {
            local @ARGV = ('anarg');
            my $plain = $noflavour->new_with_options();
            is_deeply( [@ARGV], ['anarg'], "anarg is left" );
        }
        {
            local @ARGV = ( '--bool', 'anarg' );
            my $plain = $noflavour->new_with_options();
            is( $plain->bool, 1, "bool was set" );
            is_deeply( [@ARGV], ['anarg'], "anarg is left" );
        }
        {
            local @ARGV = ( '--bool', 'anarg', '--unknown_option' );
            my @r = trap { $noflavour->new_with_options() };
            is( $trap->exit, 1, "exit code ok" );
            like(
                $trap->stderr,
                qr/Unknown option: unknown_option/,
                "and a warning from GLD"
            );
            like( $trap->stderr, qr/USAGE:/, "died with usage message" );
        }
    };
}

subtest "flavour" => sub {
    note "With flavour";
    {
        local @ARGV = ('anarg');
        my $flavour_test = FlavourTest->new_with_options();
        is_deeply( [@ARGV], ['anarg'], "anarg is left" );
    }
    {
        local @ARGV = ( '--bool', 'anarg' );
        my $flavour_test = FlavourTest->new_with_options();
        is( $flavour_test->bool, 1, "bool was set" );
        is_deeply( [@ARGV], ['anarg'], "anarg is left" );
    }
    {
        local @ARGV = ( '--bool', 'anarg', '--unknown_option' );
        my $flavour_test = FlavourTest->new_with_options();
        is( $flavour_test->bool, 1, "bool was set" );
        is_deeply(
            [@ARGV],
            [ 'anarg', '--unknown_option' ],
            "anarg and unknown_option are left"
        );
    }
};

done_testing;