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

use strict;
use warnings;

use Test::More tests => 12;

use lib 't/lib';

use Test::MyCmd;

my $cmd = Test::MyCmd->new;

isa_ok($cmd, 'Test::MyCmd');

is_deeply(
  [ sort $cmd->command_names ],
  [ sort qw(help --help -h -? commands frob frobulate justusage stock bark) ],
  "got correct list of registered command names",
);

use Data::Dumper;
Dumper $cmd->command_plugins;
is_deeply(
  [ sort $cmd->command_plugins ],
  [ qw(
    App::Cmd::Command::commands
    App::Cmd::Command::help
    Test::MyCmd::Command::bark
    Test::MyCmd::Command::frobulate
    Test::MyCmd::Command::justusage
    Test::MyCmd::Command::stock
  ) ],
  "got correct list of registered command plugins",
);

{
  local @ARGV = qw(frob --widget wname your fat face);
  eval { $cmd->run };
  
  is(
    $@,
    "the widget name is wname - your fat face\n",
    "command died with the correct string",
  );
}

{
  local $TODO = "usage not yet supported";
  local @ARGV = qw(justusage);
  eval { $cmd->run };

  my $error = $@;
  
  like(
    $error,
    qr/^basic.t justusage/,
    "default usage_desc is okay",
  );
}

{
  local @ARGV = qw(stock);
  eval { $cmd->run };
  
  like($@, qr/mandatory method/, "un-subclassed &run leads to death");
}

{
  local @ARGV = qw(bark);
  eval { $cmd->run };
  
  like(
    $@,
    qr/Required option missing: wow/, 
    "required option fileld is missing",
  );
}

SKIP: {
  my $have_TO = eval { require Test::Output; 1; };
  print STDERR $@;
  skip "these tests require Test::Output", 5 unless $have_TO;

  local @ARGV = qw(commands);

  my ($output) = Test::Output::output_from(sub { $cmd->run });

  for my $name (qw(commands frobulate justusage stock bark)) {
    like($output, qr/^\s+\Q$name\E/sm, "$name plugin in listing");
  }
}