summaryrefslogtreecommitdiffstats
path: root/t/complex.t
diff options
context:
space:
mode:
Diffstat (limited to 't/complex.t')
-rw-r--r--t/complex.t191
1 files changed, 191 insertions, 0 deletions
diff --git a/t/complex.t b/t/complex.t
new file mode 100644
index 0000000..b617cab
--- /dev/null
+++ b/t/complex.t
@@ -0,0 +1,191 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use Test::More;
+
+use Test::Requires 'MooseX::Types::URI', 'MooseX::Types::Email',
+ 'Locale::Language', 'Locale::Currency',
+ 'Number::Phone::US';
+
+use Moose::Util::TypeConstraints;
+use MooseX::Types::URI 'Uri';
+use MooseX::Types::Email 'EmailAddress';
+
+use MooseX::Validation::Doctypes;
+
+subtype 'CurrencyCode',
+ as 'Str',
+ where { Locale::Currency::code2currency( $_ ) };
+subtype 'LocaleCode',
+ as 'Str',
+ where { Locale::Language::code2language( $_ ) };
+subtype 'PhoneNumber',
+ as 'Str',
+ where { Number::Phone::US::is_valid_number( $_ ) };
+
+doctype 'Location' => {
+ id => 'Str',
+ name => 'Str',
+ location => {
+ address => {
+ address1 => 'Str',
+ city => 'Str',
+ country => 'Str',
+ postal_code => 'Str',
+ address2 => 'Maybe[Str]',
+ address3 => 'Maybe[Str]',
+ address4 => 'Maybe[Str]',
+ address5 => 'Maybe[Str]',
+ state => 'Maybe[Str]',
+ },
+ coordinates => {
+ lon => 'Num',
+ lat => 'Num',
+ }
+ },
+ contact => {
+ phone => 'PhoneNumber',
+ fax => 'Maybe[PhoneNumber]',
+ support => 'Maybe[PhoneNumber | MooseX::Types::URI::Uri | MooseX::Types::Email::EmailAddress]',
+ web => 'Maybe[MooseX::Types::URI::Uri]',
+ email => 'Maybe[MooseX::Types::Email::EmailAddress]',
+ },
+ i18n => {
+ default_currency => 'CurrencyCode',
+ default_locale => 'LocaleCode',
+ available_currencies => 'ArrayRef[CurrencyCode]',
+ available_locales => 'ArrayRef[LocaleCode]',
+ }
+};
+
+{
+ my $location = find_type_constraint('Location');
+ is_deeply(
+ $location->doctype,
+ {
+ id => 'Str',
+ name => 'Str',
+ location => {
+ address => {
+ address1 => 'Str',
+ city => 'Str',
+ country => 'Str',
+ postal_code => 'Str',
+ address2 => 'Maybe[Str]',
+ address3 => 'Maybe[Str]',
+ address4 => 'Maybe[Str]',
+ address5 => 'Maybe[Str]',
+ state => 'Maybe[Str]',
+ },
+ coordinates => {
+ lon => 'Num',
+ lat => 'Num',
+ }
+ },
+ contact => {
+ phone => 'PhoneNumber',
+ fax => 'Maybe[PhoneNumber]',
+ support => 'Maybe[PhoneNumber | MooseX::Types::URI::Uri | MooseX::Types::Email::EmailAddress]',
+ web => 'Maybe[MooseX::Types::URI::Uri]',
+ email => 'Maybe[MooseX::Types::Email::EmailAddress]',
+ },
+ i18n => {
+ default_currency => 'CurrencyCode',
+ default_locale => 'LocaleCode',
+ available_currencies => 'ArrayRef[CurrencyCode]',
+ available_locales => 'ArrayRef[LocaleCode]',
+ }
+ },
+ "got the right doctype"
+ );
+
+ {
+ my $errors = $location->validate({
+ id => '14931-FL-53',
+ name => 'My House',
+ location => {
+ address => {
+ address1 => '123 Any St',
+ city => 'Anytown',
+ country => 'USA',
+ postal_code => '00100',
+ address2 => 'Apt Q',
+ address5 => 'knock on the back door',
+ state => 'IL',
+ },
+ coordinates => {
+ lon => '38',
+ lat => '57',
+ }
+ },
+ contact => {
+ phone => '867-5309',
+ support => 'anelson@cpan.org',
+ web => URI->new('https://metacpan.org/author/ANELSON'),
+ email => 'anelson@cpan.org',
+ },
+ i18n => {
+ default_currency => 'USD',
+ default_locale => 'en',
+ available_currencies => [ 'USD', 'CAD', 'EUR' ],
+ available_locales => [ 'en' ]
+ }
+ });
+ is($errors, undef, "no errors");
+ }
+
+ {
+ my $errors = $location->validate({
+ id => '14931-FL-53',
+ name => 'My House',
+ location => {
+ address => {
+ address1 => '123 Any St',
+ city => 'Anytown',
+ country => 'USA',
+ postal_code => '00100',
+ address2 => 'Apt Q',
+ address5 => 'knock on the back door',
+ state => 'IL',
+ },
+ coordinates => {
+ lon => '38q',
+ lat => '57',
+ }
+ },
+ contact => {
+ phone => '867-5309',
+ support => 'anelson@cpan.org',
+ web => URI->new('https://metacpan.org/author/ANELSON'),
+ email => 'anelson at cpan.org',
+ },
+ i18n => {
+ default_locale => 'en',
+ available_currencies => [ 'dolla dolla bill', 'CAD', 'EUR' ],
+ available_locales => [ 'en' ]
+ }
+ });
+ is_deeply(
+ $errors,
+ {
+ errors => {
+ contact => {
+ email => "invalid value \"anelson at cpan.org\" for 'contact.email'"
+ },
+ i18n => {
+ available_currencies => "invalid value [ \"dolla dolla bill\", \"CAD\", \"EUR\" ] for 'i18n.available_currencies'",
+ default_currency => "invalid value undef for 'i18n.default_currency'"
+ },
+ location => {
+ coordinates => {
+ lon => "invalid value \"38q\" for 'location.coordinates.lon'"
+ }
+ }
+ }
+ },
+ "got the right errors"
+ );
+ }
+}
+
+done_testing;