add is_role method
[gitmo/Role-Tiny.git] / t / role-tiny.t
index 9ef8f73..f93cc78 100644 (file)
@@ -1,4 +1,5 @@
-use strictures 1;
+use strict;
+use warnings FATAL => 'all';
 use Test::More;
 use Test::Fatal;
 
@@ -9,8 +10,6 @@ BEGIN {
 
   requires qw(req1 req2);
 
-  around foo => sub { my $orig = shift; join ' ', 'role foo', $orig->(@_) };
-
   sub bar { 'role bar' }
 
   sub baz { 'role baz' }
@@ -19,6 +18,10 @@ BEGIN {
 BEGIN {
   package MyClass;
 
+  use constant SIMPLE => 'simple';
+  use constant REF_CONST => [ 'ref_const' ];
+  use constant VSTRING_CONST => v1;
+
   sub req1 { }
   sub req2 { }
   sub foo { 'class foo' }
@@ -27,6 +30,21 @@ BEGIN {
 }
 
 BEGIN {
+  package ExtraClass;
+  sub req1 { }
+  sub req2 { }
+  sub req3 { }
+  sub foo { }
+  sub baz { 'class baz' }
+}
+
+BEGIN {
+  package IntermediaryRole;
+  use Role::Tiny;
+  requires 'req3';
+}
+
+BEGIN {
   package NoMethods;
 
   package OneMethod;
@@ -34,19 +52,49 @@ BEGIN {
   sub req1 { }
 }
 
+BEGIN {
+  package ExtraRole;
+  use Role::Tiny;
+
+  sub extra1 { 'role extra' }
+}
+
 sub try_apply_to {
   my $to = shift;
-  exception { Role::Tiny->apply_role_to_package('MyRole', $to) }
+  exception { Role::Tiny->apply_role_to_package($to, 'MyRole') }
 }
 
 is(try_apply_to('MyClass'), undef, 'role applies cleanly');
-is(MyClass->foo, 'role foo class foo', 'method modifier');
 is(MyClass->bar, 'role bar', 'method from role');
 is(MyClass->baz, 'class baz', 'method from class');
 ok(MyClass->does('MyRole'), 'class does role');
+ok(!MyClass->does('IntermediaryRole'), 'class does not do non-applied role');
 ok(!MyClass->does('Random'), 'class does not do non-role');
 
 like(try_apply_to('NoMethods'), qr/req1, req2/, 'error for both methods');
 like(try_apply_to('OneMethod'), qr/req2/, 'error for one method');
 
+is exception {
+  Role::Tiny->apply_role_to_package('IntermediaryRole', 'MyRole');
+  Role::Tiny->apply_role_to_package('ExtraClass', 'IntermediaryRole');
+}, undef, 'No errors applying roles';
+
+ok(ExtraClass->does('MyRole'), 'ExtraClass does MyRole');
+ok(ExtraClass->does('IntermediaryRole'), 'ExtraClass does IntermediaryRole');
+is(ExtraClass->bar, 'role bar', 'method from role');
+is(ExtraClass->baz, 'class baz', 'method from class');
+
+my $new_class;
+is exception {
+    $new_class = Role::Tiny->create_class_with_roles('MyClass', 'ExtraRole');
+}, undef, 'No errors creating class with roles';
+
+isa_ok($new_class, 'MyClass');
+is($new_class->extra1, 'role extra', 'method from role');
+
+ok(Role::Tiny->is_role('MyRole'), 'is_role true for roles');
+ok(!Role::Tiny->is_role('MyClass'), 'is_role false for classes');
+
+
 done_testing;
+