summaryrefslogtreecommitdiff
path: root/t/exceptions/moose-util-metarole.t
diff options
context:
space:
mode:
Diffstat (limited to 't/exceptions/moose-util-metarole.t')
-rw-r--r--t/exceptions/moose-util-metarole.t129
1 files changed, 129 insertions, 0 deletions
diff --git a/t/exceptions/moose-util-metarole.t b/t/exceptions/moose-util-metarole.t
new file mode 100644
index 0000000..11e30af
--- /dev/null
+++ b/t/exceptions/moose-util-metarole.t
@@ -0,0 +1,129 @@
+use strict;
+use warnings;
+
+use Test::More;
+use Test::Fatal;
+
+{
+ {
+ package Foo;
+ use Moose;
+ }
+
+ my $foo = Foo->new;
+ my $blessed_foo = blessed $foo;
+ my %args = ( "for" => $foo );
+
+ my $exception = exception {
+ Moose::Util::MetaRole::apply_metaroles( %args );
+ };
+
+ my $message = "When using Moose::Util::MetaRole, "
+ ."you must pass a Moose class name, role name, metaclass object, or metarole object."
+ ." You passed $foo, and we resolved this to a $blessed_foo object.";
+
+ like(
+ $exception,
+ qr/\Q$message/,
+ "$foo is an object, not a class");
+ #When using Moose::Util::MetaRole, you must pass a Moose class name, role name, metaclass object, or metarole object. You passed Foo=HASH(0x16adb58), and we resolved this to a Foo object.
+
+ isa_ok(
+ $exception,
+ 'Moose::Exception::InvalidArgPassedToMooseUtilMetaRole',
+ "$foo is an object, not a class");
+
+ is(
+ $exception->argument,
+ $foo,
+ "$foo is an object, not a class");
+}
+
+{
+ my $array_ref = [1, 2, 3];
+ my %args = ( "for" => $array_ref );
+
+ my $exception = exception {
+ Moose::Util::MetaRole::apply_metaroles( %args );
+ };
+
+ my $message = "When using Moose::Util::MetaRole, "
+ ."you must pass a Moose class name, role name, metaclass object, or metarole object."
+ ." You passed $array_ref, and this did not resolve to a metaclass or metarole."
+ ." Maybe you need to call Moose->init_meta to initialize the metaclass first?";
+
+ like(
+ $exception,
+ qr/\Q$message/,
+ "an Array ref is passed to apply_metaroles");
+ #When using Moose::Util::MetaRole, you must pass a Moose class name, role name, metaclass object, or metarole object. You passed ARRAY(0x21eb868), and this did not resolve to a metaclass or metarole. Maybe you need to call Moose->init_meta to initialize the metaclass first?
+
+ isa_ok(
+ $exception,
+ 'Moose::Exception::InvalidArgPassedToMooseUtilMetaRole',
+ "an Array ref is passed to apply_metaroles");
+
+ is(
+ $exception->argument,
+ $array_ref,
+ "an Array ref is passed to apply_metaroles");
+}
+
+{
+ my %args = ( "for" => undef );
+
+ my $exception = exception {
+ Moose::Util::MetaRole::apply_metaroles( %args );
+ };
+
+ my $message = "When using Moose::Util::MetaRole, "
+ ."you must pass a Moose class name, role name, metaclass object, or metarole object."
+ ." You passed undef, and this did not resolve to a metaclass or metarole."
+ ." Maybe you need to call Moose->init_meta to initialize the metaclass first?";
+
+ like(
+ $exception,
+ qr/\Q$message/,
+ "undef passed to apply_metaroles");
+ #When using Moose::Util::MetaRole, you must pass a Moose class name, role name, metaclass object, or metarole object. You passed undef, and this did not resolve to a metaclass or metarole. Maybe you need to call Moose->init_meta to initialize the metaclass first?
+
+ isa_ok(
+ $exception,
+ 'Moose::Exception::InvalidArgPassedToMooseUtilMetaRole',
+ "undef passed to apply_metaroles");
+
+ is(
+ $exception->argument,
+ undef,
+ "undef passed to apply_metaroles");
+}
+
+{
+ {
+ package Foo::Role;
+ use Moose::Role;
+ }
+
+ my %args = ('for' => "Foo::Role" );
+
+ my $exception = exception {
+ Moose::Util::MetaRole::apply_base_class_roles( %args );
+ };
+
+ like(
+ $exception,
+ qr/\QYou can only apply base class roles to a Moose class, not a role./,
+ "Moose::Util::MetaRole::apply_base_class_roles expects a class for 'for'");
+
+ isa_ok(
+ $exception,
+ 'Moose::Exception::CannotApplyBaseClassRolesToRole',
+ "Moose::Util::MetaRole::apply_base_class_roles expects a class for 'for'");
+
+ is(
+ $exception->role_name,
+ 'Foo::Role',
+ "Moose::Util::MetaRole::apply_base_class_roles expects a class for 'for'");
+}
+
+done_testing;