use Test::More 'no_plan';
use strict;
use warnings;
{
package NumberFactory;
use Coat;
use Coat::Types;
type 'Natural'
=> where { $_ > 0 }
=> message { "$_ is not a Natural number" };
type 'Float' => where { /^\d+\.\d+$/ };
subtype 'Month'
=> as 'Natural'
=> where { $_ <= 12 }
=> message { "$_ is not a month" };
subtype 'WinterMonth'
=> as 'Month'
=> where { $_ >= 10 }
=> message { "$_ is not a month of winter" };
enum Colour => 'Red', 'Green', 'Blue';
has n => (isa => 'Natural');
has f => (isa => 'Float');
has month => (isa => 'Month');
has winter => (isa => 'WinterMonth');
has col => (isa => 'Colour');
}
my $factory = new NumberFactory;
# Natural
eval { $factory->n(0) };
ok($@ =~ /0 is not a Natural number/,
"unable to set an null integer as a Natural");
ok ($factory->n(24), '24 accepted as a Natural' );
# Float
eval { $factory->f(2) };
ok($@, "unable to set 2 as a Float");
ok ($factory->n(2.0), '2.0 accepted as a Float' );
# Month (subtype of Natural)
eval { $factory->month(0) };
ok($@, "unable to set 14 as a Month ");
eval { $factory->month(14) };
ok($@, "unable to set 14 as a Month ");
ok ($factory->month(12), '12 is a valid Month' );
# WinterMonth (subtype of Month)
eval { $factory->winter(0) };
ok($@, "unable to set 0 as a WinterMonth ");
eval { $factory->winter(14) };
ok($@, "unable to set 14 as a Month");
eval { $factory->winter(3) };
ok($@, "unable to set 8 as a WinterMonth");
ok ($factory->winter(12), '12 is a valid WinterMonth' );
ok( $factory->col('Red'), 'Red is a valid Colour' );
eval { $factory->col('Yellow') };
ok($@, "Yellow is not a valid colour " );