Remove MooX::Types from xt tests
[gitmo/Moo.git] / xt / type-inflate.t
diff --git a/xt/type-inflate.t b/xt/type-inflate.t
new file mode 100644 (file)
index 0000000..e048fa9
--- /dev/null
@@ -0,0 +1,80 @@
+use strictures 1;
+use Test::More;
+
+{
+  package TypeOMatic;
+
+  use Moo::Role;
+  use Sub::Quote;
+  use Moo::HandleMoose ();
+
+  sub Str {
+    my $type = sub {
+      die unless defined $_[0] && !ref $_[0];
+    };
+    $Moo::HandleMoose::TYPE_MAP{$type} = sub {
+      require Moose::Util::TypeConstraints;
+      Moose::Util::TypeConstraints::find_type_constraint("Str");
+    };
+    return ($type, @_);
+  }
+  sub PositiveInt {
+    my $type = sub {
+      die unless defined $_[0] && !ref $_[0] && $_[0] =~ /^-?\d+/;
+    };
+    $Moo::HandleMoose::TYPE_MAP{$type} = sub {
+      require Moose::Util::TypeConstraints;
+      require MooseX::Types::Common::Numeric;
+      Moose::Util::TypeConstraints::find_type_constraint(
+        "MooseX::Types::Common::Numeric::PositiveInt");
+    };
+    return ($type, @_);
+  }
+
+  has named_type => (
+    is => 'ro',
+    isa => Str,
+  );
+
+  has named_external_type => (
+    is => 'ro',
+    isa => PositiveInt,
+  );
+
+  package TypeOMatic::Consumer;
+
+  # do this as late as possible to simulate "real" behaviour
+  use Moo::HandleMoose;
+  use Moose;
+  with 'TypeOMatic';
+}
+
+my $meta = Class::MOP::class_of('TypeOMatic::Consumer');
+
+my ($str, $positive_int)
+  = map $meta->get_attribute($_)->type_constraint->name,
+      qw(named_type named_external_type);
+
+is($str, 'Str', 'Built-in Moose type ok');
+is(
+  $positive_int, 'MooseX::Types::Common::Numeric::PositiveInt',
+  'External (MooseX::Types type) ok'
+);
+
+local $@;
+eval q {
+  package Fooble;
+  use Moo;
+  my $isa = sub { 1 };
+  $Moo::HandleMoose::TYPE_MAP{$isa} = sub { $isa };
+  has barble => (is => "ro", isa => $isa);
+  __PACKAGE__->meta->get_attribute("barble");
+};
+
+like(
+  $@,
+  qr/^error inflating attribute 'barble' for package 'Fooble': \$TYPE_MAP\{CODE\(\w+?\)\} did not return a valid type constraint/,
+  'error message for incorrect type constraint inflation',
+);
+
+done_testing;