added tests which show how roll tiebreaking works when methods and attributes are...
Nathan Gray [Tue, 24 Jul 2007 15:59:07 +0000 (15:59 +0000)]
t/044_role_conflict_detection.t

index 1295722..43b3574 100644 (file)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 90;
+use Test::More tests => 126;
 use Test::Exception;
 
 BEGIN {
@@ -347,3 +347,190 @@ ok(!Role::Reality->meta->does_role('Role::Plot'), '... our role does() the corre
 is(Role::Reality->meta->get_method('twist')->(), 
     'Role::Reality::twist', 
     '... the twist method returns the right value');
+
+=pod
+
+Role conflicts between attributes and methods
+
+=cut
+
+{
+    package Role::Method;
+    use Moose::Role;
+    
+    sub ghost { 'Role::Method::ghost' }
+
+    package Role::Method2;
+    use Moose::Role;
+    
+    sub ghost { 'Role::Method2::ghost' }
+
+    package Role::Attribute;
+    use Moose::Role;
+    
+    has 'ghost' => (is => 'ro', default => 'Role::Attribute::ghost');
+
+    package Role::Attribute2;
+    use Moose::Role;
+    
+    has 'ghost' => (is => 'ro', default => 'Role::Attribute2::ghost');
+}
+
+{
+    package My::Test15;
+    use Moose;
+
+    ::lives_ok {    
+       with 'Role::Method';
+    } '... composed the method role into the method class';
+
+    sub ghost { 'My::Test15::ghost' }
+
+    package My::Test16;
+    use Moose;
+
+    ::lives_ok {
+       with 'Role::Method';
+    } '... composed the method role into the attribute class';
+
+    has 'ghost' => (is => 'ro', default => 'My::Test16::ghost');
+
+    package My::Test17;
+    use Moose;
+
+    ::lives_ok {
+       with 'Role::Attribute';
+    } '... composed the attribute role into the method class';
+
+    sub ghost { 'My::Test17::ghost' }
+
+    package My::Test18;
+    use Moose;
+
+    ::lives_ok {
+       with 'Role::Attribute';
+    } '... composed the attribute role into the attribute class';
+
+    has 'ghost' => (is => 'ro', default => 'My::Test18::ghost');
+
+    package My::Test19;
+    use Moose;
+
+    ::lives_ok {
+       with 'Role::Method', 'Role::Method2';
+    } '... composed method roles into class with method tiebreaker';
+
+    sub ghost { 'My::Test19::ghost' }
+
+    package My::Test20;
+    use Moose;
+
+    ::lives_ok {
+       with 'Role::Method', 'Role::Method2';
+    } '... composed method roles into class with attribute tiebreaker';
+
+    has 'ghost' => (is => 'ro', default => 'My::Test20::ghost');
+
+    package My::Test21;
+    use Moose;
+
+    ::lives_ok {
+       with 'Role::Attribute', 'Role::Attribute2';
+    } '... composed attribute roles into class with method tiebreaker';
+
+    sub ghost { 'My::Test21::ghost' }
+
+    package My::Test22;
+    use Moose;
+
+    ::lives_ok {
+       with 'Role::Attribute', 'Role::Attribute2';
+    } '... composed attribute roles into class with attribute tiebreaker';
+
+    has 'ghost' => (is => 'ro', default => 'My::Test22::ghost');
+
+    package My::Test23;
+    use Moose;
+
+    ::lives_ok {
+        with 'Role::Method', 'Role::Attribute';
+    } '... composed method and attribute role into class with method tiebreaker';
+
+    sub ghost { 'My::Test23::ghost' }
+
+    package My::Test24;
+    use Moose;
+
+    ::lives_ok {
+        with 'Role::Method', 'Role::Attribute';
+    } '... composed method and attribute role into class with attribute tiebreaker';
+
+    has 'ghost' => (is => 'ro', default => 'My::Test24::ghost');
+
+    package My::Test25;
+    use Moose;
+
+    ::lives_ok {
+        with 'Role::Attribute', 'Role::Method';
+    } '... composed attribute and method role into class with method tiebreaker';
+
+    sub ghost { 'My::Test25::ghost' }
+
+    package My::Test26;
+    use Moose;
+
+    ::lives_ok {
+        with 'Role::Attribute', 'Role::Method';
+    } '... composed attribute and method role into class with attribute tiebreaker';
+
+    has 'ghost' => (is => 'ro', default => 'My::Test26::ghost');
+}
+
+my $test15 = My::Test15->new;
+isa_ok($test15, 'My::Test15');
+is($test15->ghost, 'My::Test15::ghost', '... we access the method from the class and ignore the role method');
+
+my $test16 = My::Test16->new;
+isa_ok($test16, 'My::Test16');
+is($test16->ghost, 'My::Test16::ghost', '... we access the attribute from the class and ignore the role method');
+
+my $test17 = My::Test17->new;
+isa_ok($test17, 'My::Test17');
+is($test17->ghost, 'My::Test17::ghost', '... we access the method from the class and ignore the role attribute');
+
+my $test18 = My::Test18->new;
+isa_ok($test18, 'My::Test18');
+is($test18->ghost, 'My::Test18::ghost', '... we access the attribute from the class and ignore the role attribute');
+
+my $test19 = My::Test19->new;
+isa_ok($test19, 'My::Test19');
+is($test19->ghost, 'My::Test19::ghost', '... we access the method from the class and ignore the role methods');
+
+my $test20 = My::Test20->new;
+isa_ok($test20, 'My::Test20');
+is($test20->ghost, 'My::Test20::ghost', '... we access the attribute from the class and ignore the role methods');
+
+my $test21 = My::Test21->new;
+isa_ok($test21, 'My::Test21');
+is($test21->ghost, 'My::Test21::ghost', '... we access the method from the class and ignore the role attributes');
+
+my $test22 = My::Test22->new;
+isa_ok($test22, 'My::Test22');
+is($test22->ghost, 'My::Test22::ghost', '... we access the attribute from the class and ignore the role attributes');
+
+my $test23 = My::Test23->new;
+isa_ok($test23, 'My::Test23');
+is($test23->ghost, 'My::Test23::ghost', '... we access the method from the class and ignore the role method and attribute');
+
+my $test24 = My::Test24->new;
+isa_ok($test24, 'My::Test24');
+is($test24->ghost, 'My::Test24::ghost', '... we access the attribute from the class and ignore the role method and attribute');
+
+my $test25 = My::Test25->new;
+isa_ok($test25, 'My::Test25');
+is($test25->ghost, 'My::Test25::ghost', '... we access the method from the class and ignore the role attribute and method');
+
+my $test26 = My::Test26->new;
+isa_ok($test26, 'My::Test26');
+is($test26->ghost, 'My::Test26::ghost', '... we access the attribute from the class and ignore the role attribute and method');
+