From: Nathan Gray Date: Tue, 24 Jul 2007 15:59:07 +0000 (+0000) Subject: added tests which show how roll tiebreaking works when methods and attributes are... X-Git-Tag: 0_25~23 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=3c5fd53ac6fc42922b81a6d3494a151763178165;p=gitmo%2FMoose.git added tests which show how roll tiebreaking works when methods and attributes are mixed --- diff --git a/t/044_role_conflict_detection.t b/t/044_role_conflict_detection.t index 1295722..43b3574 100644 --- a/t/044_role_conflict_detection.t +++ b/t/044_role_conflict_detection.t @@ -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'); +