d78d474e9743ce0feb6bfe02b1df9c3912e74dcb
[gitmo/MooseX-Types-Structured.git] / t / 10-recursion.t
1 ## Test case donated by Stevan Little
2
3 BEGIN {
4     package Interpreter;
5     use Moose;
6     use Moose::Util::TypeConstraints;
7     use MooseX::Types::Structured qw(Dict Tuple);
8     use MooseX::Types::Moose qw(Int Str);
9     use MooseX::Types -declare => [qw(
10         Var
11         Const
12         Op
13         Expr
14     )];
15
16     subtype Var() => as Str();
17
18     subtype Const() => as Int() | Str();
19
20     enum Op() => qw[ + - ^ ];
21
22     subtype Expr() => as
23           Const()
24         | Tuple([Expr(), Op(), Expr()]) # binop
25         | Var();
26 }
27
28 {
29     package Foo;
30     BEGIN { Interpreter->import(':all') };
31     use Test::More 'no_plan';
32
33     ok is_Var('x'), q{passes is_Var('x')};
34     ok is_Const(1), q{passes is_Const(1)};
35     ok is_Const('Hello World'), q{passes is_Const};
36
37     ok is_Op('+'), q{passes is_Op('+')};
38     ok is_Op('-'), q{passes is_Op('-')};
39     ok is_Op('^'), q{passes is_Op('^')};
40
41     ok Expr->check([ 11, '+', 12]), '';
42     ok is_Expr([ 1, '+', 1]), q{passes is_Expr([ 1, '+', 1])};
43     ok is_Expr([ 1, '+', [ 1, '+', 1 ]]), q{passes is_Expr([ 1, '+', [ 1, '+', 1 ]])};
44 }
45
46
47
48
49
50