fix is subtype of (sortof)
[gitmo/MooseX-Types-Structured.git] / t / 06-api.t
1 BEGIN {
2         use strict;
3         use warnings;
4         use Test::More tests=>83;
5 }
6
7 use Moose::Util::TypeConstraints;
8 use MooseX::Types::Structured qw(Dict Tuple);
9 use MooseX::Types::Moose qw(Int Str Item Object ArrayRef HashRef);
10 use MooseX::Types -declare => [qw(
11     MyDict1 MyDict2 MyDict3 MyDict4 subMyDict3 subMyDict1
12     MyTuple1 MyTuple2 MyTuple3 subMyTuple3
13 )];
14
15 ## Create some sample Dicts
16
17 subtype MyDict1,
18  as Dict[name=>Str, age=>Int];
19
20 subtype subMyDict1,
21  as MyDict1;
22
23 subtype MyDict2,
24  as Dict[name=>Str, age=>Int];
25  
26 subtype MyDict3,
27  as Dict[key=>Int, anotherkey=>Str];
28  
29 subtype subMyDict3,
30  as MyDict3;
31
32 subtype MyDict4,
33  as Dict[name=>Str, age=>Item];
34
35 ## Create some sample Tuples
36
37 subtype MyTuple1,
38  as Tuple[Int,Int,Str];
39
40 subtype MyTuple2,
41  as Tuple[Int,Int,Str];
42  
43 subtype MyTuple3,
44  as Tuple[Object, HashRef];
45
46 subtype subMyTuple3,
47  as MyTuple3;
48
49 ## Test equals
50
51 ok ( MyDict1->equals(MyDict2), 'MyDict1 == MyDict2');
52 ok ( MyDict2->equals(MyDict1), 'MyDict2 == MyDict1');
53 ok (!MyDict1->equals(MyDict3), 'MyDict1 == MyDict3');
54 ok (!MyDict2->equals(MyDict3), 'MyDict2 == MyDict3');
55 ok (!MyDict3->equals(MyDict2), 'MyDict3 == MyDict2');
56 ok (!MyDict3->equals(MyDict1), 'MyDict3 == MyDict1');
57
58 ok ( MyTuple1->equals(MyTuple2), 'MyTuple1 == MyTuple2');
59 ok ( MyTuple2->equals(MyTuple1), 'MyTuple2 == MyTuple1');
60 ok (!MyTuple1->equals(MyTuple3), 'MyTuple1 == MyTuple3');
61 ok (!MyTuple2->equals(MyTuple3), 'MyTuple2 == MyTuple3');
62 ok (!MyTuple3->equals(MyTuple2), 'MyTuple3 == MyTuple2');
63 ok (!MyTuple3->equals(MyTuple1), 'MyTuple3 == MyTuple1');
64
65 ok ( MyDict1->equals(MyDict2), 'MyDict1 == MyDict2');
66 ok ( MyDict2->equals(MyDict1), 'MyDict2 == MyDict1');
67 ok (!MyDict1->equals(MyDict3), 'MyDict1 == MyDict3');
68 ok (!MyDict1->equals(MyDict4), 'MyDict1 == MyDict3');
69 ok (!MyDict2->equals(MyDict3), 'MyDict2 == MyDict3');
70 ok (!MyDict2->equals(MyDict4), 'MyDict2 == MyDict3');
71 ok (!MyDict3->equals(MyDict2), 'MyDict3 == MyDict2');
72 ok (!MyDict3->equals(MyDict4), 'MyDict3 == MyDict2');
73 ok (!MyDict3->equals(MyDict1), 'MyDict3 == MyDict1');
74 ok (!MyDict4->equals(MyDict1), 'MyDict3 == MyDict1');
75 ok (!MyDict4->equals(MyDict2), 'MyDict3 == MyDict1');
76 ok (!MyDict4->equals(MyDict3), 'MyDict3 == MyDict1');
77
78 ok ( MyTuple1->equals(MyTuple2), 'MyTuple1 == MyTuple2');
79 ok ( MyTuple2->equals(MyTuple1), 'MyTuple2 == MyTuple1');
80 ok (!MyTuple1->equals(MyTuple3), 'MyTuple1 == MyTuple3');
81 ok (!MyTuple2->equals(MyTuple3), 'MyTuple2 == MyTuple3');
82 ok (!MyTuple3->equals(MyTuple2), 'MyTuple3 == MyTuple2');
83 ok (!MyTuple3->equals(MyTuple1), 'MyTuple3 == MyTuple1');
84
85 ## Test is_a_type_of
86
87 ok ( MyDict1->is_a_type_of(HashRef), 'MyDict1 is_a_type_of HashRef');
88 ok ( MyDict1->is_a_type_of(Dict), 'MyDict1 is_a_type_of Dict');
89 ok (!MyDict1->is_a_type_of(Tuple), 'MyDict1 NOT is_a_type_of Tuple');
90 ok ( MyDict1->is_a_type_of(MyDict2), 'MyDict1 is_a_type_of MyDict2');
91 ok ( MyDict2->is_a_type_of(MyDict1), 'MyDict2 is_a_type_of MyDict1');
92 ok (!MyDict1->is_a_type_of(MyDict3), 'MyDict1 NOT is_a_type_of MyDict3');
93 ok (!MyDict2->is_a_type_of(MyDict3), 'MyDict2 NOT is_a_type_of MyDict3');
94 ok ( subMyDict1->is_a_type_of(Dict), 'subMyDict1 type of Dict');
95 ok ( subMyDict1->is_a_type_of(MyDict1), 'subMyDict1 type of MyDict1');
96 ok ( subMyDict1->is_a_type_of(subMyDict1), 'subMyDict1 type of subMyDict1');
97 ok ( subMyDict1->is_a_type_of(MyDict2), 'subMyDict1 type of MyDict2');
98 ok ( MyDict4->is_a_type_of(HashRef), 'MyDict4 is_a_type_of HashRef');
99 ok ( MyDict4->is_a_type_of(Dict), 'MyDict4 is_a_type_of Dict');
100 ok (!MyDict4->is_a_type_of(Tuple), 'MyDict4 NOT is_a_type_of Tuple');
101 ok (!MyDict4->is_a_type_of(MyDict2), 'MyDict4 NOT is_a_type_of MyDict2');
102 ok ( MyDict2->is_a_type_of(MyDict4), 'MyDict2 is_a_type_of MyDict4');
103 ok (!MyDict4->is_a_type_of(MyDict3), 'MyDict4 NOT is_a_type_of MyDict3');
104
105
106 ok ( MyTuple1->is_a_type_of(Tuple), 'MyTuple1 is_a_type_of Tuple');
107 ok (!MyTuple1->is_a_type_of(Dict), 'MyTuple1 NOT is_a_type_of Dict');
108 ok ( MyTuple1->is_a_type_of(MyTuple2), 'MyTuple1 is_a_type_of MyTuple2');
109 ok ( MyTuple2->is_a_type_of(MyTuple1), 'MyTuple2 is_a_type_of MyTuple1');
110 ok (!MyTuple1->is_a_type_of(MyTuple3), 'MyTuple1 NOT is_a_type_of MyTuple3');
111 ok (!MyTuple2->is_a_type_of(MyTuple3), 'MyTuple2 NOT is_a_type_of MyTuple3');
112
113 ## is_subtype_of
114
115 ok ( MyDict1->is_subtype_of(HashRef), 'MyDict1 is_subtype_of HashRef');
116 ok ( MyDict1->is_subtype_of(Dict), 'MyDict1 is_subtype_of Dict');
117 ok ( MyDict1->is_subtype_of(MyDict4), 'MyDict1 is_subtype_of MyDict4');
118 ok (!MyDict1->is_subtype_of(Tuple), 'MyDict1 NOT is_subtype_of Tuple');
119 ok (!MyDict1->is_subtype_of(MyDict2), 'MyDict1 NOT is_subtype_of MyDict2');
120 ok (!MyDict2->is_subtype_of(MyDict1), 'MyDict2 NOT is_subtype_of MyDict1');
121 ok (!MyDict1->is_subtype_of(MyDict3), 'MyDict1 NOT is_subtype_of MyDict3');
122 ok (!MyDict2->is_subtype_of(MyDict3), 'MyDict2 NOT is_subtype_of MyDict3');
123 ok ( subMyDict1->is_subtype_of(Dict), 'subMyDict1 is_subtype_of Dict');
124 ok ( subMyDict1->is_subtype_of(MyDict1), 'subMyDict1 is_subtype_of MyDict1');
125 ok (!subMyDict1->is_subtype_of(subMyDict1), 'subMyDict1 NOT is_subtype_of subMyDict1');
126 ok ( subMyDict1->is_subtype_of(MyDict2), 'subMyDict1 is_subtype_of MyDict2');
127
128 ok ( MyTuple1->is_subtype_of(Tuple), 'MyTuple1 is_subtype_of Tuple');
129 ok (!MyTuple1->is_subtype_of(Dict), 'MyTuple1 NOT is_subtype_of Dict');
130 ok (!MyTuple1->is_subtype_of(MyTuple2), 'MyTuple1 is_subtype_of MyTuple2');
131 ok (!MyTuple2->is_subtype_of(MyTuple1), 'MyTuple2 is_subtype_of MyTuple1');
132 ok (!MyTuple1->is_subtype_of(MyTuple3), 'MyTuple1 NOT is_subtype_of MyTuple3');
133 ok (!MyTuple2->is_subtype_of(MyTuple3), 'MyTuple2 NOT is_subtype_of MyTuple3');
134
135 ## Test manual parameterizing
136
137 PARAMETERIZE: {
138
139     ok (my $int = Moose::Util::TypeConstraints::find_or_parse_type_constraint('Int'), 'Got Int');
140     ok (my $str = Moose::Util::TypeConstraints::find_or_parse_type_constraint('Str'), 'Got Str');    
141     ok (my $hashref = Moose::Util::TypeConstraints::find_or_parse_type_constraint('HashRef[Int]'), 'Got HashRef');   
142
143     ## Test Dict->parameterize
144     ok (my $test_dict = Dict(), 'Created Test Dict');
145     ok (my $person = $test_dict->parameterize(name=>$str, age=>$int), 'Parameterized It');
146     ok ($person->check({name=>'John', age=>21}), 'Passed');
147     ok ($person->check({age=>25, name=>'User'}), 'Passed');
148     
149     ## Test Tuple->parameterize
150     ok (my $test_tuple = Tuple(), 'Created Test Tuple');
151     ok (my $int_and_hashref = $test_tuple->parameterize($int, $hashref), 'Parameterized It');
152     ok ($int_and_hashref->check([1, {key=>2, key2=>3}]), "Passed");
153     ok (!$int_and_hashref->check(['a', {key=>2, key2=>3}]), "Not Passed");    
154     ok (!$int_and_hashref->check([1, {key=>'a', key2=>3}]), "Not Passed");
155 }