#!/usr/bin/perl
use perl5i::latest;
use Test::More;
# Empty signature
{
my $sig = perl5i::2::Signature->new( signature => "" );
isa_ok $sig, "perl5i::2::Signature::None";
is $sig->num_positional_params, 0;
is_deeply $sig->params, [];
is_deeply $sig->positional_params, [];
is $sig, "";
ok $sig;
is $sig->invocant, '';
ok !$sig->is_method;
}
# Empty signature with spaces
{
my $sig = perl5i::2::Signature->new( signature => " " );
isa_ok $sig, "perl5i::2::Signature::None";
is $sig->num_positional_params, 0;
is_deeply $sig->params, [];
is_deeply $sig->positional_params, [];
is $sig, " ";
is $sig->invocant, '';
ok !$sig->is_method;
}
# Empty signature on a method
{
my $sig = perl5i::2::Signature->new( signature => " ", is_method => 1 );
isa_ok $sig, "perl5i::2::Signature::None";
is $sig->num_positional_params, 0;
is_deeply $sig->params, [];
is_deeply $sig->positional_params, [];
is $sig, " ";
is $sig->invocant, '$self';
ok $sig->is_method;
}
# One arg signature
{
my $sig = perl5i::2::Signature->new( signature => '$foo' );
isa_ok $sig, "perl5i::2::Signature";
is $sig->num_positional_params, 1;
is_deeply $sig->params, ['$foo'];
is $sig, '$foo';
isa_ok $sig, "perl5i::2::Signature::Real";
is $sig->invocant, '';
ok !$sig->is_method;
}
# Two arg signature
{
my $sig = perl5i::2::Signature->new( signature => '$foo , @bar' );
is $sig->num_positional_params, 2;
is_deeply $sig->params, ['$foo', '@bar'];
is $sig, '$foo , @bar';
is $sig->invocant, '';
ok !$sig->is_method;
}
# With leading and trailing spaces
{
my $sig = perl5i::2::Signature->new( signature => ' $foo , @bar ' );
is $sig->num_positional_params, 2;
is_deeply $sig->params, ['$foo', '@bar'];
is $sig, ' $foo , @bar '; # an exact reproduction
is $sig->invocant, '';
ok !$sig->is_method;
}
# With an invocant
{
my $sig = perl5i::2::Signature->new( signature => '$class: @bar', is_method => 1 );
is $sig->num_positional_params, 1;
is_deeply $sig->params, ['@bar'];
is $sig, '$class: @bar';
is $sig->invocant, '$class';
ok $sig->is_method;
}
# Method, implied invocant
{
my $sig = perl5i::2::Signature->new( signature => '@bar', is_method => 1 );
is $sig->num_positional_params, 1;
is_deeply $sig->params, ['@bar'];
is $sig, '@bar';
is $sig->invocant, '$self';
ok $sig->is_method;
}
# Try setting a signature on a code reference
{
my $sig = perl5i::2::Signature->new( signature => '$arg', is_method => 1 );
my $echo = sub {
my $self = shift;
my($arg) = @_;
return $arg;
};
$echo->__set_signature($sig);
is $echo->signature, $sig;
}
# And now bring it all together
{
func echo($arg) {
return $arg;
}
my $sig = (\&echo)->signature;
isa_ok $sig, "perl5i::2::Signature";
ok $sig, '$arg';
is $sig->num_positional_params, 1;
}
# An anon code ref
{
my $echo = func ($arg) {
};
my $sig = $echo->signature;
isa_ok $sig, "perl5i::2::Signature";
ok $sig, '$arg';
is $sig->num_positional_params, 1;
}
# An anon method
{
my $echo = method ($arg) {
};
my $sig = $echo->signature;
isa_ok $sig, "perl5i::2::Signature";
ok $sig, '$arg';
is $sig->num_positional_params, 1;
is $sig->invocant, '$self';
ok $sig->is_method;
}
# A normal subroutine
{
my $code = sub { return @_ };
ok !$code->signature;
}
# Stringification
{
my $signature = '$foo, $bar';
my $sig = perl5i::2::Signature->new( signature => $signature );
is $sig, $signature;
# Make it real.
is $sig->num_positional_params, 2;
is $sig, $signature;
}
done_testing;