— |
our $VERSION = '0.49' ;
use Scalar::Util qw( blessed looks_like_number openhandle ) ; our $ZERO = 0;
our $ONE = 1;
our $INT = 100;
our $NEG_INT = -100;
our $NUM = 42.42;
our $NEG_NUM = -42.42;
our $EMPTY_STRING = q{} ;
our $STRING = 'foo' ;
our $NUM_IN_STRING = 'has 42 in it' ;
our $INT_WITH_NL1 = "1\n" ;
our $INT_WITH_NL2 = "\n1" ;
our $SCALAR_REF = do {
\( my $var );
};
our $SCALAR_REF_REF = \ $SCALAR_REF ;
our $ARRAY_REF = [];
our $HASH_REF = {};
our $CODE_REF = sub { };
our $GLOB_REF = \ *GLOB ;
our $FH ;
open $FH , '<' , $INC { 'Test/Specio.pm' }
or die "Could not open $INC{'Test/Specio.pm'} for the test" ;
our $FH_OBJECT = IO::File->new( $INC { 'Test/Specio.pm' }, 'r' )
or die "Could not open $INC{'Test/Specio.pm'} for the test" ;
our $REGEX = qr/../ ;
our $REGEX_OBJ = bless qr/../ , 'BlessedQR' ;
our $FAKE_REGEX = bless {}, 'Regexp' ;
our $OBJECT = bless {}, 'FakeObject' ;
our $UNDEF = undef ;
{
sub foo { }
}
our $CLASS_NAME = '_T::Thing' ;
{
'bool' => sub { ${ $_ [0] } },
fallback => 0;
sub new {
my $bool = $_ [1];
bless \ $bool , __PACKAGE__;
}
}
our $BOOL_OVERLOAD_TRUE = _T::BoolOverload->new(1);
our $BOOL_OVERLOAD_FALSE = _T::BoolOverload->new(0);
{
q{""} => sub { ${ $_ [0] } },
fallback => 0;
sub new {
my $str = $_ [1];
bless \ $str , __PACKAGE__;
}
}
our $STR_OVERLOAD_EMPTY = _T::StrOverload->new( q{} );
our $STR_OVERLOAD_FULL = _T::StrOverload->new( 'full' );
our $STR_OVERLOAD_CLASS_NAME = _T::StrOverload->new( '_T::StrOverload' );
{
'0+' => sub { ${ $_ [0] } },
'+' => sub { ${ $_ [0] } + $_ [1] },
fallback => 0;
sub new {
my $num = $_ [1];
bless \ $num , __PACKAGE__;
}
}
our $NUM_OVERLOAD_ZERO = _T::NumOverload->new( 0);
our $NUM_OVERLOAD_ONE = _T::NumOverload->new( 1);
our $NUM_OVERLOAD_NEG = _T::NumOverload->new(-42);
our $NUM_OVERLOAD_DECIMAL = _T::NumOverload->new(42.42);
our $NUM_OVERLOAD_NEG_DECIMAL = _T::NumOverload->new(42.42);
{
'&{}' => sub { ${ $_ [0] } },
fallback => 0;
sub new {
my $code = $_ [1];
bless \ $code , __PACKAGE__;
}
}
our $CODE_OVERLOAD = _T::CodeOverload->new( sub { } );
{
'qr' => sub { ${ $_ [0] } },
fallback => 0;
sub new {
my $regex = $_ [1];
bless \ $regex , __PACKAGE__;
}
}
our $REGEX_OVERLOAD = _T::RegexOverload->new(qr/foo/);
{
'*{}' => sub { ${ $_ [0] } },
fallback => 0;
sub new {
my $glob = $_ [1];
bless \ $glob , __PACKAGE__;
}
}
{
'${}' => sub { $_ [0][0] },
fallback => 0;
sub new {
my $scalar = $_ [1];
bless [ $scalar ], __PACKAGE__;
}
}
our $SCALAR_OVERLOAD = _T::ScalarOverload->new( 'x' );
{
'@{}' => sub { $_ [0]{array} },
fallback => 0;
sub new {
my $array = $_ [1];
bless { array => $array }, __PACKAGE__;
}
}
our $ARRAY_OVERLOAD = _T::ArrayOverload->new( [ 1, 2, 3 ] );
{
'%{}' => sub { $_ [0][0] },
fallback => 0;
sub new {
my $hash = $_ [1];
bless [ $hash ], __PACKAGE__;
}
}
our $HASH_OVERLOAD = _T::HashOverload->new( { x => 42, y => 84 } );
my @vars ;
BEGIN {
open my $fh , '<' , $INC { 'Test/Specio.pm' } or die $!;
while (< $fh >) {
push @vars , $1 if /^ our (\$[A-Z0-9_]+)(?: +=|;)/;
}
}
our @EXPORT_OK = ( @vars , qw( builtins_tests describe test_constraint ) );
our %EXPORT_TAGS = ( vars => \ @vars );
sub builtins_tests {
my $GLOB = shift ;
my $GLOB_OVERLOAD = shift ;
my $GLOB_OVERLOAD_FH = shift ;
return {
Item => {
accept => [
$ZERO ,
$ONE ,
$BOOL_OVERLOAD_TRUE ,
$BOOL_OVERLOAD_FALSE ,
$INT ,
$NEG_INT ,
$NUM ,
$NEG_NUM ,
$NUM_OVERLOAD_ZERO ,
$NUM_OVERLOAD_ONE ,
$NUM_OVERLOAD_NEG ,
$NUM_OVERLOAD_NEG_DECIMAL ,
$NUM_OVERLOAD_DECIMAL ,
$EMPTY_STRING ,
$STRING ,
$NUM_IN_STRING ,
$STR_OVERLOAD_EMPTY ,
$STR_OVERLOAD_FULL ,
$INT_WITH_NL1 ,
$INT_WITH_NL2 ,
$SCALAR_REF ,
$SCALAR_REF_REF ,
$SCALAR_OVERLOAD ,
$ARRAY_REF ,
$ARRAY_OVERLOAD ,
$HASH_REF ,
$HASH_OVERLOAD ,
$CODE_REF ,
$CODE_OVERLOAD ,
$GLOB ,
$GLOB_REF ,
$GLOB_OVERLOAD ,
$GLOB_OVERLOAD_FH ,
$FH ,
$FH_OBJECT ,
$REGEX ,
$REGEX_OBJ ,
$REGEX_OVERLOAD ,
$FAKE_REGEX ,
$OBJECT ,
$UNDEF ,
],
},
Defined => {
accept => [
$ZERO ,
$ONE ,
$BOOL_OVERLOAD_TRUE ,
$BOOL_OVERLOAD_FALSE ,
$INT ,
$NEG_INT ,
$NUM ,
$NEG_NUM ,
$NUM_OVERLOAD_ZERO ,
$NUM_OVERLOAD_ONE ,
$NUM_OVERLOAD_NEG ,
$NUM_OVERLOAD_NEG_DECIMAL ,
$NUM_OVERLOAD_DECIMAL ,
$EMPTY_STRING ,
$STRING ,
$NUM_IN_STRING ,
$STR_OVERLOAD_EMPTY ,
$STR_OVERLOAD_FULL ,
$INT_WITH_NL1 ,
$INT_WITH_NL2 ,
$SCALAR_REF ,
$SCALAR_REF_REF ,
$SCALAR_OVERLOAD ,
$ARRAY_REF ,
$ARRAY_OVERLOAD ,
$HASH_REF ,
$HASH_OVERLOAD ,
$CODE_REF ,
$CODE_OVERLOAD ,
$GLOB ,
$GLOB_REF ,
$GLOB_OVERLOAD ,
$GLOB_OVERLOAD_FH ,
$FH ,
$FH_OBJECT ,
$REGEX ,
$REGEX_OBJ ,
$REGEX_OVERLOAD ,
$FAKE_REGEX ,
$OBJECT ,
],
reject => [
$UNDEF ,
],
},
Undef => {
accept => [
$UNDEF ,
],
reject => [
$ZERO ,
$ONE ,
$BOOL_OVERLOAD_TRUE ,
$BOOL_OVERLOAD_FALSE ,
$INT ,
$NEG_INT ,
$NUM ,
$NEG_NUM ,
$NUM_OVERLOAD_ZERO ,
$NUM_OVERLOAD_ONE ,
$NUM_OVERLOAD_NEG ,
$NUM_OVERLOAD_NEG_DECIMAL ,
$NUM_OVERLOAD_DECIMAL ,
$EMPTY_STRING ,
$STRING ,
$NUM_IN_STRING ,
$STR_OVERLOAD_EMPTY ,
$STR_OVERLOAD_FULL ,
$INT_WITH_NL1 ,
$INT_WITH_NL2 ,
$SCALAR_REF ,
$SCALAR_REF_REF ,
$SCALAR_OVERLOAD ,
$ARRAY_REF ,
$ARRAY_OVERLOAD ,
$HASH_REF ,
$HASH_OVERLOAD ,
$CODE_REF ,
$CODE_OVERLOAD ,
$GLOB ,
$GLOB_REF ,
$GLOB_OVERLOAD ,
$GLOB_OVERLOAD_FH ,
$FH ,
$FH_OBJECT ,
$REGEX ,
$REGEX_OBJ ,
$REGEX_OVERLOAD ,
$FAKE_REGEX ,
$OBJECT ,
],
},
Bool => {
accept => [
$ZERO ,
$ONE ,
$BOOL_OVERLOAD_TRUE ,
$BOOL_OVERLOAD_FALSE ,
$EMPTY_STRING ,
$UNDEF ,
],
reject => [
$INT ,
$NEG_INT ,
$NUM ,
$NEG_NUM ,
$NUM_OVERLOAD_ZERO ,
$NUM_OVERLOAD_ONE ,
$NUM_OVERLOAD_NEG ,
$NUM_OVERLOAD_NEG_DECIMAL ,
$NUM_OVERLOAD_DECIMAL ,
$STRING ,
$NUM_IN_STRING ,
$STR_OVERLOAD_EMPTY ,
$STR_OVERLOAD_FULL ,
$INT_WITH_NL1 ,
$INT_WITH_NL2 ,
$SCALAR_REF ,
$SCALAR_REF_REF ,
$SCALAR_OVERLOAD ,
$ARRAY_REF ,
$ARRAY_OVERLOAD ,
$HASH_REF ,
$HASH_OVERLOAD ,
$CODE_REF ,
$CODE_OVERLOAD ,
$GLOB ,
$GLOB_REF ,
$GLOB_OVERLOAD ,
$GLOB_OVERLOAD_FH ,
$FH ,
$FH_OBJECT ,
$REGEX ,
$REGEX_OBJ ,
$REGEX_OVERLOAD ,
$FAKE_REGEX ,
$OBJECT ,
],
},
Maybe => {
accept => [
$ZERO ,
$ONE ,
$BOOL_OVERLOAD_TRUE ,
$BOOL_OVERLOAD_FALSE ,
$INT ,
$NEG_INT ,
$NUM ,
$NEG_NUM ,
$NUM_OVERLOAD_ZERO ,
$NUM_OVERLOAD_ONE ,
$NUM_OVERLOAD_NEG ,
$NUM_OVERLOAD_NEG_DECIMAL ,
$NUM_OVERLOAD_DECIMAL ,
$EMPTY_STRING ,
$STRING ,
$NUM_IN_STRING ,
$STR_OVERLOAD_EMPTY ,
$STR_OVERLOAD_FULL ,
$INT_WITH_NL1 ,
$INT_WITH_NL2 ,
$SCALAR_REF ,
$SCALAR_REF_REF ,
$SCALAR_OVERLOAD ,
$ARRAY_REF ,
$ARRAY_OVERLOAD ,
$HASH_REF ,
$HASH_OVERLOAD ,
$CODE_REF ,
$CODE_OVERLOAD ,
$GLOB ,
$GLOB_REF ,
$GLOB_OVERLOAD ,
$GLOB_OVERLOAD_FH ,
$FH ,
$FH_OBJECT ,
$REGEX ,
$REGEX_OBJ ,
$REGEX_OVERLOAD ,
$FAKE_REGEX ,
$OBJECT ,
$UNDEF ,
],
},
Value => {
accept => [
$ZERO ,
$ONE ,
$INT ,
$NEG_INT ,
$NUM ,
$NEG_NUM ,
$EMPTY_STRING ,
$STRING ,
$NUM_IN_STRING ,
$INT_WITH_NL1 ,
$INT_WITH_NL2 ,
$GLOB ,
],
reject => [
$BOOL_OVERLOAD_TRUE ,
$BOOL_OVERLOAD_FALSE ,
$STR_OVERLOAD_EMPTY ,
$STR_OVERLOAD_FULL ,
$NUM_OVERLOAD_ZERO ,
$NUM_OVERLOAD_ONE ,
$NUM_OVERLOAD_NEG ,
$NUM_OVERLOAD_NEG_DECIMAL ,
$NUM_OVERLOAD_DECIMAL ,
$SCALAR_REF ,
$SCALAR_REF_REF ,
$SCALAR_OVERLOAD ,
$ARRAY_REF ,
$ARRAY_OVERLOAD ,
$HASH_REF ,
$HASH_OVERLOAD ,
$CODE_REF ,
$CODE_OVERLOAD ,
$GLOB_REF ,
$GLOB_OVERLOAD ,
$GLOB_OVERLOAD_FH ,
$FH ,
$FH_OBJECT ,
$REGEX ,
$REGEX_OBJ ,
$REGEX_OVERLOAD ,
$FAKE_REGEX ,
$OBJECT ,
$UNDEF ,
],
},
Ref => {
accept => [
$BOOL_OVERLOAD_TRUE ,
$BOOL_OVERLOAD_FALSE ,
$STR_OVERLOAD_EMPTY ,
$STR_OVERLOAD_FULL ,
$NUM_OVERLOAD_ZERO ,
$NUM_OVERLOAD_ONE ,
$NUM_OVERLOAD_NEG ,
$NUM_OVERLOAD_NEG_DECIMAL ,
$NUM_OVERLOAD_DECIMAL ,
$SCALAR_REF ,
$SCALAR_REF_REF ,
$SCALAR_OVERLOAD ,
$ARRAY_REF ,
$ARRAY_OVERLOAD ,
$HASH_REF ,
$HASH_OVERLOAD ,
$CODE_REF ,
$CODE_OVERLOAD ,
$GLOB_REF ,
$GLOB_OVERLOAD ,
$GLOB_OVERLOAD_FH ,
$FH ,
$FH_OBJECT ,
$REGEX ,
$REGEX_OBJ ,
$REGEX_OVERLOAD ,
$FAKE_REGEX ,
$OBJECT ,
],
reject => [
$ZERO ,
$ONE ,
$INT ,
$NEG_INT ,
$NUM ,
$NEG_NUM ,
$EMPTY_STRING ,
$STRING ,
$NUM_IN_STRING ,
$INT_WITH_NL1 ,
$INT_WITH_NL2 ,
$GLOB ,
$UNDEF ,
],
},
Num => {
accept => [
$ZERO ,
$ONE ,
$INT ,
$NEG_INT ,
$NUM ,
$NEG_NUM ,
$NUM_OVERLOAD_ZERO ,
$NUM_OVERLOAD_ONE ,
$NUM_OVERLOAD_NEG ,
$NUM_OVERLOAD_NEG_DECIMAL ,
$NUM_OVERLOAD_DECIMAL ,
qw(
1e10
1e-10
1.23456e10
1.23456e-10
1e10
1e-10
1.23456e10
1.23456e-10
-1e10
-1e-10
-1.23456e10
-1.23456e-10
-1e10
-1e-10
-1.23456e10
-1.23456e-10
-1e+10
1E10
) ,
],
reject => [
$BOOL_OVERLOAD_TRUE ,
$BOOL_OVERLOAD_FALSE ,
$EMPTY_STRING ,
$STRING ,
$NUM_IN_STRING ,
$STR_OVERLOAD_EMPTY ,
$STR_OVERLOAD_FULL ,
$SCALAR_REF ,
$SCALAR_REF_REF ,
$SCALAR_OVERLOAD ,
$ARRAY_REF ,
$ARRAY_OVERLOAD ,
$HASH_REF ,
$HASH_OVERLOAD ,
$CODE_REF ,
$CODE_OVERLOAD ,
$GLOB ,
$GLOB_REF ,
$GLOB_OVERLOAD ,
$GLOB_OVERLOAD_FH ,
$FH ,
$FH_OBJECT ,
$INT_WITH_NL1 ,
$INT_WITH_NL2 ,
$REGEX ,
$REGEX_OBJ ,
$REGEX_OVERLOAD ,
$FAKE_REGEX ,
$OBJECT ,
$UNDEF ,
],
},
Int => {
accept => [
$ZERO ,
$ONE ,
$INT ,
$NEG_INT ,
$NUM_OVERLOAD_ZERO ,
$NUM_OVERLOAD_ONE ,
$NUM_OVERLOAD_NEG ,
qw(
1e20
1e100
-1e10
-1e+10
1E20
) ,
],
reject => [
$BOOL_OVERLOAD_TRUE ,
$BOOL_OVERLOAD_FALSE ,
$NUM ,
$NEG_NUM ,
$NUM_OVERLOAD_NEG_DECIMAL ,
$NUM_OVERLOAD_DECIMAL ,
$EMPTY_STRING ,
$STRING ,
$NUM_IN_STRING ,
$STR_OVERLOAD_EMPTY ,
$STR_OVERLOAD_FULL ,
$INT_WITH_NL1 ,
$INT_WITH_NL2 ,
$SCALAR_REF ,
$SCALAR_REF_REF ,
$SCALAR_OVERLOAD ,
$ARRAY_REF ,
$ARRAY_OVERLOAD ,
$HASH_REF ,
$HASH_OVERLOAD ,
$CODE_REF ,
$CODE_OVERLOAD ,
$GLOB ,
$GLOB_REF ,
$GLOB_OVERLOAD ,
$GLOB_OVERLOAD_FH ,
$FH ,
$FH_OBJECT ,
$REGEX ,
$REGEX_OBJ ,
$REGEX_OVERLOAD ,
$FAKE_REGEX ,
$OBJECT ,
$UNDEF ,
qw(
1e-10
-1e-10
1.23456e10
1.23456e-10
-1.23456e10
-1.23456e-10
-1.23456e+10
) ,
],
},
Str => {
accept => [
$ZERO ,
$ONE ,
$INT ,
$NEG_INT ,
$NUM ,
$NEG_NUM ,
$EMPTY_STRING ,
$STRING ,
$NUM_IN_STRING ,
$STR_OVERLOAD_EMPTY ,
$STR_OVERLOAD_FULL ,
$INT_WITH_NL1 ,
$INT_WITH_NL2 ,
],
reject => [
$BOOL_OVERLOAD_TRUE ,
$BOOL_OVERLOAD_FALSE ,
$NUM_OVERLOAD_ZERO ,
$NUM_OVERLOAD_ONE ,
$NUM_OVERLOAD_NEG ,
$NUM_OVERLOAD_NEG_DECIMAL ,
$NUM_OVERLOAD_DECIMAL ,
$SCALAR_REF ,
$SCALAR_REF_REF ,
$SCALAR_OVERLOAD ,
$ARRAY_REF ,
$ARRAY_OVERLOAD ,
$HASH_REF ,
$HASH_OVERLOAD ,
$CODE_REF ,
$CODE_OVERLOAD ,
$GLOB ,
$GLOB_REF ,
$GLOB_OVERLOAD ,
$GLOB_OVERLOAD_FH ,
$FH ,
$FH_OBJECT ,
$REGEX ,
$REGEX_OBJ ,
$REGEX_OVERLOAD ,
$FAKE_REGEX ,
$OBJECT ,
$UNDEF ,
],
},
ScalarRef => {
accept => [
$SCALAR_REF ,
$SCALAR_REF_REF ,
$SCALAR_OVERLOAD ,
],
reject => [
$ZERO ,
$ONE ,
$BOOL_OVERLOAD_TRUE ,
$BOOL_OVERLOAD_FALSE ,
$INT ,
$NEG_INT ,
$NUM ,
$NEG_NUM ,
$NUM_OVERLOAD_ZERO ,
$NUM_OVERLOAD_ONE ,
$NUM_OVERLOAD_NEG ,
$NUM_OVERLOAD_NEG_DECIMAL ,
$NUM_OVERLOAD_DECIMAL ,
$EMPTY_STRING ,
$STRING ,
$NUM_IN_STRING ,
$STR_OVERLOAD_EMPTY ,
$STR_OVERLOAD_FULL ,
$INT_WITH_NL1 ,
$INT_WITH_NL2 ,
$ARRAY_REF ,
$ARRAY_OVERLOAD ,
$HASH_REF ,
$HASH_OVERLOAD ,
$CODE_REF ,
$CODE_OVERLOAD ,
$GLOB ,
$GLOB_REF ,
$GLOB_OVERLOAD ,
$GLOB_OVERLOAD_FH ,
$FH ,
$FH_OBJECT ,
$REGEX ,
$REGEX_OBJ ,
$REGEX_OVERLOAD ,
$FAKE_REGEX ,
$OBJECT ,
$UNDEF ,
],
},
ArrayRef => {
accept => [
$ARRAY_REF ,
$ARRAY_OVERLOAD ,
],
reject => [
$ZERO ,
$ONE ,
$BOOL_OVERLOAD_TRUE ,
$BOOL_OVERLOAD_FALSE ,
$INT ,
$NEG_INT ,
$NUM ,
$NEG_NUM ,
$NUM_OVERLOAD_ZERO ,
$NUM_OVERLOAD_ONE ,
$NUM_OVERLOAD_NEG ,
$NUM_OVERLOAD_NEG_DECIMAL ,
$NUM_OVERLOAD_DECIMAL ,
$EMPTY_STRING ,
$STRING ,
$NUM_IN_STRING ,
$STR_OVERLOAD_EMPTY ,
$STR_OVERLOAD_FULL ,
$INT_WITH_NL1 ,
$INT_WITH_NL2 ,
$SCALAR_REF ,
$SCALAR_REF_REF ,
$SCALAR_OVERLOAD ,
$HASH_REF ,
$HASH_OVERLOAD ,
$CODE_REF ,
$CODE_OVERLOAD ,
$GLOB ,
$GLOB_REF ,
$GLOB_OVERLOAD ,
$GLOB_OVERLOAD_FH ,
$FH ,
$FH_OBJECT ,
$REGEX ,
$REGEX_OBJ ,
$REGEX_OVERLOAD ,
$FAKE_REGEX ,
$OBJECT ,
$UNDEF ,
],
},
HashRef => {
accept => [
$HASH_REF ,
$HASH_OVERLOAD ,
],
reject => [
$ZERO ,
$ONE ,
$BOOL_OVERLOAD_TRUE ,
$BOOL_OVERLOAD_FALSE ,
$INT ,
$NEG_INT ,
$NUM ,
$NEG_NUM ,
$NUM_OVERLOAD_ZERO ,
$NUM_OVERLOAD_ONE ,
$NUM_OVERLOAD_NEG ,
$NUM_OVERLOAD_NEG_DECIMAL ,
$NUM_OVERLOAD_DECIMAL ,
$EMPTY_STRING ,
$STRING ,
$NUM_IN_STRING ,
$STR_OVERLOAD_EMPTY ,
$STR_OVERLOAD_FULL ,
$INT_WITH_NL1 ,
$INT_WITH_NL2 ,
$SCALAR_REF ,
$SCALAR_REF_REF ,
$SCALAR_OVERLOAD ,
$ARRAY_REF ,
$ARRAY_OVERLOAD ,
$CODE_REF ,
$CODE_OVERLOAD ,
$GLOB ,
$GLOB_REF ,
$GLOB_OVERLOAD ,
$GLOB_OVERLOAD_FH ,
$FH ,
$FH_OBJECT ,
$REGEX ,
$REGEX_OBJ ,
$REGEX_OVERLOAD ,
$FAKE_REGEX ,
$OBJECT ,
$UNDEF ,
],
},
CodeRef => {
accept => [
$CODE_REF ,
$CODE_OVERLOAD ,
],
reject => [
$ZERO ,
$ONE ,
$BOOL_OVERLOAD_TRUE ,
$BOOL_OVERLOAD_FALSE ,
$INT ,
$NEG_INT ,
$NUM ,
$NEG_NUM ,
$NUM_OVERLOAD_ZERO ,
$NUM_OVERLOAD_ONE ,
$NUM_OVERLOAD_NEG ,
$NUM_OVERLOAD_NEG_DECIMAL ,
$NUM_OVERLOAD_DECIMAL ,
$EMPTY_STRING ,
$STRING ,
$NUM_IN_STRING ,
$STR_OVERLOAD_EMPTY ,
$STR_OVERLOAD_FULL ,
$INT_WITH_NL1 ,
$INT_WITH_NL2 ,
$SCALAR_REF ,
$SCALAR_REF_REF ,
$SCALAR_OVERLOAD ,
$ARRAY_REF ,
$ARRAY_OVERLOAD ,
$HASH_REF ,
$HASH_OVERLOAD ,
$GLOB ,
$GLOB_REF ,
$GLOB_OVERLOAD ,
$GLOB_OVERLOAD_FH ,
$FH ,
$FH_OBJECT ,
$REGEX ,
$REGEX_OBJ ,
$REGEX_OVERLOAD ,
$FAKE_REGEX ,
$OBJECT ,
$UNDEF ,
],
},
RegexpRef => {
accept => [
$REGEX ,
$REGEX_OBJ ,
$REGEX_OVERLOAD ,
],
reject => [
$ZERO ,
$ONE ,
$BOOL_OVERLOAD_TRUE ,
$BOOL_OVERLOAD_FALSE ,
$INT ,
$NEG_INT ,
$NUM ,
$NEG_NUM ,
$NUM_OVERLOAD_ZERO ,
$NUM_OVERLOAD_ONE ,
$NUM_OVERLOAD_NEG ,
$NUM_OVERLOAD_NEG_DECIMAL ,
$NUM_OVERLOAD_DECIMAL ,
$EMPTY_STRING ,
$STRING ,
$NUM_IN_STRING ,
$STR_OVERLOAD_EMPTY ,
$STR_OVERLOAD_FULL ,
$INT_WITH_NL1 ,
$INT_WITH_NL2 ,
$SCALAR_REF ,
$SCALAR_REF_REF ,
$SCALAR_OVERLOAD ,
$ARRAY_REF ,
$ARRAY_OVERLOAD ,
$HASH_REF ,
$HASH_OVERLOAD ,
$CODE_REF ,
$CODE_OVERLOAD ,
$GLOB ,
$GLOB_REF ,
$GLOB_OVERLOAD ,
$GLOB_OVERLOAD_FH ,
$FH ,
$FH_OBJECT ,
$OBJECT ,
$UNDEF ,
$FAKE_REGEX ,
],
},
GlobRef => {
accept => [
$GLOB_REF ,
$GLOB_OVERLOAD ,
$GLOB_OVERLOAD_FH ,
$FH ,
],
reject => [
$ZERO ,
$ONE ,
$BOOL_OVERLOAD_TRUE ,
$BOOL_OVERLOAD_FALSE ,
$INT ,
$NEG_INT ,
$NUM ,
$NEG_NUM ,
$NUM_OVERLOAD_ZERO ,
$NUM_OVERLOAD_ONE ,
$NUM_OVERLOAD_NEG ,
$NUM_OVERLOAD_NEG_DECIMAL ,
$NUM_OVERLOAD_DECIMAL ,
$EMPTY_STRING ,
$STRING ,
$NUM_IN_STRING ,
$STR_OVERLOAD_EMPTY ,
$STR_OVERLOAD_FULL ,
$INT_WITH_NL1 ,
$INT_WITH_NL2 ,
$SCALAR_REF ,
$SCALAR_REF_REF ,
$SCALAR_OVERLOAD ,
$ARRAY_REF ,
$ARRAY_OVERLOAD ,
$HASH_REF ,
$HASH_OVERLOAD ,
$CODE_REF ,
$CODE_OVERLOAD ,
$GLOB ,
$FH_OBJECT ,
$OBJECT ,
$REGEX ,
$REGEX_OBJ ,
$REGEX_OVERLOAD ,
$FAKE_REGEX ,
$UNDEF ,
],
},
FileHandle => {
accept => [
$FH ,
$FH_OBJECT ,
$GLOB_OVERLOAD_FH ,
],
reject => [
$ZERO ,
$ONE ,
$BOOL_OVERLOAD_TRUE ,
$BOOL_OVERLOAD_FALSE ,
$INT ,
$NEG_INT ,
$NUM ,
$NEG_NUM ,
$NUM_OVERLOAD_ZERO ,
$NUM_OVERLOAD_ONE ,
$NUM_OVERLOAD_NEG ,
$NUM_OVERLOAD_NEG_DECIMAL ,
$NUM_OVERLOAD_DECIMAL ,
$EMPTY_STRING ,
$STRING ,
$NUM_IN_STRING ,
$STR_OVERLOAD_EMPTY ,
$STR_OVERLOAD_FULL ,
$INT_WITH_NL1 ,
$INT_WITH_NL2 ,
$SCALAR_REF ,
$SCALAR_REF_REF ,
$SCALAR_OVERLOAD ,
$ARRAY_REF ,
$ARRAY_OVERLOAD ,
$HASH_REF ,
$HASH_OVERLOAD ,
$CODE_REF ,
$CODE_OVERLOAD ,
$GLOB ,
$GLOB_REF ,
$GLOB_OVERLOAD ,
$OBJECT ,
$REGEX ,
$REGEX_OBJ ,
$REGEX_OVERLOAD ,
$FAKE_REGEX ,
$UNDEF ,
],
},
Object => {
accept => [
$BOOL_OVERLOAD_TRUE ,
$BOOL_OVERLOAD_FALSE ,
$STR_OVERLOAD_EMPTY ,
$STR_OVERLOAD_FULL ,
$NUM_OVERLOAD_ZERO ,
$NUM_OVERLOAD_ONE ,
$NUM_OVERLOAD_NEG ,
$NUM_OVERLOAD_NEG_DECIMAL ,
$NUM_OVERLOAD_DECIMAL ,
$CODE_OVERLOAD ,
$FH_OBJECT ,
$REGEX ,
$REGEX_OBJ ,
$REGEX_OVERLOAD ,
$FAKE_REGEX ,
$GLOB_OVERLOAD ,
$GLOB_OVERLOAD_FH ,
$SCALAR_OVERLOAD ,
$ARRAY_OVERLOAD ,
$HASH_OVERLOAD ,
$OBJECT ,
],
reject => [
$ZERO ,
$ONE ,
$INT ,
$NEG_INT ,
$NUM ,
$NEG_NUM ,
$EMPTY_STRING ,
$STRING ,
$NUM_IN_STRING ,
$INT_WITH_NL1 ,
$INT_WITH_NL2 ,
$SCALAR_REF ,
$SCALAR_REF_REF ,
$ARRAY_REF ,
$HASH_REF ,
$CODE_REF ,
$GLOB ,
$GLOB_REF ,
$FH ,
$UNDEF ,
],
},
ClassName => {
accept => [
$CLASS_NAME ,
$STR_OVERLOAD_CLASS_NAME ,
],
reject => [
$ZERO ,
$ONE ,
$BOOL_OVERLOAD_TRUE ,
$BOOL_OVERLOAD_FALSE ,
$INT ,
$NEG_INT ,
$NUM ,
$NEG_NUM ,
$NUM_OVERLOAD_ZERO ,
$NUM_OVERLOAD_ONE ,
$NUM_OVERLOAD_NEG ,
$NUM_OVERLOAD_NEG_DECIMAL ,
$NUM_OVERLOAD_DECIMAL ,
$EMPTY_STRING ,
$STRING ,
$NUM_IN_STRING ,
$STR_OVERLOAD_EMPTY ,
$STR_OVERLOAD_FULL ,
$INT_WITH_NL1 ,
$INT_WITH_NL2 ,
$SCALAR_REF ,
$SCALAR_REF_REF ,
$SCALAR_OVERLOAD ,
$ARRAY_REF ,
$ARRAY_OVERLOAD ,
$HASH_REF ,
$HASH_OVERLOAD ,
$CODE_REF ,
$CODE_OVERLOAD ,
$GLOB ,
$GLOB_REF ,
$GLOB_OVERLOAD ,
$GLOB_OVERLOAD_FH ,
$FH ,
$FH_OBJECT ,
$REGEX ,
$REGEX_OBJ ,
$REGEX_OVERLOAD ,
$FAKE_REGEX ,
$OBJECT ,
$UNDEF ,
],
},
};
}
sub test_constraint {
my $type = shift ;
my $tests = shift ;
my $describer = shift || \ &describe ;
local $Test::Builder::Level = $Test::Builder::Level + 1;
$type = t( $type ) unless blessed $type ;
subtest(
( $type ->name || '<anon>' ),
sub {
try {
my $not_inlined = $type ->_constraint_with_parents;
my $inlined ;
if ( $type ->can_be_inlined ) {
$inlined = $type ->_generated_inline_sub;
}
for my $accept ( @{ $tests ->{ accept } || [] } ) {
my $described = $describer ->( $accept );
subtest(
"accepts $described" ,
sub {
ok(
$type ->value_is_valid( $accept ),
'using ->value_is_valid'
);
is(
exception { $type ->( $accept ) },
undef ,
'using subref overloading'
);
ok(
$not_inlined ->( $accept ),
'using non-inlined constraint'
);
if ( $inlined ) {
ok(
$inlined ->( $accept ),
'using inlined constraint'
);
}
}
);
}
for my $reject ( @{ $tests ->{reject} || [] } ) {
my $described = $describer ->( $reject );
subtest(
"rejects $described" ,
sub {
ok(
! $type ->value_is_valid( $reject ),
'using ->value_is_valid'
);
like(
exception { $type ->( $reject ) },
qr/\QTrace begun at Specio::Exception->new/ ,
'using subref overloading'
);
if ( $inlined ) {
ok(
! $inlined ->( $reject ),
'using inlined constraint'
);
}
}
);
}
}
catch {
fail( 'No exception in test_constraint' );
diag( $_ );
};
}
);
}
sub describe {
my $val = shift ;
return 'undef' unless defined $val ;
if ( ! ref $val ) {
return q{''} if $val eq q{} ;
return looks_like_number( $val )
&& $val !~ /\n/ ? $val : Specio::Helpers::perlstring( $val );
}
return 'open filehandle'
if openhandle $val && !blessed $val ;
if ( blessed $val ) {
my $desc = ( ref $val ) . ' object' ;
if ( $val ->isa( '_T::StrOverload' ) ) {
$desc .= ' (' . describe( "$val" ) . ')' ;
}
elsif ( $val ->isa( '_T::BoolOverload' ) ) {
$desc .= ' (' . ( $val ? 'true' : 'false' ) . ')' ;
}
elsif ( $val ->isa( '_T::NumOverload' ) ) {
$desc .= ' (' . describe( ${ $val } ) . ')' ;
}
return $desc ;
}
else {
return ( ref $val ) . ' reference' ;
}
}
1;
|