diff --git a/t/mojo/roles.t b/t/mojo/roles.t index d81266fceb..617e830ae1 100644 --- a/t/mojo/roles.t +++ b/t/mojo/roles.t @@ -52,72 +52,84 @@ use Mojo::Collection; use Mojo::DOM; use Mojo::File; -# Plain class -my $obj = Mojo::RoleTest->new(name => 'Ted'); -is $obj->name, 'Ted', 'attribute'; -is $obj->hello, 'hello Ted', 'method'; - -# Empty roles -my $fred = Mojo::RoleTest->with_roles()->new(name => 'Fred'); -is $fred->name, 'Fred', 'attribute'; -is $fred->hello, 'hello Fred', 'method'; - -# Empty object roles -my $obj_empty = $obj->with_roles(); -is $obj_empty->name, 'Ted', 'attribute'; -is $obj_empty->hello, 'hello Ted', 'method'; - -# Single role -my $obj2 = Mojo::RoleTest->with_roles('Mojo::RoleTest::Role::LOUD')->new; -is $obj2->hello, 'HEY! BOB!!!', 'role method'; -is $obj2->yell, 'HEY!', 'another role method'; - -# Single role (shorthand) -my $obj4 = Mojo::RoleTest->with_roles('+LOUD')->new; -is $obj4->hello, 'HEY! BOB!!!', 'role method'; -is $obj4->yell, 'HEY!', 'another role method'; - -# Multiple roles -my $obj3 = Mojo::RoleTest->with_roles('Mojo::RoleTest::Role::quiet', 'Mojo::RoleTest::Role::LOUD')->new(name => 'Joel'); -is $obj3->name, 'Joel', 'base attribute'; -is $obj3->whisper, 'psst, joel', 'method from first role'; -$obj3->prefix('psssst, '); -is $obj3->whisper, 'psssst, joel', 'method from first role'; -is $obj3->hello, 'HEY! JOEL!!!', 'method from second role'; - -# Multiple roles (shorthand) -my $obj5 = Mojo::RoleTest->with_roles('+quiet', '+LOUD')->new(name => 'Joel'); -is $obj5->name, 'Joel', 'base attribute'; -is $obj5->whisper, 'psst, joel', 'method from first role'; -is $obj5->hello, 'HEY! JOEL!!!', 'method from second role'; - -# Multiple roles (mixed) -my $obj6 = Mojo::RoleTest->with_roles('Mojo::RoleTest::Role::quiet', '+LOUD')->new(name => 'Joel'); -is $obj6->name, 'Joel', 'base attribute'; -is $obj6->whisper, 'psst, joel', 'method from first role'; -is $obj6->hello, 'HEY! JOEL!!!', 'method from second role'; - -# Multiple object roles (mixed) -my $obj7 = Mojo::RoleTest->new(name => 'Joel')->with_roles('Mojo::RoleTest::Role::quiet', '+LOUD'); -is $obj7->name, 'Joel', 'base attribute'; -is $obj7->whisper, 'psst, joel', 'method from first role'; -is $obj7->hello, 'HEY! JOEL!!!', 'method from second role'; - -# Multiple Mojo::Base roles -my $obj8 = Mojo::RoleTest->with_roles('+quiet', 'Mojo::RoleTest::Hello')->new(name => 'Joel'); -is $obj8->name, 'Joel', 'base attribute'; -is $obj8->whisper, 'psst, joel', 'method from first role'; -is $obj8->hello, 'hello mojo!', 'method from second role'; - -# Classes that are not subclasses of Mojo::Base -my $stream = Mojo::ByteStream->with_roles('Mojo::RoleTest::Hello')->new; -is $stream->hello, 'hello mojo!', 'right result'; -my $c = Mojo::Collection->with_roles('Mojo::RoleTest::Hello')->new; -is $c->hello, 'hello mojo!', 'right result'; -my $dom = Mojo::DOM->with_roles('Mojo::RoleTest::Hello')->new; -is $dom->hello, 'hello mojo!', 'right result'; -my $file = Mojo::File->with_roles('Mojo::RoleTest::Hello')->new; -is $file->hello, 'hello mojo!', 'right result'; +subtest 'Plain class' => sub { + my $obj = Mojo::RoleTest->new(name => 'Ted'); + is $obj->name, 'Ted', 'attribute'; + is $obj->hello, 'hello Ted', 'method'; +}; + +subtest 'Empty roles' => sub { + my $fred = Mojo::RoleTest->with_roles()->new(name => 'Fred'); + is $fred->name, 'Fred', 'attribute'; + is $fred->hello, 'hello Fred', 'method'; +}; + +subtest 'Empty object roles' => sub { + my $obj = Mojo::RoleTest->new(name => 'Ted'); + my $obj_empty = $obj->with_roles(); + is $obj_empty->name, 'Ted', 'attribute'; + is $obj_empty->hello, 'hello Ted', 'method'; +}; + +subtest 'Single role' => sub { + my $obj = Mojo::RoleTest->with_roles('Mojo::RoleTest::Role::LOUD')->new; + is $obj->hello, 'HEY! BOB!!!', 'role method'; + is $obj->yell, 'HEY!', 'another role method'; +}; + +subtest 'Single role (shorthand)' => sub { + my $obj = Mojo::RoleTest->with_roles('+LOUD')->new; + is $obj->hello, 'HEY! BOB!!!', 'role method'; + is $obj->yell, 'HEY!', 'another role method'; +}; + +subtest 'Multiple roles' => sub { + my $obj + = Mojo::RoleTest->with_roles('Mojo::RoleTest::Role::quiet', 'Mojo::RoleTest::Role::LOUD')->new(name => 'Joel'); + is $obj->name, 'Joel', 'base attribute'; + is $obj->whisper, 'psst, joel', 'method from first role'; + $obj->prefix('psssst, '); + is $obj->whisper, 'psssst, joel', 'method from first role'; + is $obj->hello, 'HEY! JOEL!!!', 'method from second role'; +}; + +subtest 'Multiple roles (shorthand)' => sub { + my $obj = Mojo::RoleTest->with_roles('+quiet', '+LOUD')->new(name => 'Joel'); + is $obj->name, 'Joel', 'base attribute'; + is $obj->whisper, 'psst, joel', 'method from first role'; + is $obj->hello, 'HEY! JOEL!!!', 'method from second role'; +}; + +subtest 'Multiple roles (mixed)' => sub { + my $obj = Mojo::RoleTest->with_roles('Mojo::RoleTest::Role::quiet', '+LOUD')->new(name => 'Joel'); + is $obj->name, 'Joel', 'base attribute'; + is $obj->whisper, 'psst, joel', 'method from first role'; + is $obj->hello, 'HEY! JOEL!!!', 'method from second role'; +}; + +subtest 'Multiple object roles (mixed)' => sub { + my $obj = Mojo::RoleTest->new(name => 'Joel')->with_roles('Mojo::RoleTest::Role::quiet', '+LOUD'); + is $obj->name, 'Joel', 'base attribute'; + is $obj->whisper, 'psst, joel', 'method from first role'; + is $obj->hello, 'HEY! JOEL!!!', 'method from second role'; +}; + +subtest 'Multiple Mojo::Base roles' => sub { + my $obj = Mojo::RoleTest->with_roles('+quiet', 'Mojo::RoleTest::Hello')->new(name => 'Joel'); + is $obj->name, 'Joel', 'base attribute'; + is $obj->whisper, 'psst, joel', 'method from first role'; + is $obj->hello, 'hello mojo!', 'method from second role'; +}; + +subtest 'Classes that are not subclasses of Mojo::Base' => sub { + my $stream = Mojo::ByteStream->with_roles('Mojo::RoleTest::Hello')->new; + is $stream->hello, 'hello mojo!', 'right result'; + my $c = Mojo::Collection->with_roles('Mojo::RoleTest::Hello')->new; + is $c->hello, 'hello mojo!', 'right result'; + my $dom = Mojo::DOM->with_roles('Mojo::RoleTest::Hello')->new; + is $dom->hello, 'hello mojo!', 'right result'; + my $file = Mojo::File->with_roles('Mojo::RoleTest::Hello')->new; + is $file->hello, 'hello mojo!', 'right result'; +}; done_testing(); -