summaryrefslogtreecommitdiff
path: root/t/exceptions/class-mop-attribute.t
diff options
context:
space:
mode:
Diffstat (limited to 't/exceptions/class-mop-attribute.t')
-rw-r--r--t/exceptions/class-mop-attribute.t213
1 files changed, 213 insertions, 0 deletions
diff --git a/t/exceptions/class-mop-attribute.t b/t/exceptions/class-mop-attribute.t
new file mode 100644
index 0000000..d710699
--- /dev/null
+++ b/t/exceptions/class-mop-attribute.t
@@ -0,0 +1,213 @@
+use strict;
+use warnings;
+
+use Test::More;
+use Test::Fatal;
+
+use Moose();
+
+{
+ my $exception = exception {
+ my $class = Class::MOP::Attribute->new;
+ };
+
+ like(
+ $exception,
+ qr/You must provide a name for the attribute/,
+ "no attribute name given to new");
+
+ isa_ok(
+ $exception,
+ "Moose::Exception::MOPAttributeNewNeedsAttributeName",
+ "no attribute name given to new");
+}
+
+{
+ my $exception = exception {
+ Class::MOP::Attribute->new( "foo", ( builder => [123] ));
+ };
+
+ like(
+ $exception,
+ qr/builder must be a defined scalar value which is a method name/,
+ "an array ref is given as builder");
+
+ isa_ok(
+ $exception,
+ "Moose::Exception::BuilderMustBeAMethodName",
+ "an array ref is given as builder");
+}
+
+{
+ my $exception = exception {
+ Class::MOP::Attribute->new( "foo", ( builder => "bar", default => "xyz" ));
+ };
+
+ like(
+ $exception,
+ qr/\QSetting both default and builder is not allowed./,
+ "builder & default, both are given");
+
+ isa_ok(
+ $exception,
+ "Moose::Exception::BothBuilderAndDefaultAreNotAllowed",
+ "builder & default, both are given");
+}
+
+{
+ my $exception = exception {
+ Class::MOP::Attribute->new( "foo", ( default => [1] ) );
+ };
+
+ like(
+ $exception,
+ qr/\QReferences are not allowed as default values, you must wrap the default of 'foo' in a CODE reference (ex: sub { [] } and not [])/,
+ "default value can't take references");
+
+ isa_ok(
+ $exception,
+ "Moose::Exception::ReferencesAreNotAllowedAsDefault",
+ "default value can't take references");
+
+ is(
+ $exception->attribute_name,
+ "foo",
+ "default value can't take references");
+}
+
+{
+ my $exception = exception {
+ Class::MOP::Attribute->new( "foo", ( required => 1, init_arg => undef ) );
+ };
+
+ like(
+ $exception,
+ qr/A required attribute must have either 'init_arg', 'builder', or 'default'/,
+ "no 'init_arg', 'builder' or 'default' is given");
+
+ isa_ok(
+ $exception,
+ "Moose::Exception::RequiredAttributeLacksInitialization",
+ "no 'init_arg', 'builder' or 'default' is given");
+}
+
+{
+ my $exception = exception {
+ my $foo = Class::MOP::Attribute->new("bar", ( required => 1, init_arg => undef, builder => 'foo'));
+ $foo->initialize_instance_slot( $foo->meta, $foo );
+ };
+
+ like(
+ $exception,
+ qr/\QClass::MOP::Attribute does not support builder method 'foo' for attribute 'bar'/,
+ "given builder method doesn't exist");
+
+ isa_ok(
+ $exception,
+ "Moose::Exception::BuilderMethodNotSupportedForAttribute",
+ "given builder method doesn't exist");
+
+ is(
+ $exception->attribute->name,
+ "bar",
+ "given builder method doesn't exist");
+
+ is(
+ $exception->attribute->builder,
+ "foo",
+ "given builder method doesn't exist");
+}
+
+{
+ my $exception = exception {
+ my $foo = Class::MOP::Attribute->new("foo");
+ $foo->attach_to_class( "Foo" );
+ };
+
+ like(
+ $exception,
+ qr/\QYou must pass a Class::MOP::Class instance (or a subclass)/,
+ "attach_to_class expects an instance Class::MOP::Class or its subclass");
+
+ isa_ok(
+ $exception,
+ "Moose::Exception::AttachToClassNeedsAClassMOPClassInstanceOrASubclass",
+ "attach_to_class expects an instance Class::MOP::Class or its subclass");
+
+ is(
+ $exception->attribute->name,
+ "foo",
+ "attach_to_class expects an instance Class::MOP::Class or its subclass");
+
+ is(
+ $exception->class,
+ "Foo",
+ "attach_to_class expects an instance Class::MOP::Class or its subclass");
+}
+
+{
+ my $array = ["foo"];
+ my $bar = Class::MOP::Attribute->new("bar", ( is => 'ro', predicate => $array));
+ my $exception = exception {
+ $bar->install_accessors;
+ };
+
+ like(
+ $exception,
+ qr!bad accessor/reader/writer/predicate/clearer format, must be a HASH ref!,
+ "an array reference is given to predicate");
+
+ isa_ok(
+ $exception,
+ "Moose::Exception::BadOptionFormat",
+ "an array reference is given to predicate");
+
+ is(
+ $exception->attribute->name,
+ "bar",
+ "an array reference is given to predicate");
+
+ is(
+ $exception->option_name,
+ "predicate",
+ "an array reference is given to predicate");
+
+ is(
+ $exception->option_value,
+ $array,
+ "an array reference is given to predicate");
+}
+
+{
+ my $bar = Class::MOP::Attribute->new("bar", ( is => 'ro', predicate => "foo"));
+ my $exception = exception {
+ $bar->install_accessors;
+ };
+
+ like(
+ $exception,
+ qr/\QCould not create the 'predicate' method for bar because : Can't call method "name" on an undefined value/,
+ "Can't call method 'name' on an undefined value");
+
+ isa_ok(
+ $exception,
+ "Moose::Exception::CouldNotCreateMethod",
+ "Can't call method 'name' on an undefined value");
+
+ is(
+ $exception->attribute->name,
+ "bar",
+ "Can't call method 'name' on an undefined value");
+
+ is(
+ $exception->option_name,
+ "predicate",
+ "Can't call method 'name' on an undefined value");
+
+ is(
+ $exception->option_value,
+ "foo",
+ "Can't call method 'name' on an undefined value");
+}
+
+done_testing;