rollback some stuff to reset my brain a bit
[gitmo/MooseX-Types-Structured.git] / t / suger.t
CommitLineData
a49ce94b 1BEGIN {
2 use strict;
3 use warnings;
4 use Test::More tests=>3;
5}
f4c564e4 6
7## This is a first pass at what the regex enhancements to
8## Moose::Util::TypeConstraints is going to look like. Basically I copyied
9## bits and added a little more parsing ability.
a49ce94b 10
11{
12 ## Copied from Moose::Util::TypeConstraints
13 use re "eval";
14
15 my $any;
16 my $valid_chars = qr{[\w:]};
17 my $type_atom = qr{ $valid_chars+ };
18
19 my $type = qr{ $valid_chars+ (?: \[ (??{$any}) \] )? }x;
20 my $type_capture_parts = qr{ ($valid_chars+) (?: \[ ((??{$any})) \] )? }x;
21 my $type_with_parameter = qr{ $valid_chars+ \[ (??{$any}) \] }x;
22
23 my $op_union = qr{ \s* \| \s* }x;
24 my $union = qr{ $type (?: $op_union $type )+ }x;
25
26 ## New Stuff for structured types.
27 my $comma = qr{,};
28 my $indirection = qr{=>};
f4c564e4 29 my $divider_ops = qr{ $comma | $indirection }x;
30 my $structure_divider = qr{\s* $divider_ops \s*}x;
a49ce94b 31 my $structure_elements = qr{ ($type $structure_divider*)+ }x;
32
f4c564e4 33 ## Addd the | $structure_elements to this.
a49ce94b 34 $any = qr{ $type | $union | $structure_elements }x;
35
36 ## New Proposed methods to parse and create
37 sub _parse_structured_type_constraint {
38 { no warnings 'void'; $any; } # force capture of interpolated lexical
39
40 my($base, $elements) = ($_[0] =~ m{ $type_capture_parts }x);
41 return ($base, [split($structure_divider, $elements)]);
42 }
43
44 is_deeply
45 [_parse_structured_type_constraint('ArrayRef[Int,Str]')],
46 ["ArrayRef", ["Int", "Str"]]
47 => 'Correctly parsed ArrayRef[Int,Str]';
48
49 is_deeply
50 [_parse_structured_type_constraint('ArrayRef[ArrayRef[Int],Str]')],
51 ["ArrayRef", ["ArrayRef[Int]", "Str"]]
52 => 'Correctly parsed ArrayRef[ArrayRef[Int],Str]';
53
54 is_deeply
55 [_parse_structured_type_constraint('HashRef[key1 => Int, key2=>Int, key3=>ArrayRef[Int]]')],
56 ["HashRef", ["key1", "Int", "key2", "Int", "key3", "ArrayRef[Int]"]]
57 => 'Correctly parsed HashRef[key1 => Int, key2=>Int, key3=>ArrayRef[Int]]';
58
59}
60