X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F020_attributes%2F012_misc_attribute_tests.t;h=7f855a3ada1cefefdf707168497005cf2f72ecbc;hb=4d438a84f437bcb3c43a04c27823b8b431cd3f55;hp=ead297998ea901529b4038354e12ffa37514668a;hpb=26fbace8d6e64e26057f3778161dd7029f517b6a;p=gitmo%2FMoose.git diff --git a/t/020_attributes/012_misc_attribute_tests.t b/t/020_attributes/012_misc_attribute_tests.t index ead2979..7f855a3 100644 --- a/t/020_attributes/012_misc_attribute_tests.t +++ b/t/020_attributes/012_misc_attribute_tests.t @@ -3,12 +3,9 @@ use strict; use warnings; -use Test::More tests => 40; +use Test::More; use Test::Exception; -BEGIN { - use_ok('Moose'); -} { { @@ -19,7 +16,8 @@ BEGIN { documentation => q{ The 'foo' attribute is my favorite attribute in the whole wide world. - } + }, + is => 'bare', ); } @@ -87,6 +85,28 @@ BEGIN { { { + package Test::Arrayref::RoleAttributes::Role; + use Moose::Role; + + has [qw(foo bar baz)] => ( + is => 'rw', + ); + + } + { + package Test::Arrayref::RoleAttributes; + use Moose; + with 'Test::Arrayref::RoleAttributes::Role'; + } + + my $test = Test::Arrayref::RoleAttributes->new; + isa_ok($test, 'Test::Arrayref::RoleAttributes'); + can_ok($test, qw(foo bar baz)); + +} + +{ + { package Test::UndefDefault::Attributes; use Moose; @@ -120,7 +140,8 @@ BEGIN { throws_ok { $moose_obj->a_str( $moose_obj ) - } qr/Attribute \(a_str\) does not pass the type constraint \(Str\) with OverloadedStr\=HASH\(.*?\)/, '... dies without overloading the string'; + } qr/Attribute \(a_str\) does not pass the type constraint because\: Validation failed for 'Str' with value OverloadedStr=HASH\(0x.+?\)/, + '... dies without overloading the string'; } @@ -134,7 +155,8 @@ BEGIN { throws_ok { OverloadBreaker->new; - } qr/Attribute \(a_num\) does not pass the type constraint \(Int\) with \'7\.5\'/, '... this doesnt trip overload to break anymore '; + } qr/Attribute \(a_num\) does not pass the type constraint because\: Validation failed for 'Int' with value 7\.5/, + '... this doesnt trip overload to break anymore '; lives_ok { OverloadBreaker->new(a_num => 5); @@ -162,6 +184,18 @@ BEGIN { is($instance->foo, 'works', "foo builder works"); } +{ + { + package Test::Builder::Attribute::Broken; + use Moose; + + has 'foo' => ( required => 1, builder => 'build_foo', is => 'ro'); + } + + dies_ok { + Test::Builder::Attribute::Broken->new; + } '... no builder, wtf'; +} { @@ -171,8 +205,9 @@ BEGIN { has 'foo' => ( lazy_build => 1, is => 'ro'); has '_foo' => ( lazy_build => 1, is => 'ro'); - sub build_foo { return "works" }; - sub _build_foo { return "works too" }; + has 'fool' => ( lazy_build => 1, is => 'ro'); + sub _build_foo { return "works" }; + sub _build__foo { return "works too" }; } my $meta = Test::LazyBuild::Attribute->meta; @@ -180,27 +215,26 @@ BEGIN { my $_foo_attr = $meta->get_attribute("_foo"); ok($foo_attr->is_lazy, "foo is lazy"); - ok($foo_attr->is_required, "foo is required"); ok($foo_attr->is_lazy_build, "foo is lazy_build"); ok($foo_attr->has_clearer, "foo has clearer"); is($foo_attr->clearer, "clear_foo", ".. and it's named clear_foo"); ok($foo_attr->has_builder, "foo has builder"); - is($foo_attr->builder, "build_foo", ".. and it's named build_foo"); + is($foo_attr->builder, "_build_foo", ".. and it's named build_foo"); ok($foo_attr->has_predicate, "foo has predicate"); is($foo_attr->predicate, "has_foo", ".. and it's named has_foo"); ok($_foo_attr->is_lazy, "_foo is lazy"); - ok($_foo_attr->is_required, "_foo is required"); + ok(!$_foo_attr->is_required, "lazy_build attributes are no longer automatically required"); ok($_foo_attr->is_lazy_build, "_foo is lazy_build"); ok($_foo_attr->has_clearer, "_foo has clearer"); is($_foo_attr->clearer, "_clear_foo", ".. and it's named _clear_foo"); ok($_foo_attr->has_builder, "_foo has builder"); - is($_foo_attr->builder, "_build_foo", ".. and it's named _build_foo"); + is($_foo_attr->builder, "_build__foo", ".. and it's named _build_foo"); ok($_foo_attr->has_predicate, "_foo has predicate"); is($_foo_attr->predicate, "_has_foo", ".. and it's named _has_foo"); @@ -210,6 +244,34 @@ BEGIN { ok(!$instance->_has_foo, "noo _foo value yet"); is($instance->foo, 'works', "foo builder works"); is($instance->_foo, 'works too', "foo builder works too"); + throws_ok { $instance->fool } + qr/Test::LazyBuild::Attribute does not support builder method \'_build_fool\' for attribute \'fool\'/, + "Correct error when a builder method is not present"; + +} + +{ + package OutOfClassTest; + + use Moose; +} + +lives_ok { OutOfClassTest::has('foo', is => 'bare'); } 'create attr via direct sub call'; +lives_ok { OutOfClassTest->can('has')->('bar', is => 'bare'); } 'create attr via can'; + +ok(OutOfClassTest->meta->get_attribute('foo'), 'attr created from sub call'); +ok(OutOfClassTest->meta->get_attribute('bar'), 'attr created from can'); + + +{ + { + package Foo; + use Moose; + + ::throws_ok { has 'foo' => ( 'ro', isa => 'Str' ) } + qr/^Usage/, 'has throws error with odd number of attribute options'; + } } +done_testing;