new and improved type notation stuff
[gitmo/Moose.git] / t / 040_type_constraints / 014_type_notation_parser.t
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use Test::More tests => 26;
7
8 BEGIN {
9     use_ok("Moose::Util::TypeConstraints");
10 }
11
12 ## check the containers
13
14 ok(Moose::Util::TypeConstraints::_detect_container_type_constraint($_), 
15    '... this correctly detected a container (' . $_ . ')')
16     for (
17     'ArrayRef[Foo]',
18     'ArrayRef[Foo | Int]',
19     'ArrayRef[ArrayRef[Int]]', 
20     'ArrayRef[ArrayRef[Int | Foo]]', 
21 );
22
23 ok(!Moose::Util::TypeConstraints::_detect_container_type_constraint($_), 
24    '... this correctly detected a non-container (' . $_ . ')')
25     for (
26     'ArrayRef[]',
27     'ArrayRef[Foo]Bar',
28 );
29
30 {
31     my %split_tests = (
32         'ArrayRef[Foo]'                 => [ 'ArrayRef', 'Foo' ],
33         'ArrayRef[Foo | Int]'           => [ 'ArrayRef', 'Foo | Int' ],
34         # these will get processed with recusion, 
35         # so we only need to detect it once
36         'ArrayRef[ArrayRef[Int]]'       => [ 'ArrayRef', 'ArrayRef[Int]' ], 
37         'ArrayRef[ArrayRef[Int | Foo]]' => [ 'ArrayRef', 'ArrayRef[Int | Foo]' ],
38     );
39
40     is_deeply(
41         [ Moose::Util::TypeConstraints::_parse_container_type_constraint($_) ],
42         $split_tests{$_},
43         '... this correctly split the container (' . $_ . ')'
44     ) for keys %split_tests;
45 }
46
47 ## now for the unions
48
49 ok(Moose::Util::TypeConstraints::_detect_type_constraint_union($_), 
50    '... this correctly detected union (' . $_ . ')')
51     for (
52     'Int | Str',
53     'ArrayRef[Foo] | Int',
54     'Int | ArrayRef[Foo]',
55     'ArrayRef[Foo | Int] | Str',
56     'Str | ArrayRef[Foo | Int]', 
57     'Some|Silly|Name|With|Pipes | Int',   
58 );
59
60 ok(!Moose::Util::TypeConstraints::_detect_type_constraint_union($_), 
61    '... this correctly detected a non-union (' . $_ . ')')
62     for (
63     'Int',
64     'ArrayRef[Foo | Int]',
65     'Some|Silly|Name|With|Pipes',
66 );
67
68 {
69     my %split_tests = (
70         'Int | Str'                        => [ 'Int', 'Str' ],
71         'ArrayRef[Foo] | Int'              => [ 'ArrayRef[Foo]', 'Int' ],
72         'Int | ArrayRef[Foo]'              => [ 'Int', 'ArrayRef[Foo]' ],
73         'ArrayRef[Foo | Int] | Str'        => [ 'ArrayRef[Foo | Int]', 'Str' ],
74         'Str | ArrayRef[Foo | Int]'        => [ 'Str', 'ArrayRef[Foo | Int]' ],  
75         'Some|Silly|Name|With|Pipes | Int' => [ 'Some|Silly|Name|With|Pipes', 'Int' ],  
76     );
77
78     is_deeply(
79         [ Moose::Util::TypeConstraints::_parse_type_constraint_union($_) ],
80         $split_tests{$_},
81         '... this correctly split the union (' . $_ . ')'
82     ) for keys %split_tests;
83 }