The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More;
use Modern::Perl;
use Test::Exception;

{
    package My::Protease;
    use Moose;
    with qw(Bio::ProteaseI);

    sub _cuts {
        my ( $self, $substrate ) = @_;

        if ( $substrate eq 'MAELVIKP' ) { return 1 }
        else                            { return   }
    };

}

my $protease = My::Protease->new;

isa_ok( $protease, 'My::Protease' );

can_ok( $protease, qw(cut is_substrate digest cleavage_sites) );

my $seq = 'AAAAMAELVIKPYYYYYYY';

ok $protease->cut($seq, 8), 'Cut works';
throws_ok { $protease->cut            } qr/Incorrect substrate/;
throws_ok { $protease->cut(42)        } qr/Incorrect substrate/;
throws_ok { $protease->cut('foo')     } qr/Incorrect position/;
throws_ok { $protease->cut('foo', 42) } qr/Incorrect position/;
throws_ok { $protease->cut('foo', -1) } qr/Incorrect position/;

ok $protease->is_substrate($seq);
throws_ok { $protease->is_substrate     } qr/Incorrect substrate/;
throws_ok { $protease->is_substrate(42) } qr/Incorrect substrate/;

is_deeply [$protease->cleavage_sites($seq)], [8];
throws_ok { $protease->cleavage_sites     } qr/Incorrect substrate/;
throws_ok { $protease->cleavage_sites(42) } qr/Incorrect substrate/;

throws_ok { $protease->digest     } qr/Incorrect substrate/;
throws_ok { $protease->digest(42) } qr/Incorrect substrate/;

my @products = $protease->digest( 'AAAAMAELVIKPYYYYYYY' );

is_deeply(
    \@products, ["AAAAMAEL", "VIKPYYYYYYY"],
    "Subclassing works as expected"
);

done_testing();