1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
|
{
package NoBool;
use Moo;
use overload ('bool' => sub { die });
}
{
package MooX::Types::MooseLike::Test::Role;
use Role::Tiny;
sub foo { 'ja' };
sub bar { 'ara' };
}
{
package MooX::Types::MooseLike::Test::AnotherRole;
use Role::Tiny;
sub que { 'dius' };
sub quoi { 'dieu' };
}
{
package ClassA;
use Moo;
has fun => (is => 'ro');
1;
}
{
package ClassB;
use Moo;
extends 'ClassA';
has funner => (is => 'ro');
1;
}
{
package MooX::Types::MooseLike::Test;
use strict;
use warnings FATAL => 'all';
use Moo;
use MooX::Types::MooseLike::Base qw/
InstanceOf ConsumerOf HasMethods Enum
/;
with (
'MooX::Types::MooseLike::Test::Role',
'MooX::Types::MooseLike::Test::AnotherRole'
);
has instance_of_IO_Handle => (
is => 'ro',
isa => InstanceOf['IO::Handle'],
);
has instance_of_A_and_B => (
is => 'ro',
isa => InstanceOf['ClassA', 'ClassB'],
);
has instance_of_NoBool => (
is => 'ro',
isa => InstanceOf['NoBool'],
);
has consumer_of => (
is => 'ro',
isa => ConsumerOf[
'MooX::Types::MooseLike::Test::Role',
'MooX::Types::MooseLike::Test::AnotherRole'
],
);
has has_methods => (
is => 'ro',
isa => HasMethods['foo', 'bar'],
);
has enum_type => (
is => 'ro',
isa => Enum['estrella', 'lluna', 'deessa'],
);
}
package main;
use strict;
use warnings FATAL => 'all';
use Test::More;
use Test::Fatal;
use IO::Handle;
# InstanceOf
ok(MooX::Types::MooseLike::Test->new(instance_of_IO_Handle => IO::Handle->new ), 'instance of IO::Handle');
my $false_instance;
like(
exception {
MooX::Types::MooseLike::Test->new(instance_of_IO_Handle => $false_instance);
},
qr/No instance given/,
'undef is not an instance of IO::Handle'
);
$false_instance = {};
like(
exception {
MooX::Types::MooseLike::Test->new(instance_of_IO_Handle => $false_instance);
},
qr/is not blessed/,
'a hashref is not an instance of IO::Handle'
);
$false_instance = bless {}, 'Foo';
like(
exception {
MooX::Types::MooseLike::Test->new(instance_of_IO_Handle => $false_instance);
},
qr/is not an instance of the class.*IO::Handle/,
'a Foo instance is not an instance of IO::Handle'
);
ok(MooX::Types::MooseLike::Test->new(instance_of_A_and_B => ClassB->new ), 'instance of ClassA and ClassB');
ok(MooX::Types::MooseLike::Test->new(instance_of_NoBool => NoBool->new ), 'instance of NoBool');
# ConsumerOf
ok(MooX::Types::MooseLike::Test->new(consumer_of => MooX::Types::MooseLike::Test->new ), 'consumer of a some roles');
my $false_consumer;
like(
exception {
MooX::Types::MooseLike::Test->new(consumer_of => $false_consumer);
},
qr/No instance given/,
'undef is not a consumer of roles'
);
$false_consumer = IO::Handle->new;
like(
exception {
MooX::Types::MooseLike::Test->new(consumer_of => $false_consumer);
},
qr/is not a consumer of roles/,
'an IO::Handle instance is not a consumer of roles'
);
like(
exception {
MooX::Types::MooseLike::Test->new(consumer_of => 'MooX::Types::MooseLike::Test');
},
qr/is not blessed/,
'a class name is not a consumer of roles'
);
# HasMethods
ok(MooX::Types::MooseLike::Test->new(has_methods => MooX::Types::MooseLike::Test->new ), 'has methods of madness');
my $false_has_methods;
like(
exception {
MooX::Types::MooseLike::Test->new(has_methods => $false_has_methods);
},
qr/No instance given/,
'undef does not have the required methods'
);
$false_has_methods = IO::Handle->new;
like(
exception {
MooX::Types::MooseLike::Test->new(has_methods => $false_has_methods);
},
qr/does not have the required methods/,
'an object instance does not have the required methods'
);
like(
exception {
MooX::Types::MooseLike::Test->new(has_methods => 'MooX::Types::MooseLike::Test');
},
qr/is not blessed/,
'a class name is does not have methods'
);
# Enum
ok(MooX::Types::MooseLike::Test->new(enum_type => 'estrella' ), 'has one of the possible values (enum)');
ok(MooX::Types::MooseLike::Test->new(enum_type => 'deessa' ), 'has one of the possible values (enum)');
my $false_enum = undef;
like(
exception {
MooX::Types::MooseLike::Test->new(enum_type => $false_enum);
},
qr/is not any of the possible values/,
'undef is not one of the enumerated values'
);
$false_enum = IO::Handle->new;
like(
exception {
MooX::Types::MooseLike::Test->new(enum_type => $false_enum);
},
qr/is not any of the possible values/,
'an object is not one of the enumerated values'
);
$false_enum = {};
like(
exception {
MooX::Types::MooseLike::Test->new(enum_type => $false_enum);
},
qr/is not any of the possible values/,
'a HashRef is not one of the enumerated values'
);
$false_enum = '';
like(
exception {
MooX::Types::MooseLike::Test->new(enum_type => $false_enum);
},
qr/is not any of the possible values/,
'an empty string is not one of the enumerated values'
);
$false_enum = 'Tot es possible';
like(
exception {
MooX::Types::MooseLike::Test->new(enum_type => $false_enum);
},
qr/is not any of the possible values/,
'a different string is not one of the enumerated values'
);
done_testing;
|