The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Form::Factory::Test::Interface::CLI;

use Test::Class::Moose;
use Test::More;
use Test::Moose;

with qw( Form::Factory::Test::Interface );

has '+name' => (
    default => 'CLI',
);

has '+interface_options' => (
    default => sub {
        my $self = shift;
        {
            renderer => sub { shift; $self->output(join '', $self->output, @_) },
            get_args => sub { $self->argv },
            get_file => sub { 
                my ($interface, $name) = @_;
                $self->files->{$name};
            },
        } 
    },
);

has output => (
    is        => 'rw',
    isa       => 'Str',
    required  => 1,
    default   => '',
);

has argv => (
    is        => 'rw',
    isa       => 'ArrayRef[Str]',
    required  => 1,
    default   => sub { [] },
);

has files => (
    is        => 'rw',
    isa       => 'HashRef[Str]',
    required  => 1,
    default   => sub { {} },
);

sub render_usage : Tests(7) {
    my $self = shift;
    my $action = $self->interface->new_action('TestApp::Action::EveryControl');

    $action->render;

    my $output = $self->output;
    like($output, qr{--button\s+a button}, 'usage includes button');
    like($output, qr{--checkbox\s+a checkbox}, 
        'usage includes checkbox');
    like($output, qr{--full_text FILE\s+some text},
        'usage includes full_text');
    like($output, qr{--password TEXT\s+a password},
        'usage includes password');
    like($output, qr{--select_many \[ one \| two \| three \| four \| five \]\s+select a few},
        'usage includes select_many');
    like($output, qr{--select_one \[ ay \| bee \| see \| dee \| ee \]\s+pick one},
        'usage include select_one');
    like($output, qr{--text TEXT\s+short text}, 'usage includes text');
};

sub consume_values : Tests(8) {
    my $self = shift;
    my $action = $self->interface->new_action('TestApp::Action::EveryControl');

    $self->argv([ qw(
        --button
        --checkbox
        --full_text   -
        --password    secret
        --select_many one
        --select_many two
        --select_many three
        --select_one  see
        --text        blanket
    ) ]);

    $self->files({
        '-' => "This is a test.\nTesting 1. 2. 3.",
    });

    $action->consume_and_clean_and_check_and_process;

    is($action->content->{button}, 'Foo', 'button is Foo');
    is($action->content->{checkbox}, 'xyz', 'checkbox is xyz');
    is($action->content->{full_text}, "This is a test.\nTesting 1. 2. 3.", 
        'full_text is correct');
    is($action->content->{password}, 'secret', 'password is secret');
    is_deeply($action->content->{select_many}, [ qw( one two three ) ],
        'select_many is one, two, three');
    is($action->content->{select_one}, 'see', 'select_one is see');
    is($action->content->{text}, 'blanket', 'text is blanket');
    is($action->content->{value}, 'galaxy', 'value is galaxy');
};

1;