BEGIN {
use strict;
use warnings;
- use Test::More tests=>42;
+ use Test::More tests=>47;
use Test::Exception;
}
package Test::MooseX::Meta::TypeConstraint::Structured;
use Moose;
- use MooseX::Types::Structured qw(Tuple Dict);
+ use MooseX::Types::Structured qw(Tuple Dict Optional);
+ use MooseX::Types::Moose qw(Int Str Object ArrayRef HashRef Maybe);
+ use MooseX::Types -declare => [qw(MyString)];
use Moose::Util::TypeConstraints;
- subtype 'MyString',
+ subtype MyString,
as 'Str',
where { $_=~m/abc/};
- has 'tuple' => (is=>'rw', isa=>Tuple['Int', 'Str', 'MyString']);
- has 'dict' => (is=>'rw', isa=>Dict[name=>'Str', age=>'Int']);
- has 'dict_with_maybe' => (is=>'rw', isa=>Dict[name=>'Str', age=>'Maybe[Int]']);
- has 'tuple_with_param' => (is=>'rw', isa=>Tuple['Int', 'Str', 'ArrayRef[Int]']);
- has 'tuple_with_maybe' => (is=>'rw', isa=>Tuple['Int', 'Str', 'Maybe[Int]']);
- has 'dict_with_tuple' => (is=>'rw', isa=>Dict[key1=>'Str', key2=>Tuple['Int','Str']]);
- has 'optional_tuple' => (is=>'rw', isa=>Tuple['Int', 'Int'],['Int'] );
- has 'optional_dict' => (is=>'rw', isa=>Dict[key1=>'Int'],[key2=>'Int'] );
-
+ has 'tuple' => (is=>'rw', isa=>Tuple[Int, Str, MyString]);
+ has 'dict' => (is=>'rw', isa=>Dict[name=>Str, age=>Int]);
+ has 'dict_with_maybe' => (is=>'rw', isa=>Dict[name=>Str, age=>Maybe[Int]]);
+ has 'tuple_with_param' => (is=>'rw', isa=>Tuple[Int, Str, ArrayRef[Int]]);
+ has 'tuple_with_maybe' => (is=>'rw', isa=>Tuple[Int, Str, Maybe[Int]]);
+ has 'dict_with_tuple' => (is=>'rw', isa=>Dict[key1=>Str, key2=>Tuple[Int,Str]]);
+ has 'optional_tuple' => (is=>'rw', isa=>Tuple[Int, Int, Optional[Int]] );
+ has 'optional_dict' => (is=>'rw', isa=>Dict[key1=>Int, Optional[key2=>Int]] );
+ has 'dict_with_tuple_with_union' => (is=>'rw', isa=>Dict[key1=>Str|Object, key2=>Tuple[Int,Str|Object]] );
+
has 'crazy' => (
is=>'rw',
isa=>Tuple
## First ArrayRef Arg is the required type constraints for the top
## level Tuple.
[
- 'Int',
- 'MyString',
+ Int,
+ MyString,
## The third required element is a Dict type constraint, which
## itself has two required keys and a third optional key.
- Dict
- [name=>'Str',age=>'Int'],
- [visits=>'Int']
- ],
- ## Second ArrayRef Arg defines the optional constraints for the top
- ## level Tuple.
- [
- 'Int',
- ## This Tuple has one required type constraint and two optional.
- Tuple
- ['Int'],
- ['Int','HashRef'],
- ],
+ Dict[name=>Str,age=>Int, Optional[visits=>Int]],
+ Optional[
+ Int,
+ ## This Tuple has one required type constraint and two optional.
+ Tuple[Int, Optional[Int,HashRef]],
+ ],
+ ],
);
}
$record->optional_dict({key1=>1,key2=>'bad'});
}, qr/Validation failed for 'Int'/
=> 'Properly failed for bad value in optional bit';
-
\ No newline at end of file
+
+
+## Test dict_with_tuple_with_union: Dict[key1=>'Str|Object', key2=>Tuple['Int','Str|Object']]
+
+lives_ok sub {
+ $record->dict_with_tuple_with_union({key1=>'Hello', key2=>[1,'World']});
+} => 'Set tuple attribute without error';
+
+throws_ok sub {
+ $record->dict_with_tuple_with_union({key1=>'Hello', key2=>['World',2]});
+}, qr/Validation failed for 'Int'/
+ => 'Threw error on bad constraint';
+
+lives_ok sub {
+ $record->dict_with_tuple_with_union({key1=>$record, key2=>[1,'World']});
+} => 'Set tuple attribute without error';
+
+lives_ok sub {
+ $record->dict_with_tuple_with_union({key1=>'Hello', key2=>[1,$record]});
+} => 'Set tuple attribute without error';
+
+throws_ok sub {
+ $record->dict_with_tuple_with_union({key1=>1, key2=>['World',2]});
+}, qr/Validation failed for 'Int'/
+ => 'Threw error on bad constraint';