X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F12-error.t;h=d66cd61f7b31a5b531c1cd0e3856fdda3111ac43;hb=68d0710ba681a67640606b965dc5756de252c8c1;hp=e480c2ac4ab3ec4bf9958c07f20bf3b1d5b80680;hpb=797510e368ab5ee7fbc25581fa484534aa0988d3;p=gitmo%2FMooseX-Types-Structured.git diff --git a/t/12-error.t b/t/12-error.t index e480c2a..d66cd61 100644 --- a/t/12-error.t +++ b/t/12-error.t @@ -1,20 +1,125 @@ BEGIN { use strict; use warnings; - use Test::More tests=>4; + use Test::More tests=>25; } use Moose::Util::TypeConstraints; -use MooseX::Types::Structured qw(Dict Tuple); +use MooseX::Types::Structured qw(Dict Tuple Optional); use MooseX::Types::Moose qw(Int Str ArrayRef HashRef); # Create some TCs from which errors will be generated + my $simple_tuple = subtype 'simple_tuple', as Tuple[Int,Str]; my $simple_dict = subtype 'simple_dict', as Dict[name=>Str,age=>Int]; -# We probably need more stuff here... +# Make sure the constraints we made validate as expected + ok $simple_tuple->check([1,'hello']), "simple_tuple validates: 1,'hello'"; ok !$simple_tuple->check(['hello',1]), "simple_tuple fails: 'hello',1"; -like $simple_tuple->validate(['hello',1]), qr/"hello", 1/, 'got expected valiate message'; -like $simple_dict->validate(['hello',1]), qr/"hello", 1/, 'got expected valiate message'; +ok $simple_dict->check({name=>'Vanessa',age=>34}), "simple_dict validates: {name=>'Vanessa',age=>34}"; +ok !$simple_dict->check({name=>$simple_dict,age=>'hello'}), "simple_dict fails: {name=>Object, age=>String}"; + +## Let's check all the expected validation errors for tuple + +like $simple_tuple->validate({a=>1,b=>2}), + qr/Validation failed for 'simple_tuple' failed with value { a: 1, b: 2 }/, + 'Wrong basic type'; + +like $simple_tuple->validate(['a','b']), + qr/failed for 'simple_tuple' failed with value \[ "a", "b" \]/, + 'Correctly failed due to "a" not an Int'; + +like $simple_tuple->validate([1,$simple_tuple]), + qr/Validation failed for 'simple_tuple' failed with value \[ 1, MooseX::Meta::TypeConstraint::Structured/, + 'Correctly failed due to object not a Str'; + +like $simple_tuple->validate([1]), + qr/Validation failed for 'Str' failed with value NULL/, + 'Not enought values'; + +like $simple_tuple->validate([1,'hello','too many']), + qr/More values than Type Constraints!/, + 'Too Many values'; + +## And the same thing for dicts [name=>Str,age=>Int] + +like $simple_dict->validate([1,2]), + qr/ failed with value \[ 1, 2 \]/, + 'Wrong basic type'; + +like $simple_dict->validate({name=>'John',age=>'a'}), + qr/failed for 'Int' failed with value a/, + 'Correctly failed due to age not an Int'; + +like $simple_dict->validate({name=>$simple_dict,age=>1}), + qr/failed with value { age: 1, name: MooseX:/, + 'Correctly failed due to object not a Str'; + +like $simple_dict->validate({name=>'John'}), + qr/failed for 'Int' failed with value NULL/, + 'Not enought values'; + +like $simple_dict->validate({name=>'Vincent', age=>15,extra=>'morethanIneed'}), + qr/More values than Type Constraints!/, + 'Too Many values'; + + ## TODO some with Optional (or Maybe) and slurpy + + my $optional_tuple = subtype 'optional_tuple', as Tuple[Int,Optional[Str]]; + my $optional_dict = subtype 'optional_dict', as Dict[name=>Str,age=>Optional[Int]]; + + like $optional_tuple->validate({a=>1,b=>2}), + qr/Validation failed for 'optional_tuple' failed with value { a: 1, b: 2 }/, + 'Wrong basic type'; + +like $optional_tuple->validate(['a','b']), + qr/failed for 'Int' failed with value a/, + 'Correctly failed due to "a" not an Int'; + +like $optional_tuple->validate([1,$simple_tuple]), + qr/failed for 'MooseX::Types::Structured::Optional\[Str\]' failed with value MooseX/, + 'Correctly failed due to object not a Str'; + +like $optional_tuple->validate([1,'hello','too many']), + qr/More values than Type Constraints!/, + 'Too Many values'; + +like $optional_dict->validate([1,2]), + qr/ failed with value \[ 1, 2 \]/, + 'Wrong basic type'; + +like $optional_dict->validate({name=>'John',age=>'a'}), + qr/Validation failed for 'MooseX::Types::Structured::Optional\[Int\]' failed with value a/, + 'Correctly failed due to age not an Int'; + +like $optional_dict->validate({name=>$simple_dict,age=>1}), + qr/failed with value { age: 1, name: MooseX:/, + 'Correctly failed due to object not a Str'; + +like $optional_dict->validate({name=>'Vincent', age=>15,extra=>'morethanIneed'}), + qr/More values than Type Constraints!/, + 'Too Many values'; + +## Deeper constraints + +my $deep_tuple = subtype 'deep_tuple', + as Tuple[ + Int, + HashRef, + Dict[ + name=>Str, + age=>Int, + ], + ]; + +ok $deep_tuple->check([1,{a=>2},{name=>'Vincent',age=>15}]), + 'Good Constraint'; + +like $deep_tuple->validate([1,{a=>2},{name=>'Vincent',age=>'Hello'}]), + qr/Error is: Validation failed for 'MooseX::Types::Structured::Dict\[name,Str,age,Int\]'/, + 'Example deeper error'; + +## Success Tests... +ok !$deep_tuple->validate([1,{a=>2},{name=>'John',age=>40}]), 'Validates ok';