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;