summaryrefslogtreecommitdiff
path: root/t/roles/overloading_composition_errors.t
diff options
context:
space:
mode:
Diffstat (limited to 't/roles/overloading_composition_errors.t')
-rw-r--r--t/roles/overloading_composition_errors.t156
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();