Add assert_valid() to Meta::TypeConstraint
[gitmo/Mouse.git] / t / 040_type_constraints / failing / 008_union_types.t
CommitLineData
b2b106d7 1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
6use Test::More tests => 35;
7use Test::Exception;
8
9BEGIN {
10 use_ok('Mouse::Util::TypeConstraints');
11}
12
13my $Str = find_type_constraint('Str');
14isa_ok($Str, 'Mouse::Meta::TypeConstraint');
15
16my $Undef = find_type_constraint('Undef');
17isa_ok($Undef, 'Mouse::Meta::TypeConstraint');
18
19ok(!$Str->check(undef), '... Str cannot accept an Undef value');
20ok($Str->check('String'), '... Str can accept an String value');
21ok(!$Undef->check('String'), '... Undef cannot accept an Str value');
22ok($Undef->check(undef), '... Undef can accept an Undef value');
23
24my $Str_or_Undef = Mouse::Meta::TypeConstraint::Union->new(type_constraints => [$Str, $Undef]);
25isa_ok($Str_or_Undef, 'Mouse::Meta::TypeConstraint::Union');
26
27ok($Str_or_Undef->check(undef), '... (Str | Undef) can accept an Undef value');
28ok($Str_or_Undef->check('String'), '... (Str | Undef) can accept a String value');
29
30ok($Str_or_Undef->is_a_type_of($Str), "subtype of Str");
31ok($Str_or_Undef->is_a_type_of($Undef), "subtype of Undef");
32
33ok( !$Str_or_Undef->equals($Str), "not equal to Str" );
34ok( $Str_or_Undef->equals($Str_or_Undef), "equal to self" );
35ok( $Str_or_Undef->equals(Mouse::Meta::TypeConstraint::Union->new(type_constraints => [ $Str, $Undef ])), "equal to clone" );
36ok( $Str_or_Undef->equals(Mouse::Meta::TypeConstraint::Union->new(type_constraints => [ $Undef, $Str ])), "equal to reversed clone" );
37
38ok( !$Str_or_Undef->is_a_type_of("ThisTypeDoesNotExist"), "not type of non existant type" );
39ok( !$Str_or_Undef->is_subtype_of("ThisTypeDoesNotExist"), "not subtype of non existant type" );
40
41# another ....
42
43my $ArrayRef = find_type_constraint('ArrayRef');
44isa_ok($ArrayRef, 'Mouse::Meta::TypeConstraint');
45
46my $HashRef = find_type_constraint('HashRef');
47isa_ok($HashRef, 'Mouse::Meta::TypeConstraint');
48
49ok($ArrayRef->check([]), '... ArrayRef can accept an [] value');
50ok(!$ArrayRef->check({}), '... ArrayRef cannot accept an {} value');
51ok($HashRef->check({}), '... HashRef can accept an {} value');
52ok(!$HashRef->check([]), '... HashRef cannot accept an [] value');
53
54my $HashOrArray = Mouse::Meta::TypeConstraint::Union->new(type_constraints => [$ArrayRef, $HashRef]);
55isa_ok($HashOrArray, 'Mouse::Meta::TypeConstraint::Union');
56
57ok($HashOrArray->check([]), '... (ArrayRef | HashRef) can accept []');
58ok($HashOrArray->check({}), '... (ArrayRef | HashRef) can accept {}');
59
60ok(!$HashOrArray->check(\(my $var1)), '... (ArrayRef | HashRef) cannot accept scalar refs');
61ok(!$HashOrArray->check(sub {}), '... (ArrayRef | HashRef) cannot accept code refs');
62ok(!$HashOrArray->check(50), '... (ArrayRef | HashRef) cannot accept Numbers');
63
64diag $HashOrArray->validate([]);
65
66ok(!defined($HashOrArray->validate([])), '... (ArrayRef | HashRef) can accept []');
67ok(!defined($HashOrArray->validate({})), '... (ArrayRef | HashRef) can accept {}');
68
69like($HashOrArray->validate(\(my $var2)),
70qr/Validation failed for \'ArrayRef\' failed with value SCALAR\(0x.+?\) and Validation failed for \'HashRef\' failed with value SCALAR\(0x.+?\) in \(ArrayRef\|HashRef\)/,
71'... (ArrayRef | HashRef) cannot accept scalar refs');
72
73like($HashOrArray->validate(sub {}),
74qr/Validation failed for \'ArrayRef\' failed with value CODE\(0x.+?\) and Validation failed for \'HashRef\' failed with value CODE\(0x.+?\) in \(ArrayRef\|HashRef\)/,
75'... (ArrayRef | HashRef) cannot accept code refs');
76
77is($HashOrArray->validate(50),
78'Validation failed for \'ArrayRef\' failed with value 50 and Validation failed for \'HashRef\' failed with value 50 in (ArrayRef|HashRef)',
79'... (ArrayRef | HashRef) cannot accept Numbers');
80