The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#!/usr/bin/perl

use strict;
use warnings;

use Test::More tests => 8;
use Test::Exception;

{
    package Animal;
    use Moose;
    BEGIN {
        ::use_ok("Moose::Util::TypeConstraints");
    }

    subtype 'Natural'
        => as 'Int'
        => where { $_ > 0 }
        => message { "This number ($_) is not a positive integer!" };

    subtype 'NaturalLessThanTen'
        => as 'Natural'
        => where { $_ < 10 }
        => message { "This number ($_) is not less than ten!" };

    has leg_count => (
        is => 'rw',
        isa => 'NaturalLessThanTen',
    );
}

lives_ok  { my $goat = Animal->new(leg_count => 4)   } '... no errors thrown, value is good';
lives_ok  { my $spider = Animal->new(leg_count => 8) } '... no errors thrown, value is good';

throws_ok { my $fern = Animal->new(leg_count => 0)  }
          qr/This number \(0\) is not less than ten!/,
          "gave custom supertype error message on new";

throws_ok { my $centipede = Animal->new(leg_count => 30) }
          qr/This number \(30\) is not less than ten!/,
          "gave custom subtype error message on new";

my $chimera;
lives_ok { $chimera = Animal->new(leg_count => 4) } '... no errors thrown, value is good';

# first we remove the lion's legs..
throws_ok { $chimera->leg_count(0) }
          qr/This number \(0\) is not less than ten!/,
          "gave custom supertype error message on set_value";

# mix in a few octopodes
throws_ok { $chimera->leg_count(16) }
          qr/This number \(16\) is not less than ten!/,
          "gave custom subtype error message on set_value";