From: Shawn M Moore Date: Sun, 28 Sep 2008 16:25:31 +0000 (+0000) Subject: Add throws_ok to Mouse::Util X-Git-Tag: 0.19~197 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=5816d47a9126679afa3e8d2575a25efa737b685d;p=gitmo%2FMouse.git Add throws_ok to Mouse::Util --- diff --git a/lib/Mouse/Util.pm b/lib/Mouse/Util.pm index 967b784..d4550b3 100644 --- a/lib/Mouse/Util.pm +++ b/lib/Mouse/Util.pm @@ -119,6 +119,51 @@ our %dependencies = ( }, # ^^^^^ CODE TAKEN FROM MRO::COMPAT ^^^^^ }, + 'Test::Exception' => { +# VVVVV CODE TAKEN FROM TEST::EXCEPTION VVVVV + 'throws_ok' => do { + my $_is_exception = sub { + my $exception = shift; + return ref $exception || $exception ne ''; + }; + + my $exception_as_string = sub { + my ( $prefix, $exception ) = @_; + return "$prefix normal exit" unless _is_exception( $exception ); + my $class = ref $exception; + $exception = "$class ($exception)" + if $class && "$exception" !~ m/^\Q$class/; + chomp $exception; + return "$prefix $exception"; + }; + + sub (&$;$) { + my ( $coderef, $expecting, $description ) = @_; + Carp::croak "throws_ok: must pass exception class/object or regex" + unless defined $expecting; + $description = $exception_as_string->( "threw", $expecting ) + unless defined $description; + my $exception = do { + eval { $coderef->() }; + $@; + }; + + my $regex = $Test::Builder::Tester->maybe_regex( $expecting ); + my $ok = $regex + ? ( $exception =~ m/$regex/ ) + : eval { + $exception->isa( ref $expecting ? ref $expecting : $expecting ) + }; + $Test::Builder::Tester->ok( $ok, $description ); + unless ( $ok ) { + $Test::Builder::Tester->diag( $exception_as_string->( "expecting:", $expecting ) ); + $Test::Builder::Tester->diag( $exception_as_string->( "found:", $exception ) ); + }; + $@ = $exception; + return $ok; + }, + }, + }, ); our @EXPORT_OK = map { keys %$_ } values %dependencies;