summaryrefslogtreecommitdiff
path: root/t/exceptions/moose-meta-role-application-rolesummation.t
diff options
context:
space:
mode:
Diffstat (limited to 't/exceptions/moose-meta-role-application-rolesummation.t')
-rw-r--r--t/exceptions/moose-meta-role-application-rolesummation.t215
1 files changed, 215 insertions, 0 deletions
diff --git a/t/exceptions/moose-meta-role-application-rolesummation.t b/t/exceptions/moose-meta-role-application-rolesummation.t
new file mode 100644
index 0000000..faa56c5
--- /dev/null
+++ b/t/exceptions/moose-meta-role-application-rolesummation.t
@@ -0,0 +1,215 @@
+use strict;
+use warnings;
+
+use Test::More;
+use Test::Fatal;
+
+use Moose();
+
+{
+ {
+ package Foo1;
+ use Moose::Role;
+ excludes 'Bar1';
+ }
+
+ {
+ package Bar1;
+ use Moose::Role;
+ }
+
+ my $exception = exception {
+ package CompositeRole;
+ use Moose::Role;
+ with 'Foo1', 'Bar1';
+ };
+
+ like(
+ $exception,
+ qr/\QConflict detected: Role Foo1 excludes role 'Bar1'/,
+ "role Foo1 excludes role Bar1");
+
+ isa_ok(
+ $exception,
+ "Moose::Exception::RoleExclusionConflict",
+ "role Foo1 excludes role Bar1");
+
+ is(
+ $exception->role_name,
+ "Bar1",
+ "role Foo1 excludes role Bar1");
+
+ is_deeply(
+ $exception->roles,
+ ["Foo1"],
+ "role Foo1 excludes role Bar1");
+
+ {
+ package Baz1;
+ use Moose::Role;
+ excludes 'Bar1';
+ }
+
+ $exception = exception {
+ package CompositeRole1;
+ use Moose::Role;
+ with 'Foo1', 'Bar1', 'Baz1';
+ };
+
+ like(
+ $exception,
+ qr/\QConflict detected: Roles Foo1, Baz1 exclude role 'Bar1'/,
+ "role Foo1 & Baz1 exclude role Bar1");
+
+ isa_ok(
+ $exception,
+ "Moose::Exception::RoleExclusionConflict",
+ "role Foo1 & Baz1 exclude role Bar1");
+
+ is(
+ $exception->role_name,
+ "Bar1",
+ "role Foo1 & Baz1 exclude role Bar1");
+
+ is_deeply(
+ $exception->roles,
+ ["Foo1", 'Baz1'],
+ "role Foo1 & Baz1 exclude role Bar1");
+}
+
+{
+ {
+ package Foo2;
+ use Moose::Role;
+
+ has 'foo' => ( isa => 'Int' );
+ }
+
+ {
+ package Bar2;
+ use Moose::Role;
+
+ has 'foo' => ( isa => 'Int' );
+ }
+
+ my $exception = exception {
+ package CompositeRole2;
+ use Moose::Role;
+ with 'Foo2', 'Bar2';
+ };
+
+ like(
+ $exception,
+ qr/\QWe have encountered an attribute conflict with 'foo' during role composition. This attribute is defined in both Foo2 and Bar2. This is a fatal error and cannot be disambiguated./,
+ "role Foo2 & Bar2, both have an attribute named foo");
+
+ isa_ok(
+ $exception,
+ "Moose::Exception::AttributeConflictInSummation",
+ "role Foo2 & Bar2, both have an attribute named foo");
+
+ is(
+ $exception->role_name,
+ "Foo2",
+ "role Foo2 & Bar2, both have an attribute named foo");
+
+ is(
+ $exception->second_role_name,
+ "Bar2",
+ "role Foo2 & Bar2, both have an attribute named foo");
+
+ is(
+ $exception->attribute_name,
+ "foo",
+ "role Foo2 & Bar2, both have an attribute named foo");
+}
+
+{
+ {
+ package Foo3;
+ use Moose::Role;
+
+ sub foo {}
+ }
+
+ {
+ package Bar3;
+ use Moose::Role;
+
+ override 'foo' => sub {}
+ }
+
+ my $exception = exception {
+ package CompositeRole3;
+ use Moose::Role;
+ with 'Foo3', 'Bar3';
+ };
+
+ like(
+ $exception,
+ qr/\QRole 'Foo3|Bar3' has encountered an 'override' method conflict during composition (A local method of the same name has been found). This is a fatal error./,
+ "role Foo3 has a local method 'foo' & role Bar3 is overriding that same method");
+
+ isa_ok(
+ $exception,
+ "Moose::Exception::OverrideConflictInSummation",
+ "role Foo3 has a local method 'foo' & role Bar3 is overriding that same method");
+
+ my @role_names = $exception->role_names;
+ my $role_names = join "|", @role_names;
+ is(
+ $role_names,
+ "Foo3|Bar3",
+ "role Foo3 has a local method 'foo' & role Bar3 is overriding that same method");
+
+ is(
+ $exception->method_name,
+ "foo",
+ "role Foo3 has a local method 'foo' & role Bar3 is overriding that same method");
+}
+
+{
+ {
+ package Foo4;
+ use Moose::Role;
+
+ override 'foo' => sub {};
+ }
+
+ {
+ package Bar4;
+ use Moose::Role;
+
+ override 'foo' => sub {};
+ }
+
+ my $exception = exception {
+ package CompositeRole4;
+ use Moose::Role;
+ with 'Foo4', 'Bar4';
+ };
+
+ like(
+ $exception,
+ qr/\QWe have encountered an 'override' method conflict during composition (Two 'override' methods of the same name encountered). This is a fatal error./,
+ "role Foo4 & Bar4, both are overriding the same method 'foo'");
+
+ isa_ok(
+ $exception,
+ "Moose::Exception::OverrideConflictInSummation",
+ "role Foo4 & Bar4, both are overriding the same method 'foo'");
+
+ my @role_names = $exception->role_names;
+ my $role_names = join "|", @role_names;
+ is(
+ $role_names,
+ "Foo4|Bar4",
+ "role Foo4 & Bar4, both are overriding the same method 'foo'");
+
+ is(
+ $exception->method_name,
+ "foo",
+ "role Foo4 & Bar4, both are overriding the same method 'foo'");
+}
+
+done_testing;