Tests and implementation for Undef/Defined types
[gitmo/Mouse.git] / t / 024-isa.t
index 65dee16..c589614 100644 (file)
@@ -1,33 +1,73 @@
 #!/usr/bin/env perl
 use strict;
 use warnings;
-use Test::More tests => 6;
+use Test::More;
 use Test::Exception;
 
 my %values_for_type = (
     Any => {
-        valid   => ["foo"],
+        valid   => [
+            undef,
+            \undef,
+            1.3,
+            "foo",
+            \"foo",
+            sub { die },
+            qr/^1?$|^(11+?)\1+$/,
+            [],
+            {},
+            \do { my $v },
+            Test::Builder->new,
+        ],
         invalid => [],
     },
 
     Item => {
-        valid   => [],
+        #valid   => [], # populated later with the values from Any
         invalid => [],
     },
 
     Bool => {
-        valid   => [],
-        invalid => [],
+        valid   => [undef, "", 1, 0, "1", "0"],
+        invalid => [
+            \undef,
+            1.5,
+            "true",
+            "false",
+            "t",
+            "f",
+            \"foo",
+            sub { die },
+            qr/^1?$|^(11+?)\1+$/,
+            [],
+            {},
+            \do { my $v = 1 },
+            Test::Builder->new,
+        ],
     },
 
     Undef => {
-        valid   => [],
-        invalid => [],
+        valid   => [undef],
+        invalid => [
+            \undef,
+            0,
+            '',
+            1.5,
+            "undef",
+            \"undef",
+            sub { die },
+            qr/^1?$|^(11+?)\1+$/,
+            [],
+            {},
+            \do { my $v = undef },
+            Test::Builder->new,
+        ],
     },
 
     Defined => {
-        valid   => [],
-        invalid => [],
+        # populated later with the values from Undef
+        #valid   => [],
+        #invalid => [],
     },
 
     Value => {
@@ -101,6 +141,17 @@ my %values_for_type = (
     },
 );
 
+$values_for_type{Item}{valid} = $values_for_type{Any}{valid};
+$values_for_type{Defined}{valid} = $values_for_type{Undef}{invalid};
+$values_for_type{Defined}{invalid} = $values_for_type{Undef}{valid};
+
+my $plan = 0;
+$plan += 5 * @{ $values_for_type{$_}{valid} }   for keys %values_for_type;
+$plan += 4 * @{ $values_for_type{$_}{invalid} } for keys %values_for_type;
+$plan++; # can_ok
+
+plan tests => $plan;
+
 do {
     package Class;
     use Mouse;
@@ -131,16 +182,17 @@ for my $type (keys %values_for_type) {
     }
 
     for my $value (@{ $values_for_type{$type}{invalid} }) {
+        my $display = defined($value) ? $value : 'undef';
         my $via_new;
         throws_ok {
             $via_new = Class->new($type => $value);
-        } qr/(?!)/;
+        } qr/Attribute \($type\) does not pass the type constraint because: Validation failed for '$type' failed with value \Q$display\E/;
         is($via_new, undef, "no object created");
 
         my $via_set = Class->new;
         throws_ok {
             $via_set->$type($value);
-        } qr/(?!)/;
+        } qr/Attribute \($type\) does not pass the type constraint because: Validation failed for '$type' failed with value \Q$display\E/;
 
         is($via_set->$type, undef, "value for $type not set");
     }