use strict;
use warnings;
use Test::More;
use Test::Fatal;
use Moose::Util 'find_meta';
# tests for extends without arguments
{
my $exception = exception {
package SubClassNoSuperClass;
use Moose;
extends;
};
like(
$exception,
qr/Must derive at least one class/,
"extends requires at least one argument");
isa_ok(
$exception,
'Moose::Exception::ExtendsMissingArgs',
"extends requires at least one argument");
}
{
my $exception = exception {
use Moose;
Moose->init_meta;
};
like(
$exception,
qr/Cannot call init_meta without specifying a for_class/,
"for_class is not given");
isa_ok(
$exception,
"Moose::Exception::InitMetaRequiresClass",
"for_class is not given");
}
{
my $exception = exception {
use Moose;
Moose->init_meta( (for_class => 'Foo2', metaclass => 'Foo2' ));
};
like(
$exception,
qr/\QThe Metaclass Foo2 must be loaded. (Perhaps you forgot to 'use Foo2'?)/,
"Foo2 is not loaded");
isa_ok(
$exception,
"Moose::Exception::MetaclassNotLoaded",
"Foo2 is not loaded");
is(
$exception->class_name,
"Foo2",
"Foo2 is not loaded");
}
{
{
package Foo3;
use Moose::Role;
}
my $exception = exception {
use Moose;
Moose->init_meta( (for_class => 'Foo3', metaclass => 'Foo3' ));
};
like(
$exception,
qr/\QThe Metaclass Foo3 must be a subclass of Moose::Meta::Class./,
"Foo3 is a Moose::Role");
isa_ok(
$exception,
"Moose::Exception::MetaclassMustBeASubclassOfMooseMetaClass",
"Foo3 is a Moose::Role");
is(
$exception->class_name,
"Foo3",
"Foo3 is a Moose::Role");
}
{
{
package Foo3;
use Moose::Role;
}
my $exception = exception {
use Moose;
Moose->init_meta( (for_class => 'Foo3' ));
};
my $foo3 = Foo3->meta;
like(
$exception,
qr/\QFoo3 already has a metaclass, but it does not inherit Moose::Meta::Class ($foo3). You cannot make the same thing a role and a class. Remove either Moose or Moose::Role./,
"Foo3 is a Moose::Role");
#Foo3 already has a metaclass, but it does not inherit Moose::Meta::Class (Moose::Meta::Role=HASH(0x29d3c78)). You cannot make the same thing a role and a class. Remove either Moose or Moose::Role.
isa_ok(
$exception,
"Moose::Exception::MetaclassIsARoleNotASubclassOfGivenMetaclass",
"Foo3 is a Moose::Role");
is(
$exception->role_name,
"Foo3",
"Foo3 is a Moose::Role");
is(
find_meta($exception->role_name),
Foo3->meta,
"Foo3 is a Moose::Role");
is(
$exception->metaclass,
"Moose::Meta::Class",
"Foo3 is a Moose::Role");
}
{
my $foo;
{
use Moose;
$foo = Class::MOP::Class->create("Foo4");
}
my $exception = exception {
use Moose;
Moose->init_meta( (for_class => 'Foo4' ));
};
like(
$exception,
qr/\QFoo4 already has a metaclass, but it does not inherit Moose::Meta::Class ($foo)./,
"Foo4 is a Class::MOP::Class, not a Moose::Meta::Class");
#Foo4 already has a metaclass, but it does not inherit Moose::Meta::Class (Class::MOP::Class=HASH(0x278a4a0)).
isa_ok(
$exception,
"Moose::Exception::MetaclassIsNotASubclassOfGivenMetaclass",
"Foo4 is a Class::MOP::Class, not a Moose::Meta::Class");
is(
$exception->class_name,
"Foo4",
"Foo4 is a Class::MOP::Class, not a Moose::Meta::Class");
is(
find_meta($exception->class_name),
$foo,
"Foo4 is a Class::MOP::Class, not a Moose::Meta::Class");
is(
$exception->metaclass,
"Moose::Meta::Class",
"Foo4 is a Class::MOP::Class, not a Moose::Meta::Class");
}
done_testing;