TAP::Parser::SourceHandler::Perl - 从 Perl 可执行文件流式传输 TAP
版本 3.44
use TAP::Parser::Source;
use TAP::Parser::SourceHandler::Perl;
my $source = TAP::Parser::Source->new->raw( \'script.pl' );
$source->assemble_meta;
my $class = 'TAP::Parser::SourceHandler::Perl';
my $vote = $class->can_handle( $source );
my $iter = $class->make_iterator( $source );
这是一个Perl TAP::Parser::SourceHandler - 它有 2 项工作
1. 确定给定的 TAP::Parser::Source 实际上是否是一个 Perl 脚本 ("can_handle").
2. 为 Perl 源代码创建一个迭代器 ("make_iterator").
除非您正在编写插件或对 TAP::Parser 进行子类化,否则您可能不需要直接使用此模块。
can_handle
my $vote = $class->can_handle( $source );
仅在 $source 看起来像文件时才投票。投出以下选票
0.9 if it has a shebang ala "#!...perl"
0.3 if it has any shebang
0.8 if it's a .t file
0.9 if it's a .pl file
0.75 if it's in a 't' directory
0.25 by default (backwards compat)
make_iterator
my $iterator = $class->make_iterator( $source );
为源代码构建并返回一个新的 TAP::Parser::Iterator::Process。假设 $source->raw
包含对 perl 脚本的引用。如果找不到文件,则会发出 croak
。
运行命令的构建如下
$perl @switches $perl_script @test_args
要使用的 perl 命令由 "get_perl" 确定。生成的命令保证保留
PERL5LIB
PERL5OPT
Taint Mode, if set in the script's shebang
注意:生成的命令不会遵守 Perl 脚本中定义的任何 shebang 行。只有在您编译了 Perl 的自定义版本,或者您希望对一个测试使用特定版本的 Perl,而对另一个测试使用不同版本时,这才是问题,例如
#!/path/to/a/custom_perl --some --args
#!/usr/local/perl-5.6/bin/perl -w
目前您需要编写一个插件来解决这个问题。
get_taint
从 Perl shebang 行解码任何 taint 开关。
# $taint will be 't'
my $taint = TAP::Parser::SourceHandler::Perl->get_taint( '#!/usr/bin/perl -t' );
# $untaint will be undefined
my $untaint = TAP::Parser::SourceHandler::Perl->get_taint( '#!/usr/bin/perl' );
get_perl
获取当前运行测试套件的 Perl 版本。
有关子类化的概述,请参见 TAP::Parser 中的“SUBCLASSING”。
package MyPerlSourceHandler;
use strict;
use TAP::Parser::SourceHandler::Perl;
use base 'TAP::Parser::SourceHandler::Perl';
# use the version of perl from the shebang line in the test file
sub get_perl {
my $self = shift;
if (my $shebang = $self->shebang( $self->{file} )) {
$shebang =~ /^#!(.*\bperl.*?)(?:(?:\s)|(?:$))/;
return $1 if $1;
}
return $self->SUPER::get_perl(@_);
}
TAP::Object、TAP::Parser、TAP::Parser::IteratorFactory、TAP::Parser::SourceHandler、TAP::Parser::SourceHandler::Executable、TAP::Parser::SourceHandler::File、TAP::Parser::SourceHandler::Handle、TAP::Parser::SourceHandler::RawTAP