X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F050_metaclasses%2F012_moose_exporter.t;h=d693b8349e8aff7bfbf670106b161595c26d0bd4;hb=3b400403de25dc3988b05a7b56a714db8f57f029;hp=612196dfb27bef6b15891ab6d9fb9d0005791876;hpb=e606ae5f848070d889472329819c95f5ba763ca3;p=gitmo%2FMoose.git diff --git a/t/050_metaclasses/012_moose_exporter.t b/t/050_metaclasses/012_moose_exporter.t index 612196d..d693b83 100644 --- a/t/050_metaclasses/012_moose_exporter.t +++ b/t/050_metaclasses/012_moose_exporter.t @@ -5,14 +5,9 @@ use warnings; use Test::More; use Test::Exception; - BEGIN { - unless ( eval 'use Test::Warn; 1' ) { - plan skip_all => 'These tests require Test::Warn'; - } - else { - plan tests => 40; - } + eval "use Test::Output;"; + plan skip_all => "Test::Output is required for this test" if $@; } @@ -23,7 +18,7 @@ BEGIN { no Moose; - ::warning_is( sub { eval q[sub make_immutable { return 'foo' }] }, + ::stderr_is( sub { eval q[sub make_immutable { return 'foo' }] }, '', 'no warning when defining our own make_immutable sub' ); } @@ -76,13 +71,13 @@ BEGIN { use Moose (); sub wrapped1 { - my $caller = shift; - return $caller . ' called wrapped1'; + my $meta = shift; + return $meta->name . ' called wrapped1'; } Moose::Exporter->setup_import_methods( - with_caller => ['wrapped1'], - also => 'Moose', + with_meta => ['wrapped1'], + also => 'Moose', ); } @@ -116,7 +111,7 @@ BEGIN { use Moose (); sub wrapped2 { - my $caller = shift; + my $caller = shift->name; return $caller . ' called wrapped2'; } @@ -125,9 +120,9 @@ BEGIN { } Moose::Exporter->setup_import_methods( - with_caller => ['wrapped2'], - as_is => ['as_is1'], - also => 'MooseX::Sugar', + with_meta => ['wrapped2'], + as_is => ['as_is1'], + also => 'MooseX::Sugar', ); } @@ -214,13 +209,13 @@ BEGIN { ::like( $@, - qr/\QCircular reference in also parameter to MooseX::Exporter between MooseX::CircularAlso and MooseX::CircularAlso/, + qr/\QCircular reference in 'also' parameter to Moose::Exporter between MooseX::CircularAlso and MooseX::CircularAlso/, 'got the expected error from circular reference in also' ); } { - package MooseX::CircularAlso; + package MooseX::NoAlso; use Moose (); @@ -235,7 +230,164 @@ BEGIN { ::like( $@, - qr/\QPackage in also (NoSuchThing) does not seem to use MooseX::Exporter/, + qr/\QPackage in also (NoSuchThing) does not seem to use Moose::Exporter (is it loaded?) at /, + 'got the expected error from a reference in also to a package which is not loaded' + ); +} + +{ + package MooseX::NotExporter; + + use Moose (); + + ::dies_ok( + sub { + Moose::Exporter->setup_import_methods( + also => [ 'Moose::Meta::Method' ], + ); + }, + 'a package which does not use Moose::Exporter in also dies with an error' + ); + + ::like( + $@, + qr/\QPackage in also (Moose::Meta::Method) does not seem to use Moose::Exporter at /, 'got the expected error from a reference in also to a package which does not use Moose::Exporter' ); } + +{ + package MooseX::OverridingSugar; + + use Moose (); + + sub has { + my $caller = shift->name; + return $caller . ' called has'; + } + + Moose::Exporter->setup_import_methods( + with_meta => ['has'], + also => 'Moose', + ); +} + +{ + package WantsOverridingSugar; + + MooseX::OverridingSugar->import(); + + ::can_ok( 'WantsOverridingSugar', 'has' ); + ::can_ok( 'WantsOverridingSugar', 'with' ); + ::is( has('foo'), 'WantsOverridingSugar called has', + 'has from MooseX::OverridingSugar is called, not has from Moose' ); + + MooseX::OverridingSugar->unimport(); +} + +{ + ok( ! WantsSugar->can('has'), 'WantsSugar::has() has been cleaned' ); + ok( ! WantsSugar->can('with'), 'WantsSugar::with() has been cleaned' ); +} + +{ + package NonExistentExport; + + use Moose (); + + ::stderr_like { + Moose::Exporter->setup_import_methods( + also => ['Moose'], + with_meta => ['does_not_exist'], + ); + } qr/^Trying to export undefined sub NonExistentExport::does_not_exist/, + "warns when a non-existent method is requested to be exported"; +} + +{ + package WantsNonExistentExport; + + NonExistentExport->import; + + ::ok(!__PACKAGE__->can('does_not_exist'), + "undefined subs do not get exported"); +} + +{ + package AllOptions; + use Moose (); + use Moose::Deprecated -api_version => '0.88'; + use Moose::Exporter; + + Moose::Exporter->setup_import_methods( + also => ['Moose'], + with_meta => [ 'with_meta1', 'with_meta2' ], + with_caller => [ 'with_caller1', 'with_caller2' ], + as_is => ['as_is1'], + ); + + sub with_caller1 { + return @_; + } + + sub with_caller2 (&) { + return @_; + } + + sub as_is1 {2} + + sub with_meta1 { + return @_; + } + + sub with_meta2 (&) { + return @_; + } +} + +{ + package UseAllOptions; + + AllOptions->import(); +} + +{ + can_ok( 'UseAllOptions', $_ ) + for qw( with_meta1 with_meta2 with_caller1 with_caller2 as_is1 ); + + { + my ( $caller, $arg1 ) = UseAllOptions::with_caller1(42); + is( $caller, 'UseAllOptions', 'with_caller wrapped sub gets the right caller' ); + is( $arg1, 42, 'with_caller wrapped sub returns argument it was passed' ); + } + + { + my ( $meta, $arg1 ) = UseAllOptions::with_meta1(42); + isa_ok( $meta, 'Moose::Meta::Class', 'with_meta first argument' ); + is( $arg1, 42, 'with_meta1 returns argument it was passed' ); + } + + is( + prototype( UseAllOptions->can('with_caller2') ), + prototype( AllOptions->can('with_caller2') ), + 'using correct prototype on with_meta function' + ); + + is( + prototype( UseAllOptions->can('with_meta2') ), + prototype( AllOptions->can('with_meta2') ), + 'using correct prototype on with_meta function' + ); +} + +{ + package UseAllOptions; + AllOptions->unimport(); +} + +{ + ok( ! UseAllOptions->can($_), "UseAllOptions::$_ has been unimported" ) + for qw( with_meta1 with_meta2 with_caller1 with_caller2 as_is1 ); +} + +done_testing;