The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use Digest::Bcrypt ();
use Try::Tiny qw(try catch);

use Test::More tests => 8;

my $secret = "Super Secret Squirrel";
my $salt   = "   known salt   ";

my $ctx = try { return Digest::Bcrypt->new(); } catch { return "Couldn't create object: $!"; };
isa_ok($ctx,'Digest::Bcrypt', 'new: got a proper object');

SKIP: { # test cost
    skip "Couldn't get a Digest::Bcrypt object", 4 unless $ctx;
    my $res;
    $ctx->add($secret);
    $res = try {
        $ctx->cost('foobar');
        $ctx->digest;
    } catch { $_ };
    like $res, qr/Cost must be an integer between 1 and 31/i, 'cost: dies on non-numeric';

    $ctx->reset; $ctx->add($secret);
    $res = try {
        $ctx->cost(32);
        $ctx->digest;
    } catch { $_ };
    like $res, qr/Cost must be an integer between 1 and 31/i, 'cost: dies when greater than 31';

    $ctx->reset; $ctx->add($secret);
    $res = try {
        $ctx->cost(0);
        $ctx->digest;
    } catch { $_ };
    like $res, qr/Cost must be an integer between 1 and 31/i, 'cost: dies when less than 1';

    $ctx->reset; $ctx->add($secret);
    $res = try {
        $ctx->digest;
    } catch { $_ };
    like $res, qr/Cost must be an integer between 1 and 31/i, 'cost: dies when none specified';
}

SKIP: {
    skip "Couldn't get a Digest::Bcrypt object", 3 unless $ctx;
    my $res;
    $ctx->add($secret);
    $res = try {
        $ctx->cost(1);
        $ctx->salt('too small');
        $ctx->digest;
    } catch { $_ };
    like $res, qr/Salt must be exactly 16 octets long/i, 'salt: dies on too small of a salt';

    $ctx->reset; $ctx->add($secret);
    $res = try {
        $ctx->cost(1);
        $ctx->salt();
        $ctx->digest;
    } catch { $_ };
    like $res, qr/Salt must be exactly 16 octets long/i, 'salt: dies without salt';

    $ctx->reset; $ctx->add($secret);
    $res = try {
        $ctx->cost(1);
        $ctx->salt('This is a mighty big salt cannon we have here!');
        $ctx->digest;
    } catch { $_ };
    like $res, qr/Salt must be exactly 16 octets long/i, 'salt: dies when salt too large';
}