calculate mro module once
[gitmo/Role-Tiny.git] / t / role-basic-composition.t
index 33c8ac2..640dec7 100644 (file)
@@ -1,5 +1,3 @@
-#!/usr/bin/env perl
-
 use lib 'lib', 't/role-basic/lib';
 use MyTests;
 require Role::Tiny;
@@ -125,25 +123,113 @@ $ENV{DEBUG} = 1;
 
 {
        {
-               package Role1;
+               package Method::Role1;
                use Role::Tiny;
                sub method1 { }
                requires 'method2';
        }
 
        {
-               package Role2;
+               package Method::Role2;
                use Role::Tiny;
                sub method2 { }
                requires 'method1';
        }
-       my $success = eval <<'END';
+       my $success = eval q{
+               package Class;
+               use Role::Tiny::With;
+               with 'Method::Role1', 'Method::Role2';
+               1;
+       };
+       is $success, 1, 'composed mutually dependent methods successfully' or diag "Error: $@";
+}
+
+SKIP: {
+  skip "Class::Method::Modifiers not installed or too old", 1
+    unless eval "use Class::Method::Modifiers 1.05; 1";
+       {
+               package Modifier::Role1;
+               use Role::Tiny;
+               sub foo {
+               }
+               before 'bar', sub {};
+       }
+
+       {
+               package Modifier::Role2;
+               use Role::Tiny;
+               sub bar {
+               }
+               before 'foo', sub {};
+       }
+       my $success = eval q{
                package Class;
                use Role::Tiny::With;
-               with 'Role1', 'Role2';
+               with 'Modifier::Role1', 'Modifier::Role2';
                1;
-END
-       is $success, 1, 'composed mutually dependent roles successfully' or diag "Error: $@";
+       };
+       is $success, 1, 'composed mutually dependent modifiers successfully' or diag "Error: $@";
+}
+
+{
+       {
+               package Base::Role;
+               use Role::Tiny;
+               requires qw/method1 method2/;
+       }
+
+       {
+               package Sub::Role1;
+               use Role::Tiny;
+               with 'Base::Role';
+               sub method1 {}
+       }
+
+       {
+               package Sub::Role2;
+               use Role::Tiny;
+               with 'Base::Role';
+               sub method2 {}
+       }
+
+       my $success = eval q{
+               package Diamant::Class;
+               use Role::Tiny::With;
+               with qw/Sub::Role1 Sub::Role2/;
+               1;
+       };
+       is $success, 1, 'composed diamantly dependent roles successfully' or diag "Error: $@";
+}
+
+{
+    {
+        package My::Does::Conflict;
+        use Role::Tiny;
+
+        sub method {
+            return __PACKAGE__ . " method";
+        }
+    }
+    {
+        package My::Class::Base;
+
+        sub turbo_charger {
+            return __PACKAGE__ . " turbo charger";
+        }
+        sub method {
+            return __PACKAGE__ . " method";
+        }
+    }
+    my $success = eval q{
+        package My::Class::Child;
+        use base 'My::Class::Base';
+        use Role::Tiny::With;
+        with qw/My::Does::Basic1 My::Does::Conflict/;
+        1;
+    };
+    is $success, 1, 'role conflict resolved by superclass method' or diag "Error: $@";
+    can_ok 'My::Class::Child', 'method';
+    is My::Class::Child->method, 'My::Class::Base method', 'inherited method prevails';
 }
 
 done_testing;