The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Git::Class::Test::Role::Error::Basic;

use strict;
use warnings;
use Test::Classy::Base;
use Git::Class::Test::Role::Error;
use Capture::Tiny 'capture';
use Try::Tiny;

sub basic : Tests(5) {
  my $class = shift;

  my $obj = Git::Class::Test::Role::Error->new;

  ok $obj->can('_die_on_error'), $class->message('has _die_on_error accessor');
  ok $obj->can('is_verbose'), $class->message('has is_verbose predicate');
  ok $obj->can('_error'), $class->message('has _error accessor');

  ok !$obj->_die_on_error, $class->message('_die_on_error is false');
  ok !$obj->is_verbose, $class->message('is_verbose is false');
}

sub die_on_error : Tests(4) {
  my $class = shift;

  my $e;
  my $obj = try {
    Git::Class::Test::Role::Error->new(die_on_error => 1);
  } catch { $e = shift };
  ok !$e, $class->message('object is successfully created');
  return $class->abort_this_test('object is not created') if $e;

  ok $obj->_die_on_error, $class->message('init_arg should work');

  undef $e;
  try { $obj->_error('set error') } catch { $e = shift };
  ok $e && $e =~ /set error/, $class->message('error message is correct');

  $obj->_die_on_error(0);
  undef $e;
  my ($out, $err) = capture {
    try { $obj->_error('set error') } catch { $e = shift };
  };
  ok !$e && $err =~ /set error/, $class->message('should not die');
}

sub verbose : Tests(3) {
  my $class = shift;

  my $e;
  my $obj = try {
    Git::Class::Test::Role::Error->new(verbose => 1);
  } catch { $e = shift };
  ok !$e, $class->message('object is successfully created');
  return $class->abort_this_test('object is not created') if $e;
  ok $obj->is_verbose, $class->message('init_arg should work');

  $obj->is_verbose(0);
  ok !$obj->is_verbose, $class->message('can make it quite');
}

1;