Tidy test code
[gitmo/Moose.git] / t / type_constraints / union_types.t
CommitLineData
451c8248 1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
a28e50e4 6use Test::More;
451c8248 7
28fdde7f 8use Moose::Util::TypeConstraints;
451c8248 9
10my $Str = find_type_constraint('Str');
b53f21ca 11isa_ok( $Str, 'Moose::Meta::TypeConstraint' );
451c8248 12
13my $Undef = find_type_constraint('Undef');
b53f21ca 14isa_ok( $Undef, 'Moose::Meta::TypeConstraint' );
15
16ok( !$Str->check(undef), '... Str cannot accept an Undef value' );
17ok( $Str->check('String'), '... Str can accept an String value' );
18ok( !$Undef->check('String'), '... Undef cannot accept an Str value' );
19ok( $Undef->check(undef), '... Undef can accept an Undef value' );
20
21my $Str_or_Undef = Moose::Meta::TypeConstraint::Union->new(
22 type_constraints => [ $Str, $Undef ] );
23isa_ok( $Str_or_Undef, 'Moose::Meta::TypeConstraint::Union' );
24
25ok(
26 $Str_or_Undef->check(undef),
27 '... (Str | Undef) can accept an Undef value'
28);
29ok(
30 $Str_or_Undef->check('String'),
31 '... (Str | Undef) can accept a String value'
32);
33
34ok( !$Str_or_Undef->is_a_type_of($Str), "not a subtype of Str" );
35ok( !$Str_or_Undef->is_a_type_of($Undef), "not a subtype of Undef" );
36
37cmp_ok(
38 $Str_or_Undef->find_type_for('String'), 'eq', 'Str',
39 'find_type_for Str'
40);
41cmp_ok(
42 $Str_or_Undef->find_type_for(undef), 'eq', 'Undef',
43 'find_type_for Undef'
44);
45ok(
46 !defined( $Str_or_Undef->find_type_for( sub { } ) ),
47 'no find_type_for CodeRef'
48);
49
50ok( !$Str_or_Undef->equals($Str), "not equal to Str" );
dabed765 51ok( $Str_or_Undef->equals($Str_or_Undef), "equal to self" );
b53f21ca 52ok(
53 $Str_or_Undef->equals(
54 Moose::Meta::TypeConstraint::Union->new(
55 type_constraints => [ $Str, $Undef ]
56 )
57 ),
58 "equal to clone"
59);
60ok(
61 $Str_or_Undef->equals(
62 Moose::Meta::TypeConstraint::Union->new(
63 type_constraints => [ $Undef, $Str ]
64 )
65 ),
66 "equal to reversed clone"
67);
68
69ok(
70 !$Str_or_Undef->is_a_type_of("ThisTypeDoesNotExist"),
71 "not type of non existent type"
72);
73ok(
74 !$Str_or_Undef->is_subtype_of("ThisTypeDoesNotExist"),
75 "not subtype of non existent type"
76);
4c015454 77
451c8248 78# another ....
79
80my $ArrayRef = find_type_constraint('ArrayRef');
b53f21ca 81isa_ok( $ArrayRef, 'Moose::Meta::TypeConstraint' );
451c8248 82
83my $HashRef = find_type_constraint('HashRef');
b53f21ca 84isa_ok( $HashRef, 'Moose::Meta::TypeConstraint' );
85
86ok( $ArrayRef->check( [] ), '... ArrayRef can accept an [] value' );
87ok( !$ArrayRef->check( {} ), '... ArrayRef cannot accept an {} value' );
88ok( $HashRef->check( {} ), '... HashRef can accept an {} value' );
89ok( !$HashRef->check( [] ), '... HashRef cannot accept an [] value' );
90
91my $HashOrArray = Moose::Meta::TypeConstraint::Union->new(
92 type_constraints => [ $ArrayRef, $HashRef ] );
93isa_ok( $HashOrArray, 'Moose::Meta::TypeConstraint::Union' );
94
95ok( $HashOrArray->check( [] ), '... (ArrayRef | HashRef) can accept []' );
96ok( $HashOrArray->check( {} ), '... (ArrayRef | HashRef) can accept {}' );
97
98ok(
99 !$HashOrArray->check( \( my $var1 ) ),
100 '... (ArrayRef | HashRef) cannot accept scalar refs'
101);
102ok(
103 !$HashOrArray->check( sub { } ),
104 '... (ArrayRef | HashRef) cannot accept code refs'
105);
106ok(
107 !$HashOrArray->check(50),
108 '... (ArrayRef | HashRef) cannot accept Numbers'
109);
110
111diag $HashOrArray->validate( [] );
112
113ok(
114 !defined( $HashOrArray->validate( [] ) ),
115 '... (ArrayRef | HashRef) can accept []'
116);
117ok(
118 !defined( $HashOrArray->validate( {} ) ),
119 '... (ArrayRef | HashRef) can accept {}'
120);
121
122like(
123 $HashOrArray->validate( \( my $var2 ) ),
124 qr/Validation failed for \'ArrayRef\' with value .+ and Validation failed for \'HashRef\' with value .+ in \(ArrayRef\|HashRef\)/,
125 '... (ArrayRef | HashRef) cannot accept scalar refs'
126);
127
128like(
129 $HashOrArray->validate( sub { } ),
130 qr/Validation failed for \'ArrayRef\' with value .+ and Validation failed for \'HashRef\' with value .+ in \(ArrayRef\|HashRef\)/,
131 '... (ArrayRef | HashRef) cannot accept code refs'
132);
133
134is(
135 $HashOrArray->validate(50),
136 'Validation failed for \'ArrayRef\' with value 50 and Validation failed for \'HashRef\' with value 50 in (ArrayRef|HashRef)',
137 '... (ArrayRef | HashRef) cannot accept Numbers'
138);
451c8248 139
a28e50e4 140done_testing;