add failing test for coercing parameterized type
Rafael Kitover [Thu, 20 Aug 2009 20:49:03 +0000 (16:49 -0400)]
Makefile.PL
lib/MooseX/Types.pm
t/21_coerce_parameterized_types.t [new file with mode: 0644]

index e07fb24..c8a7479 100644 (file)
@@ -12,6 +12,7 @@ all_from        q{lib/MooseX/Types.pm};
 build_requires  q{Test::More},                  '0.80';
 build_requires  q{FindBin},                     0;
 build_requires  q{Test::Moose},                 0;
+build_requires  q{Test::Exception},             0;
 
 requires        q{Moose},                       '0.61';
 requires        q{Sub::Install},                '0.924';
index 6e18cd1..4516728 100644 (file)
@@ -35,6 +35,7 @@ my $UndefMsg = q{Action for type '%s' not yet defined in library '%s'};
         PositiveInt NegativeInt
         ArrayRefOfPositiveInt ArrayRefOfAtLeastThreeNegativeInts
         LotsOfInnerConstraints StrOrArrayRef
+       MyDateTime
     )];
 
   # import builtin types
@@ -73,9 +74,15 @@ my $UndefMsg = q{Action for type '%s' not yet defined in library '%s'};
   subtype StrOrArrayRef,
     as Str|ArrayRef;
 
+  # class types
+
   class_type 'DateTime';
 
-  coerce 'DateTime',
+  # or better
+
+  class_type MyDateTime, { class => 'DateTime' };
+
+  coerce MyDateTime,
     from HashRef,
     via { DateTime->new(%$_) };
 
@@ -420,7 +427,7 @@ it with @args.
 sub create_arged_type_constraint {
     my ($class, $name, @args) = @_;  
     my $type_constraint = Moose::Util::TypeConstraints::find_or_create_type_constraint("$name");
-       return $type_constraint->parameterize(@args);
+    return $type_constraint->parameterize(@args);
 }
 
 =head2 create_base_type_constraint ($name)
diff --git a/t/21_coerce_parameterized_types.t b/t/21_coerce_parameterized_types.t
new file mode 100644 (file)
index 0000000..dbbd5d2
--- /dev/null
@@ -0,0 +1,43 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use Test::Exception;
+
+use Test::More tests => 2;
+
+BEGIN {
+    package TypeLib;
+    use MooseX::Types -declare => [qw/MyType ArrayRefOfMyType/];
+    use MooseX::Types::Moose qw/ArrayRef Str/;
+
+    subtype MyType, as Str, where {
+       length == 1
+    };
+
+    coerce ArrayRef[MyType], from Str, via {
+       [split //]
+    };
+
+# same thing with an explicit subtype
+    subtype ArrayRefOfMyType, as ArrayRef[MyType];
+
+    coerce ArrayRefOfMyType, from Str, via {
+       [split //]
+    };
+}
+{
+    package AClass;
+    use Moose;
+    BEGIN { TypeLib->import(qw/MyType ArrayRefOfMyType/) };
+    use MooseX::Types::Moose 'ArrayRef';
+
+    has parameterized => (is => 'rw', isa => ArrayRef[MyType], coerce => 1);
+    has subtype => (is => 'rw', isa => ArrayRefOfMyType, coerce => 1);
+}
+
+my $instance = AClass->new;
+
+lives_ok { $instance->parameterized('foo') }
+    'coercion applied to parameterized type';
+
+lives_ok { $instance->subtype('foo') } 'coercion applied to subtype';