use strict;
use warnings;
use Test::More;
use Test::Fatal;
use Moose::Util::TypeConstraints;
# tests for type/subtype name contain invalid characters
{
my $exception = exception {
subtype 'Foo-Baz' => as 'Item'
};
like(
$exception,
qr/contains invalid characters/,
"Type names cannot contain a dash (via subtype sugar)");
isa_ok(
$exception,
"Moose::Exception::InvalidNameForType",
"Type names cannot contain a dash (via subtype sugar)");
}
{
my $exception = exception {
Moose::Util::TypeConstraints::create_type_constraint_union();
};
like(
$exception,
qr/You must pass in at least 2 type names to make a union/,
"Moose::Util::TypeConstraints::create_type_constraint_union takes atleast two arguments");
isa_ok(
$exception,
"Moose::Exception::UnionTakesAtleastTwoTypeNames",
"Moose::Util::TypeConstraints::create_type_constraint_union takes atleast two arguments");
}
{
my $exception = exception {
Moose::Util::TypeConstraints::create_type_constraint_union('foo','bar');
};
like(
$exception,
qr/\QCould not locate type constraint (foo) for the union/,
"invalid typeconstraint given to Moose::Util::TypeConstraints::create_type_constraint_union");
isa_ok(
$exception,
"Moose::Exception::CouldNotLocateTypeConstraintForUnion",
"invalid typeconstraint given to Moose::Util::TypeConstraints::create_type_constraint_union");
is(
$exception->type_name,
'foo',
"invalid typeconstraint given to Moose::Util::TypeConstraints::create_type_constraint_union");
}
{
my $exception = exception {
Moose::Util::TypeConstraints::create_parameterized_type_constraint("Foo");
};
like(
$exception,
qr/\QCould not parse type name (Foo) correctly/,
"'Foo' is not a valid type constraint name");
isa_ok(
$exception,
"Moose::Exception::InvalidTypeGivenToCreateParameterizedTypeConstraint",
"'Foo' is not a valid type constraint name");
}
{
my $exception = exception {
Moose::Util::TypeConstraints::create_parameterized_type_constraint("Foo[Int]");
};
like(
$exception,
qr/\QCould not locate the base type (Foo)/,
"'Foo' is not a valid base type constraint name");
isa_ok(
$exception,
"Moose::Exception::InvalidBaseTypeGivenToCreateParameterizedTypeConstraint",
"'Foo' is not a valid base type constraint name");
}
{
{
package Foo1;
use Moose::Role;
}
my $exception = exception {
Moose::Util::TypeConstraints::class_type("Foo1");
};
like(
$exception,
qr/\QThe type constraint 'Foo1' has already been created in Moose::Role and cannot be created again in main/,
"there is an already defined role of name 'Foo1'");
isa_ok(
$exception,
"Moose::Exception::TypeConstraintIsAlreadyCreated",
"there is an already defined role of name 'Foo1'");
is(
$exception->type_name,
'Foo1',
"there is an already defined role of name 'Foo1'");
is(
(find_type_constraint($exception->type_name))->_package_defined_in,
'Moose::Role',
"there is an already defined role of name 'Foo1'");
is(
$exception->package_defined_in,
'main',
"there is an already defined role of name 'Foo1'");
}
{
{
package Foo2;
use Moose;
}
my $exception = exception {
Moose::Util::TypeConstraints::role_type("Foo2");
};
like(
$exception,
qr/\QThe type constraint 'Foo2' has already been created in Moose and cannot be created again in main/,
"there is an already defined class of name 'Foo2'");
isa_ok(
$exception,
"Moose::Exception::TypeConstraintIsAlreadyCreated",
"there is an already defined class of name 'Foo2'");
is(
$exception->type_name,
'Foo2',
"there is an already defined class of name 'Foo2'");
is(
(find_type_constraint($exception->type_name))->_package_defined_in,
'Moose',
"there is an already defined class of name 'Foo2'");
is(
$exception->package_defined_in,
'main',
"there is an already defined class of name 'Foo2'");
}
{
my $exception = exception {
subtype 'Foo';
};
like(
$exception,
qr/A subtype cannot consist solely of a name, it must have a parent/,
"no parent given to subtype");
isa_ok(
$exception,
"Moose::Exception::NoParentGivenToSubtype",
"no parent given to subtype");
is(
$exception->name,
'Foo',
"no parent given to subtype");
}
{
my $exception = exception {
enum [1,2,3], "foo";
};
like(
$exception,
qr/\Qenum called with an array reference and additional arguments. Did you mean to parenthesize the enum call's parameters?/,
"enum expects either a name & an array or only an array");
isa_ok(
$exception,
"Moose::Exception::EnumCalledWithAnArrayRefAndAdditionalArgs",
"enum expects either a name & an array or only an array");
}
{
my $exception = exception {
union [1,2,3], "foo";
};
like(
$exception,
qr/union called with an array reference and additional arguments/,
"union expects either a name & an array or only an array");
isa_ok(
$exception,
"Moose::Exception::UnionCalledWithAnArrayRefAndAdditionalArgs",
"union expects either a name & an array or only an array");
}
{
{
package Foo3;
use Moose;
}
my $exception = exception {
Moose::Util::TypeConstraints::type("Foo3");
};
like(
$exception,
qr/\QThe type constraint 'Foo3' has already been created in Moose and cannot be created again in main/,
"there is an already defined class of name 'Foo3'");
isa_ok(
$exception,
"Moose::Exception::TypeConstraintIsAlreadyCreated",
"there is an already defined class of name 'Foo3'");
is(
$exception->type_name,
'Foo3',
"there is an already defined class of name 'Foo3'");
is(
find_type_constraint($exception->type_name)->_package_defined_in,
'Moose',
"there is an already defined class of name 'Foo3'");
is(
$exception->package_defined_in,
'main',
"there is an already defined class of name 'Foo3'");
}
{
my $exception = exception {
Moose::Util::TypeConstraints::coerce "Foo";
};
like(
$exception,
qr/Cannot find type 'Foo', perhaps you forgot to load it/,
"'Foo' is not a valid type");
isa_ok(
$exception,
"Moose::Exception::CannotFindType",
"'Foo' is not a valid type");
}
{
my $exception = exception {
Moose::Util::TypeConstraints::add_parameterizable_type "Foo";
};
like(
$exception,
qr/Type must be a Moose::Meta::TypeConstraint::Parameterizable not Foo/,
"'Foo' is not a parameterizable type");
isa_ok(
$exception,
"Moose::Exception::AddParameterizableTypeTakesParameterizableType",
"'Foo' is not a parameterizable type");
is(
$exception->type_name,
"Foo",
"'Foo' is not a parameterizable type");
}
done_testing;