#!perl

use strict;
use warnings;
use Test::More;
use Test::Deep;
use Test::Fatal;
use App::SuperviseMe;
use IO::String;

subtest 'basic constructor' => sub {
  my $sm;

  is(exception { $sm = App::SuperviseMe->new(cmds => ['a']) },
    undef, 'new() lives with a simple command');
  ok($sm, '... got something back');
  is(ref($sm), 'App::SuperviseMe', '... of the proper type');
  cmp_deeply(
    $sm->{cmds},
    [{cmd => 'a'}],
    '... with the expected command list'
  );

  is(exception { $sm = App::SuperviseMe->new(cmds => ['a', {cmd => 'b'}]) },
    undef, 'new() lives with two commands, one simple, one complex');
  ok($sm, '... got something back');
  is(ref($sm), 'App::SuperviseMe', '... of the proper type');
  cmp_deeply(
    $sm->{cmds},
    [{cmd => 'a'}, {cmd => 'b'}],
    '... with the expected command list'
  );

  like(
    exception { App::SuperviseMe->new(cmds => []) },
    qr{^Missing 'cmds',},
    'new() dies with empty cmds list'
  );
  like(
    exception { App::SuperviseMe->new },
    qr{^Missing 'cmds',},
    'new() dies with no cmds list'
  );
};


subtest 'read commands from STDIN' => sub {
  local *STDIN = my $io = IO::String->new(<<"  EOF");
 x1
   
     # asdasdasd 
      x2 

  EOF
  my $sm = App::SuperviseMe->new_from_options;

  ok($sm, 'Got a SuperviseMe...');
  is(ref($sm), 'App::SuperviseMe', '... of the proper type');
  cmp_deeply(
    $sm->{cmds},
    [{cmd => 'x1',}, {cmd => 'x2',}],
    '... with the expected cmds list'
  );
};


done_testing();
