allow single-value enums
[gitmo/Moose.git] / t / type_constraints / enum.t
CommitLineData
c4fe165f 1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
4ce56d04 6use Test::More;
b10dde3a 7use Test::Fatal;
c4fe165f 8
9use Scalar::Util ();
10
4ce56d04 11use Moose::Util::TypeConstraints;
c4fe165f 12
13enum Letter => 'a'..'z', 'A'..'Z';
14enum Language => 'Perl 5', 'Perl 6', 'PASM', 'PIR'; # any others? ;)
bce5d4a5 15enum Metacharacter => ['*', '+', '?', '.', '|', '(', ')', '[', ']', '\\'];
c4fe165f 16
17my @valid_letters = ('a'..'z', 'A'..'Z');
18
19my @invalid_letters = qw/ab abc abcd/;
20push @invalid_letters, qw/0 4 9 ~ @ $ %/;
21push @invalid_letters, qw/l33t st3v4n 3num/;
22
23my @valid_languages = ('Perl 5', 'Perl 6', 'PASM', 'PIR');
4ce56d04 24my @invalid_languages = ('perl 5', 'Python', 'Ruby', 'Perl 666', 'PASM++');
25# note that "perl 5" is invalid because case now matters
c4fe165f 26
27my @valid_metacharacters = (qw/* + ? . | ( ) [ ] /, '\\');
28my @invalid_metacharacters = qw/< > & % $ @ ! ~ `/;
29push @invalid_metacharacters, qw/.* fish(sticks)? atreides/;
30push @invalid_metacharacters, '^1?$|^(11+?)\1+$';
31
32Moose::Util::TypeConstraints->export_type_constraints_as_functions();
33
34ok(Letter($_), "'$_' is a letter") for @valid_letters;
35ok(!Letter($_), "'$_' is not a letter") for @invalid_letters;
36
37ok(Language($_), "'$_' is a language") for @valid_languages;
38ok(!Language($_), "'$_' is not a language") for @invalid_languages;
39
40ok(Metacharacter($_), "'$_' is a metacharacter") for @valid_metacharacters;
41ok(!Metacharacter($_), "'$_' is not a metacharacter")
42 for @invalid_metacharacters;
43
9f4334a1 44# check anon enums
45
46my $anon_enum = enum \@valid_languages;
47isa_ok($anon_enum, 'Moose::Meta::TypeConstraint');
48
49is($anon_enum->name, '__ANON__', '... got the right name');
50is($anon_enum->parent->name, 'Str', '... got the right parent name');
51
52ok($anon_enum->check($_), "'$_' is a language") for @valid_languages;
53
54
dabed765 55ok( !$anon_enum->equals( enum [qw(foo bar)] ), "doesn't equal a diff enum" );
56ok( $anon_enum->equals( $anon_enum ), "equals itself" );
57ok( $anon_enum->equals( enum \@valid_languages ), "equals duplicate" );
4c015454 58
59ok( !$anon_enum->is_subtype_of('Object'), 'enum not a subtype of Object');
60ok( !$anon_enum->is_a_type_of('Object'), 'enum not type of Object');
61
62ok( !$anon_enum->is_subtype_of('ThisTypeDoesNotExist'), 'enum not a subtype of nonexistant type');
63ok( !$anon_enum->is_a_type_of('ThisTypeDoesNotExist'), 'enum not type of nonexistant type');
64
f6af1028 65# validation
1c748165 66like( exception { Moose::Meta::TypeConstraint::Enum->new(name => 'ZeroValues', values => []) }, qr/You must have at least one value to enumerate through/ );
f6af1028 67
1c748165 68is( exception { Moose::Meta::TypeConstraint::Enum->new(name => 'OneValue', values => [ 'a' ]) }, undef);
f6af1028 69
b10dde3a 70like( exception { Moose::Meta::TypeConstraint::Enum->new(name => 'ReferenceInEnum', values => [ 'a', {} ]) }, qr/Enum values must be strings, not 'HASH\(0x\w+\)'/ );
f6af1028 71
b10dde3a 72like( exception { Moose::Meta::TypeConstraint::Enum->new(name => 'UndefInEnum', values => [ 'a', undef ]) }, qr/Enum values must be strings, not undef/ );
f6af1028 73
b10dde3a 74like( exception {
f6af1028 75 package Foo;
76 use Moose;
77 use Moose::Util::TypeConstraints;
78
79 has error => (
80 is => 'ro',
81 isa => enum ['a', 'aa', 'aaa'], # should be parenthesized!
82 default => 'aa',
83 );
b10dde3a 84}, qr/enum called with an array reference and additional arguments\. Did you mean to parenthesize the enum call's parameters\?/ );
f6af1028 85
86
a28e50e4 87done_testing;