diff options
Diffstat (limited to 't/roles/overloading_composition_errors.t')
-rw-r--r-- | t/roles/overloading_composition_errors.t | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/t/roles/overloading_composition_errors.t b/t/roles/overloading_composition_errors.t new file mode 100644 index 0000000..75e79ca --- /dev/null +++ b/t/roles/overloading_composition_errors.t @@ -0,0 +1,156 @@ +use strict; +use warnings; + +use Test::More 0.88; +use Test::Fatal; +use Test::Warnings; + +use lib 't/lib'; + +{ + package Role::HasFallback; + use Moose::Role; + + use overload + q{""} => '_stringify', + fallback => 1; + + sub _stringify { __PACKAGE__ } +} + +{ + package Role::NoFallback; + use Moose::Role; + + use overload + '0+' => '_numify', + fallback => 0; + + sub _numify { 42 } +} + +{ + package Class1; + use Moose; + ::like( + ::exception { with qw( Role::HasFallback Role::NoFallback ) }, + qr/\QWe have encountered an overloading conflict for the fallback during composition. This is a fatal error./, + 'exception from fallback conflict during role summation' + ); +} + +{ + package Role::NoOverloading; + use Moose::Role; + + sub foo { 42 } +} + +{ + package Class2; + use Moose; + ::like( + ::exception { with qw( Role::HasFallback Role::NoFallback Role::NoOverloading ) }, + qr/\QWe have encountered an overloading conflict for the fallback during composition. This is a fatal error./, + 'exception from fallback conflict during role summation including role without overloading' + ); +} + +{ + package Role::StringifiesViaSubref1; + use Moose::Role; + + use overload q{""} => sub { 'foo' }; +} + +{ + package Role::StringifiesViaSubref2; + use Moose::Role; + + use overload q{""} => sub { 'bar' }; +} + +{ + package Class3; + use Moose; + ::like( + ::exception { with qw( Role::StringifiesViaSubref1 Role::StringifiesViaSubref2 ) }, + qr/\QThe two roles both overload the '""' operator. This is a fatal error./, + 'exception when two roles with different subref overloading conflict during role summation' + ); +} + +{ + package Class4; + use Moose; + ::like( + ::exception { with qw( Role::StringifiesViaSubref1 Role::StringifiesViaSubref2 Role::NoOverloading ) }, + qr/\QThe two roles both overload the '""' operator. This is a fatal error./, + 'exception when two roles with different subref overloading conflict during role summation including role without overloading' + ); +} + +{ + package Role::StringifiesViaMethod1; + use Moose::Role; + + use overload q{""} => '_stringify1'; + sub _stringify1 { 'foo' } +} + +{ + package Role::StringifiesViaMethod2; + use Moose::Role; + + use overload q{""} => '_stringify2'; + sub _stringify2 { 'foo' } +} + +{ + package Class5; + use Moose; + ::like( + ::exception { with qw( Role::StringifiesViaMethod1 Role::StringifiesViaMethod2 ) }, + qr/\QThe two roles both overload the '""' operator. This is a fatal error./, + 'exception when two roles with different method overloading conflict during role summation' + ); +} + +{ + package Class6; + use Moose; + ::like( + ::exception { with qw( Role::StringifiesViaMethod1 Role::StringifiesViaMethod2 Role::NoOverloading ) }, + qr/\QThe two roles both overload the '""' operator. This is a fatal error./, + 'exception when two roles with different method overloading conflict during role summation including role without overloading' + ); +} + +{ + { + package R1; + use Moose::Role; + + use overload '&{}' => 'as_code'; + + sub as_code { } + } + + { + package R2; + use Moose::Role; + with 'R1'; + } + + { + package C1; + use Moose; + ::is( + ::exception { with 'R1', 'R2' }, + undef, + 'no conflict when class consumes multiple roles with the same overloading' + ); + } +} + +done_testing(); |