summaryrefslogtreecommitdiff
path: root/t/attributes/attribute_does.t
diff options
context:
space:
mode:
Diffstat (limited to 't/attributes/attribute_does.t')
-rw-r--r--t/attributes/attribute_does.t99
1 files changed, 99 insertions, 0 deletions
diff --git a/t/attributes/attribute_does.t b/t/attributes/attribute_does.t
new file mode 100644
index 0000000..32279a5
--- /dev/null
+++ b/t/attributes/attribute_does.t
@@ -0,0 +1,99 @@
+use strict;
+use warnings;
+
+use Test::More;
+use Test::Fatal;
+
+
+{
+ package Foo::Role;
+ use Moose::Role;
+ use Moose::Util::TypeConstraints;
+
+ # if does() exists on its own, then
+ # we create a type constraint for
+ # it, just as we do for isa()
+ has 'bar' => (is => 'rw', does => 'Bar::Role');
+ has 'baz' => (
+ is => 'rw',
+ does => role_type('Bar::Role')
+ );
+
+ package Foo::Class;
+ use Moose;
+
+ with 'Foo::Role';
+
+ package Bar::Role;
+ use Moose::Role;
+
+ # if isa and does appear together, then see if Class->does(Role)
+ # if it does work... then the does() check is actually not needed
+ # since the isa() check will imply the does() check
+ has 'foo' => (is => 'rw', isa => 'Foo::Class', does => 'Foo::Role');
+
+ package Bar::Class;
+ use Moose;
+
+ with 'Bar::Role';
+}
+
+my $foo = Foo::Class->new;
+isa_ok($foo, 'Foo::Class');
+
+my $bar = Bar::Class->new;
+isa_ok($bar, 'Bar::Class');
+
+is( exception {
+ $foo->bar($bar);
+}, undef, '... bar passed the type constraint okay' );
+
+isnt( exception {
+ $foo->bar($foo);
+}, undef, '... foo did not pass the type constraint okay' );
+
+is( exception {
+ $foo->baz($bar);
+}, undef, '... baz passed the type constraint okay' );
+
+isnt( exception {
+ $foo->baz($foo);
+}, undef, '... foo did not pass the type constraint okay' );
+
+is( exception {
+ $bar->foo($foo);
+}, undef, '... foo passed the type constraint okay' );
+
+
+
+# some error conditions
+
+{
+ package Baz::Class;
+ use Moose;
+
+ # if isa and does appear together, then see if Class->does(Role)
+ # if it does not,.. we have a conflict... so we die loudly
+ ::isnt( ::exception {
+ has 'foo' => (isa => 'Foo::Class', does => 'Bar::Class');
+ }, undef, '... cannot have a does() which is not done by the isa()' );
+}
+
+{
+ package Bling;
+ use strict;
+ use warnings;
+
+ sub bling { 'Bling::bling' }
+
+ package Bling::Bling;
+ use Moose;
+
+ # if isa and does appear together, then see if Class->does(Role)
+ # if it does not,.. we have a conflict... so we die loudly
+ ::isnt( ::exception {
+ has 'foo' => (isa => 'Bling', does => 'Bar::Class');
+ }, undef, '... cannot have a isa() which is cannot does()' );
+}
+
+done_testing;