2aebf75cd7fbddfb846348c40c96f063836b1078
[gitmo/Moose.git] / t / 040_type_constraints / 015_enum.t
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use Test::More;
7
8 use Scalar::Util ();
9
10 use Moose::Util::TypeConstraints;
11
12 enum Letter => 'a'..'z', 'A'..'Z';
13 enum Language => 'Perl 5', 'Perl 6', 'PASM', 'PIR'; # any others? ;)
14 enum Metacharacter => '*', '+', '?', '.', '|', '(', ')', '[', ']', '\\';
15
16 my @valid_letters = ('a'..'z', 'A'..'Z');
17
18 my @invalid_letters = qw/ab abc abcd/;
19 push @invalid_letters, qw/0 4 9 ~ @ $ %/;
20 push @invalid_letters, qw/l33t st3v4n 3num/;
21
22 my @valid_languages = ('Perl 5', 'Perl 6', 'PASM', 'PIR');
23 my @invalid_languages = ('perl 5', 'Python', 'Ruby', 'Perl 666', 'PASM++');
24 # note that "perl 5" is invalid because case now matters
25
26 my @valid_metacharacters = (qw/* + ? . | ( ) [ ] /, '\\');
27 my @invalid_metacharacters = qw/< > & % $ @ ! ~ `/;
28 push @invalid_metacharacters, qw/.* fish(sticks)? atreides/;
29 push @invalid_metacharacters, '^1?$|^(11+?)\1+$';
30
31 plan tests => @valid_letters        + @invalid_letters
32             + @valid_languages      + @invalid_languages
33             + @valid_metacharacters + @invalid_metacharacters
34             + @valid_languages      + 6;
35
36 Moose::Util::TypeConstraints->export_type_constraints_as_functions();
37
38 ok(Letter($_), "'$_' is a letter") for @valid_letters;
39 ok(!Letter($_), "'$_' is not a letter") for @invalid_letters;
40
41 ok(Language($_), "'$_' is a language") for @valid_languages;
42 ok(!Language($_), "'$_' is not a language") for @invalid_languages;
43
44 ok(Metacharacter($_), "'$_' is a metacharacter") for @valid_metacharacters;
45 ok(!Metacharacter($_), "'$_' is not a metacharacter")
46     for @invalid_metacharacters;
47
48 # check anon enums
49
50 my $anon_enum = enum \@valid_languages;
51 isa_ok($anon_enum, 'Moose::Meta::TypeConstraint');
52
53 is($anon_enum->name, '__ANON__', '... got the right name');
54 is($anon_enum->parent->name, 'Str', '... got the right parent name');
55
56 ok($anon_enum->check($_), "'$_' is a language") for @valid_languages;
57
58
59 ok( !$anon_enum->equals( enum [qw(foo bar)] ), "doesn't equal a diff enum" );
60 ok( $anon_enum->equals( $anon_enum ), "equals itself" );
61 ok( $anon_enum->equals( enum \@valid_languages ), "equals duplicate" );