X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F070_immutable_metaclass.t;h=c88d91404a6a39e644f24ed92d054f93e711a57d;hb=565f0cbbe40a1aa08b7b85574c408dc7e58b2211;hp=17407c9c435b27546b27c2a100783b31702ef8be;hpb=857f87a765627171a17f4bc588bcdf9db4da9f09;p=gitmo%2FClass-MOP.git diff --git a/t/070_immutable_metaclass.t b/t/070_immutable_metaclass.t index 17407c9..c88d914 100644 --- a/t/070_immutable_metaclass.t +++ b/t/070_immutable_metaclass.t @@ -3,74 +3,99 @@ use strict; use warnings; -use Test::More tests => 80; +use Test::More tests => 83; use Test::Exception; BEGIN { use_ok('Class::MOP'); - use_ok('Class::MOP::Class::Immutable'); } { package Foo; - + use strict; use warnings; use metaclass; - + __PACKAGE__->meta->add_attribute('bar'); - + package Bar; - + use strict; use warnings; use metaclass; - + __PACKAGE__->meta->superclasses('Foo'); - __PACKAGE__->meta->add_attribute('baz'); - + __PACKAGE__->meta->add_attribute('baz'); + package Baz; - + use strict; use warnings; use metaclass; - + __PACKAGE__->meta->superclasses('Bar'); - __PACKAGE__->meta->add_attribute('bah'); + __PACKAGE__->meta->add_attribute('bah'); +} + +{ + my $meta = Foo->meta; + + my $transformer; + lives_ok{ $transformer = $meta->create_immutable_transformer } + "Created immutable transformer"; + isa_ok($transformer, 'Class::MOP::Immutable', '... transformer isa Class::MOP::Immutable'); + my $methods = $transformer->create_methods_for_immutable_metaclass; + + my $immutable_metaclass = $transformer->immutable_metaclass; + is($transformer->metaclass, $meta, '... transformer has correct metaclass'); + ok($immutable_metaclass->is_anon_class, '... immutable_metaclass is an anonymous class'); + + #I don't understand why i need to ->meta here... + my $obj = $immutable_metaclass->name; + ok(!$obj->is_mutable, '... immutable_metaclass is not mutable'); + ok($obj->is_immutable, '... immutable_metaclass is immutable'); + ok(!$obj->make_immutable, '... immutable_metaclass make_mutable is noop'); + is($obj->meta, $immutable_metaclass, '... immutable_metaclass meta hack works'); + + is_deeply( + [ $immutable_metaclass->superclasses ], + [ $meta->blessed ], + '... immutable_metaclass superclasses are correct' + ); + ok($immutable_metaclass->has_method('get_mutable_metaclass_name')); + } { my $meta = Foo->meta; is($meta->name, 'Foo', '... checking the Foo metaclass'); - + ok($meta->is_mutable, '... our class is mutable'); - ok(!$meta->is_immutable, '... our class is not immutable'); + ok(!$meta->is_immutable, '... our class is not immutable'); lives_ok { $meta->make_immutable(); } '... changed Foo to be immutable'; - + ok(!$meta->make_immutable, '... make immutable now returns nothing'); - + ok(!$meta->is_mutable, '... our class is no longer mutable'); - ok($meta->is_immutable, '... our class is now immutable'); + ok($meta->is_immutable, '... our class is now immutable'); - isa_ok($meta, 'Class::MOP::Class::Immutable'); isa_ok($meta, 'Class::MOP::Class'); - dies_ok { $meta->reinitialize() } '... exception thrown as expected'; - dies_ok { $meta->add_method() } '... exception thrown as expected'; dies_ok { $meta->alias_method() } '... exception thrown as expected'; dies_ok { $meta->remove_method() } '... exception thrown as expected'; - + dies_ok { $meta->add_attribute() } '... exception thrown as expected'; dies_ok { $meta->remove_attribute() } '... exception thrown as expected'; - - dies_ok { $meta->add_package_variable() } '... exception thrown as expected'; - dies_ok { $meta->remove_package_variable() } '... exception thrown as expected'; + + dies_ok { $meta->add_package_symbol() } '... exception thrown as expected'; + dies_ok { $meta->remove_package_symbol() } '... exception thrown as expected'; my @supers; lives_ok { @@ -78,23 +103,23 @@ BEGIN { } '... got the superclasses okay'; dies_ok { $meta->superclasses([ 'UNIVERSAL' ]) } '... but could not set the superclasses okay'; - + my $meta_instance; lives_ok { $meta_instance = $meta->get_meta_instance; } '... got the meta instance okay'; isa_ok($meta_instance, 'Class::MOP::Instance'); is($meta_instance, $meta->get_meta_instance, '... and we know it is cached'); - + my @cpl; lives_ok { @cpl = $meta->class_precedence_list; - } '... got the class precedence list okay'; + } '... got the class precedence list okay'; is_deeply( \@cpl, [ 'Foo' ], '... we just have ourselves in the class precedence list'); - + my @attributes; lives_ok { @attributes = $meta->compute_all_applicable_attributes; @@ -107,34 +132,31 @@ BEGIN { { my $meta = Bar->meta; - is($meta->name, 'Bar', '... checking the Bar metaclass'); - + is($meta->name, 'Bar', '... checking the Bar metaclass'); + ok($meta->is_mutable, '... our class is mutable'); - ok(!$meta->is_immutable, '... our class is not immutable'); + ok(!$meta->is_immutable, '... our class is not immutable'); lives_ok { $meta->make_immutable(); } '... changed Bar to be immutable'; - + ok(!$meta->make_immutable, '... make immutable now returns nothing'); - + ok(!$meta->is_mutable, '... our class is no longer mutable'); - ok($meta->is_immutable, '... our class is now immutable'); + ok($meta->is_immutable, '... our class is now immutable'); - isa_ok($meta, 'Class::MOP::Class::Immutable'); isa_ok($meta, 'Class::MOP::Class'); - dies_ok { $meta->reinitialize() } '... exception thrown as expected'; - dies_ok { $meta->add_method() } '... exception thrown as expected'; dies_ok { $meta->alias_method() } '... exception thrown as expected'; dies_ok { $meta->remove_method() } '... exception thrown as expected'; - + dies_ok { $meta->add_attribute() } '... exception thrown as expected'; dies_ok { $meta->remove_attribute() } '... exception thrown as expected'; - - dies_ok { $meta->add_package_variable() } '... exception thrown as expected'; - dies_ok { $meta->remove_package_variable() } '... exception thrown as expected'; + + dies_ok { $meta->add_package_symbol() } '... exception thrown as expected'; + dies_ok { $meta->remove_package_symbol() } '... exception thrown as expected'; my @supers; lives_ok { @@ -142,23 +164,23 @@ BEGIN { } '... got the superclasses okay'; dies_ok { $meta->superclasses([ 'UNIVERSAL' ]) } '... but could not set the superclasses okay'; - + my $meta_instance; lives_ok { $meta_instance = $meta->get_meta_instance; } '... got the meta instance okay'; isa_ok($meta_instance, 'Class::MOP::Instance'); - is($meta_instance, $meta->get_meta_instance, '... and we know it is cached'); - + is($meta_instance, $meta->get_meta_instance, '... and we know it is cached'); + my @cpl; lives_ok { @cpl = $meta->class_precedence_list; - } '... got the class precedence list okay'; + } '... got the class precedence list okay'; is_deeply( \@cpl, [ 'Bar', 'Foo'], '... we just have ourselves in the class precedence list'); - + my @attributes; lives_ok { @attributes = $meta->compute_all_applicable_attributes; @@ -171,34 +193,31 @@ BEGIN { { my $meta = Baz->meta; - is($meta->name, 'Baz', '... checking the Baz metaclass'); - + is($meta->name, 'Baz', '... checking the Baz metaclass'); + ok($meta->is_mutable, '... our class is mutable'); - ok(!$meta->is_immutable, '... our class is not immutable'); + ok(!$meta->is_immutable, '... our class is not immutable'); lives_ok { $meta->make_immutable(); } '... changed Baz to be immutable'; - + ok(!$meta->make_immutable, '... make immutable now returns nothing'); - + ok(!$meta->is_mutable, '... our class is no longer mutable'); - ok($meta->is_immutable, '... our class is now immutable'); + ok($meta->is_immutable, '... our class is now immutable'); - isa_ok($meta, 'Class::MOP::Class::Immutable'); isa_ok($meta, 'Class::MOP::Class'); - dies_ok { $meta->reinitialize() } '... exception thrown as expected'; - dies_ok { $meta->add_method() } '... exception thrown as expected'; dies_ok { $meta->alias_method() } '... exception thrown as expected'; dies_ok { $meta->remove_method() } '... exception thrown as expected'; - + dies_ok { $meta->add_attribute() } '... exception thrown as expected'; dies_ok { $meta->remove_attribute() } '... exception thrown as expected'; - - dies_ok { $meta->add_package_variable() } '... exception thrown as expected'; - dies_ok { $meta->remove_package_variable() } '... exception thrown as expected'; + + dies_ok { $meta->add_package_symbol() } '... exception thrown as expected'; + dies_ok { $meta->remove_package_symbol() } '... exception thrown as expected'; my @supers; lives_ok { @@ -206,23 +225,23 @@ BEGIN { } '... got the superclasses okay'; dies_ok { $meta->superclasses([ 'UNIVERSAL' ]) } '... but could not set the superclasses okay'; - + my $meta_instance; lives_ok { $meta_instance = $meta->get_meta_instance; } '... got the meta instance okay'; isa_ok($meta_instance, 'Class::MOP::Instance'); - is($meta_instance, $meta->get_meta_instance, '... and we know it is cached'); - + is($meta_instance, $meta->get_meta_instance, '... and we know it is cached'); + my @cpl; lives_ok { @cpl = $meta->class_precedence_list; - } '... got the class precedence list okay'; + } '... got the class precedence list okay'; is_deeply( \@cpl, [ 'Baz', 'Bar', 'Foo'], '... we just have ourselves in the class precedence list'); - + my @attributes; lives_ok { @attributes = $meta->compute_all_applicable_attributes;