I was hoping you'd reply Toby, thank you.
I made a couple of changes to the code so it compiles, and added a test to see that one can pass in the empty string and it will pass validation by being coerced to undef. But the syntax to do this must be wrong:
ok( $Caption->check( $Caption->coerce('') ), 'Empty string passes' );
... I feel sure that there's a way to avoid calling coerce manually.
Here's the revised test script:
use Types::Standard qw( Maybe Str );
use Types::Common::String qw( StrLength );
my $NonEmptyCaption = StrLength[ 1, 10 ];
my $EmptyStr = Str->where( q{ $_ eq '' } );
my $Caption = (Maybe[$NonEmptyCaption])->plus_coercions(
$EmptyStr => 'undef',
);
use Test::More;
ok( $Caption->check('My pic'), 'Good caption passes' );
ok( ! $Caption->check('This is too long'), 'Bad caption fails' );
ok( $Caption->check(undef), 'Undef passes' );
ok( ! $Caption->check([]), 'Arrayref fails' );
is( $Caption->coerce(''), undef, 'Empty string coerced to
+undef' );
ok( $Caption->check( $Caption->coerce('') ), 'Empty string passes' );
done_testing;
Outputs:
perl 11130005-3.pl
ok 1 - Good caption passes
ok 2 - Bad caption fails
ok 3 - Undef passes
ok 4 - Arrayref fails
ok 5 - Empty string coerced to undef
ok 6 - Empty string passes
1..6
Wonder if there is a more idiomatic way to do the check when a coercion is used. Thanks!
The way forward always starts with a minimal test.
|