The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!./perl

BEGIN {
    unless (-d 'blib') {
	chdir 't' if -d 't';
	@INC = '../lib';
	require Config; import Config;
	keys %Config; # Silence warning
	if ($Config{extensions} !~ /\bList\/Util\b/) {
	    print "1..0 # Skip: List::Util was not built\n";
	    exit 0;
	}
    }
}

BEGIN {
  require Scalar::Util;

  if (grep { /set_prototype/ } @Scalar::Util::EXPORT_FAIL) {
    print "1..0\n";
    $skip=1;
  }
}

eval <<'EOT' unless $skip;
use Scalar::Util qw(set_prototype);

print "1..13\n";
$test = 0;

sub proto_is ($$) {
    $proto = prototype shift;
    $expected = shift;
    if (defined $expected) {
	print "# Got $proto, expected $expected\nnot " if $expected ne $proto;
    }
    else {
	print "# Got $proto, expected undef\nnot " if defined $proto;
    }
    print "ok ", ++$test, "\n";
}

sub f { }
proto_is 'f' => undef;
$r = set_prototype(\&f,'$');
proto_is 'f' => '$';
print "not " unless ref $r eq "CODE" and $r == \&f;
print "ok ", ++$test, " - return value\n";
set_prototype(\&f,undef);
proto_is 'f' => undef;
set_prototype(\&f,'');
proto_is 'f' => '';

sub g (@) { }
proto_is 'g' => '@';
set_prototype(\&g,undef);
proto_is 'g' => undef;

sub non_existent;
proto_is 'non_existent' => undef;
set_prototype(\&non_existent,'$$$');
proto_is 'non_existent' => '$$$';

sub forward_decl ($$$$);
proto_is 'forward_decl' => '$$$$';
set_prototype(\&forward_decl,'\%');
proto_is 'forward_decl' => '\%';

eval { &set_prototype( 'f', '' ); };
print "not " unless $@ =~ /^set_prototype: not a reference/;
print "ok ", ++$test, " - error msg\n";
eval { &set_prototype( \'f', '' ); };
print "not " unless $@ =~ /^set_prototype: not a subroutine reference/;
print "ok ", ++$test, " - error msg\n";
EOT