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