diff options
Diffstat (limited to 't/exceptions/moose-meta-role-application-rolesummation.t')
-rw-r--r-- | t/exceptions/moose-meta-role-application-rolesummation.t | 215 |
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; |