Regenerate test files
[gitmo/Mouse.git] / t-failing / 030_roles / 007_roles_and_req_method_edge_cases.t
diff --git a/t-failing/030_roles/007_roles_and_req_method_edge_cases.t b/t-failing/030_roles/007_roles_and_req_method_edge_cases.t
new file mode 100644 (file)
index 0000000..b9fbeb6
--- /dev/null
@@ -0,0 +1,283 @@
+#!/usr/bin/perl
+# This is automatically generated by author/import-moose-test.pl.
+# DO NOT EDIT THIS FILE. ANY CHANGES WILL BE LOST!!!
+use t::lib::MooseCompat;
+
+use strict;
+use warnings;
+
+use Test::More;
+$TODO = q{Mouse is not yet completed};
+use Test::Exception;
+
+=pod
+
+NOTE:
+A fair amount of these tests will likely be irrelevant
+once we have more fine grained control over the class
+building process. A lot of the edge cases tested here
+are actually related to class construction order and
+not any real functionality.
+- SL
+
+Role which requires a method implemented
+in another role as an override (it does
+not remove the requirement)
+
+=cut
+
+{
+    package Role::RequireFoo;
+    use strict;
+    use warnings;
+    use Mouse::Role;
+
+    requires 'foo';
+
+    package Role::ProvideFoo;
+    use strict;
+    use warnings;
+    use Mouse::Role;
+
+    ::lives_ok {
+        with 'Role::RequireFoo';
+    } '... the required "foo" method will not exist yet (but we will live)';
+
+    override 'foo' => sub { 'Role::ProvideFoo::foo' };
+}
+
+is_deeply(
+    [ Role::ProvideFoo->meta->get_required_method_list ],
+    [ 'foo' ],
+    '... foo method is still required for Role::ProvideFoo');
+
+=pod
+
+Role which requires a method implemented
+in the consuming class as an override.
+It will fail since method modifiers are
+second class citizens.
+
+=cut
+
+{
+    package Class::ProvideFoo::Base;
+    use Mouse;
+
+    sub foo { 'Class::ProvideFoo::Base::foo' }
+
+    package Class::ProvideFoo::Override1;
+    use Mouse;
+
+    extends 'Class::ProvideFoo::Base';
+
+    ::lives_ok {
+        with 'Role::RequireFoo';
+    } '... the required "foo" method will be found in the superclass';
+
+    override 'foo' => sub { 'Class::ProvideFoo::foo' };
+
+    package Class::ProvideFoo::Override2;
+    use Mouse;
+
+    extends 'Class::ProvideFoo::Base';
+
+    override 'foo' => sub { 'Class::ProvideFoo::foo' };
+
+    ::lives_ok {
+        with 'Role::RequireFoo';
+    } '... the required "foo" method exists, although it is overriden locally';
+
+}
+
+=pod
+
+Now same thing, but with a before
+method modifier.
+
+=cut
+
+{
+    package Class::ProvideFoo::Before1;
+    use Mouse;
+
+    extends 'Class::ProvideFoo::Base';
+
+    ::lives_ok {
+        with 'Role::RequireFoo';
+    } '... the required "foo" method will be found in the superclass';
+
+    before 'foo' => sub { 'Class::ProvideFoo::foo:before' };
+
+    package Class::ProvideFoo::Before2;
+    use Mouse;
+
+    extends 'Class::ProvideFoo::Base';
+
+    before 'foo' => sub { 'Class::ProvideFoo::foo:before' };
+
+    ::lives_ok {
+        with 'Role::RequireFoo';
+    } '... the required "foo" method exists, although it is a before modifier locally';
+
+    package Class::ProvideFoo::Before3;
+    use Mouse;
+
+    extends 'Class::ProvideFoo::Base';
+
+    sub foo { 'Class::ProvideFoo::foo' }
+    before 'foo' => sub { 'Class::ProvideFoo::foo:before' };
+
+    ::lives_ok {
+        with 'Role::RequireFoo';
+    } '... the required "foo" method exists locally, and it is modified locally';
+
+    package Class::ProvideFoo::Before4;
+    use Mouse;
+
+    extends 'Class::ProvideFoo::Base';
+
+    sub foo { 'Class::ProvideFoo::foo' }
+    before 'foo' => sub { 'Class::ProvideFoo::foo:before' };
+
+    ::isa_ok(__PACKAGE__->meta->get_method('foo'), 'Mouse::Meta::Method');
+    ::is(__PACKAGE__->meta->get_method('foo')->get_original_method->package_name, __PACKAGE__,
+    '... but the original method is from our package');
+
+    ::lives_ok {
+        with 'Role::RequireFoo';
+    } '... the required "foo" method exists in the symbol table (and we will live)';
+
+}
+
+=pod
+
+Now same thing, but with a method from an attribute
+method modifier.
+
+=cut
+
+{
+
+    package Class::ProvideFoo::Attr1;
+    use Mouse;
+
+    extends 'Class::ProvideFoo::Base';
+
+    ::lives_ok {
+        with 'Role::RequireFoo';
+    } '... the required "foo" method will be found in the superclass (but then overriden)';
+
+    has 'foo' => (is => 'ro');
+
+    package Class::ProvideFoo::Attr2;
+    use Mouse;
+
+    extends 'Class::ProvideFoo::Base';
+
+    has 'foo' => (is => 'ro');
+
+    ::lives_ok {
+        with 'Role::RequireFoo';
+    } '... the required "foo" method exists, and is an accessor';
+}
+
+# ...
+# a method required in a role, but then
+# implemented in the superclass (as an
+# attribute accessor too)
+
+{
+    package Foo::Class::Base;
+    use Mouse;
+
+    has 'bar' =>  (
+        isa     => 'Int',
+        is      => 'rw',
+        default => sub { 1 }
+    );
+}
+{
+    package Foo::Role;
+    use Mouse::Role;
+
+    requires 'bar';
+
+    has 'foo' => (
+        isa     => 'Int',
+        is      => 'rw',
+        lazy    => 1,
+        default => sub { (shift)->bar + 1 }
+    );
+}
+{
+    package Foo::Class::Child;
+    use Mouse;
+    extends 'Foo::Class::Base';
+
+    ::lives_ok {
+        with 'Foo::Role';
+    } '... our role combined successfully';
+}
+
+# a method required in a role and implemented in a superclass, with a method
+# modifier in the subclass.  this should live, but dies in 0.26 -- hdp,
+# 2007-10-11
+
+{
+    package Bar::Class::Base;
+    use Mouse;
+
+    sub bar { "hello!" }
+}
+{
+    package Bar::Role;
+    use Mouse::Role;
+    requires 'bar';
+}
+{
+    package Bar::Class::Child;
+    use Mouse;
+    extends 'Bar::Class::Base';
+    after bar => sub { "o noes" };
+    # technically we could run lives_ok here, too, but putting it into a
+    # grandchild class makes it more obvious why this matters.
+}
+{
+    package Bar::Class::Grandchild;
+    use Mouse;
+    extends 'Bar::Class::Child';
+    ::lives_ok {
+        with 'Bar::Role';
+    } 'required method exists in superclass as non-modifier, so we live';
+}
+
+{
+    package Bar2::Class::Base;
+    use Mouse;
+
+    sub bar { "hello!" }
+}
+{
+    package Bar2::Role;
+    use Mouse::Role;
+    requires 'bar';
+}
+{
+    package Bar2::Class::Child;
+    use Mouse;
+    extends 'Bar2::Class::Base';
+    override bar => sub { "o noes" };
+    # technically we could run lives_ok here, too, but putting it into a
+    # grandchild class makes it more obvious why this matters.
+}
+{
+    package Bar2::Class::Grandchild;
+    use Mouse;
+    extends 'Bar2::Class::Child';
+    ::lives_ok {
+        with 'Bar2::Role';
+    } 'required method exists in superclass as non-modifier, so we live';
+}
+
+done_testing;