App-diff_spreadsheets
view release on metacpan or search on metacpan
t/t_TestCommon.pm view on Meta::CPAN
#our @quotes = ("<<", ">>");
sub rawstr(_) { # just the characters in French Quotes (truncated)
# Show spaces visibly
my $text = $_[0];
##$text =~ s/ /\N{MIDDLE DOT}/gs;
$quotes[0].(length($text)>$showstr_maxlen ? substr($text,0,$showstr_maxlen-3)."..." : $text).$quotes[1]
}
# Show controls as single-charcter indicators like DDI's "controlpics",
# with the whole thing in French Quotes. Truncate if huge.
sub showcontrols(_) {
local $_ = shift;
s/\n/\N{U+2424}/sg; # a special NL glyph
s/[\x{00}-\x{1F}]/ chr( ord($&)+0x2400 ) /aseg;
rawstr
}
# Show controls as traditional \t \n etc. if possible
sub showstr(_) {
if (defined &Data::Dumper::Interp::visnew) {
return visnew->Useqq("unicode")->vis(shift);
} else {
# I don't want to require Data::Dumper::Interp to be
# loaded although it will be if t_Common.pm was used also.
return showcontrols(shift);
}
}
# Show the raw string in French Quotes.
# If STDOUT is not UTF-8 encoded, also show D::D hex escapes
# so we can still see something useful in output from non-Unicode platforms.
sub displaystr($) {
my ($input) = @_;
return "undef" if ! defined($input);
local $_;
state $utf8_output = grep /utf.?8/i, PerlIO::get_layers(*STDOUT, output=>1);
my $r = rawstr($input);
if (! $utf8_output && $input =~ /[^[:print:]]/a) {
# Data::Dumper will show 'wide' characters as hex escapes
my $dd = Data::Dumper->new([$input])->Useqq(1)->Terse(1)->Indent(0)->Dump;
if ($dd ne $input && $dd ne "\"$input\"") {
$r .= "\nD::D->$dd";
}
}
$r
}
sub fmt_codestring($;$) { # returns list of lines
my ($str, $prefix) = @_;
$prefix //= "line ";
my $i; map{ sprintf "%s%2d: %s\n", $prefix,++$i,$_ } (split /\n/,$_[0]);
}
# These wrappers add the caller's line number to the test description
# so they show when successful tests log their name.
# This is only visible with using "perl -Ilib t/xxx.t"
# not with 'prove -l' and so mostly pointless!
sub t_ok($;$) {
my ($isok, $test_label) = @_;
my $lno = (caller)[2];
$test_label = ($test_label//"") . " (line $lno)";
@_ = ( $isok, $test_label );
goto &Test2::V0::ok; # show caller's line number
}
sub ok_with_lineno($;$) { goto &t_ok };
sub t_is($$;$) {
my ($got, $exp, $test_label) = @_;
my $lno = (caller)[2];
$test_label = ($test_label//$exp//"undef") . " (line $lno)";
@_ = ( $got, $exp, $test_label );
goto &Test2::V0::is; # show caller's line number
}
sub is_with_lineno($$;$) { goto &t_is }
sub t_like($$;$) {
my ($got, $exp, $test_label) = @_;
my $lno = (caller)[2];
$test_label = ($test_label//$exp) . " (line $lno)";
@_ = ( $got, $exp, $test_label );
goto &Test2::V0::like; # show caller's line number
}
sub like_with_lineno($$;$) { goto &t_like }
sub _mycheck_end($$$) {
my ($errmsg, $test_label, $ok_only_if_failed) = @_;
return
if $ok_only_if_failed && !$errmsg;
my $lno = (caller)[2];
&Test2::V0::diag("**********\n${errmsg}***********\n") if $errmsg;
@_ = ( !$errmsg, $test_label );
goto &ok_with_lineno;
}
# Nicer alternative to mycheck() when 'expected' is a literal string, not regex
sub mycheckeq_literal($$$) {
my ($desc, $exp, $act) = @_;
#confess "'exp' is not plain string in mycheckeq_literal" if ref($exp); #not re!
$exp = show_white($exp); # stringifies undef
$act = show_white($act);
return unless $exp ne $act;
my $hposn = 0;
my $vposn = 0;
for (0..length($exp)) {
my $c = substr($exp,$_,1);
last if $c ne substr($act,$_,1);
++$hposn;
if ($c eq "\n") {
$hposn = 0;
++$vposn;
}
}
@_ = ( "\n**************************************\n"
.($desc ? "${desc}\n" : "")
."Expected:\n".displaystr($exp)."\n"
."Actual:\n".displaystr($act)."\n"
# + for opening « or << in the displayed str
.(" " x ($hposn+length($quotes[0])))."^"
.($vposn > 0 ? "(line ".($vposn+1).")\n" : "\n")
." at line ", (caller(0))[2]."\n"
) ;
goto &Carp::confess;
#Carp::confess(@_);
}
sub expect1($$) {
@_ = ("", @_);
goto &mycheckeq_literal;
}
# Convert a literal "expected" string which contains things which are
# represented differently among versions of Perl and/or Data::Dumper
# into a regex which works with all versions.
# As of 1/1/23 the input string is expected to be what Perl v5.34 produces.
our $bs = '\\'; # a single backslash
sub _expstr2restr($) {
local $_ = shift;
confess "bug" if ref($_);
return $_ if $_ eq "";
# In \Q *string* \E the *string* may not end in a backslash because
# it would be parsed as (\\)(E) instead of (\)(\E).
# So change them to a unique token and later replace problematic
# instances with ${bs} variable references.
s/\\/<BS>/g;
$_ = '\Q' . $_ . '\E';
s#([\$\@\%]+)# do{ local $_ = $1;
join "", '\\E', (map{ "\\$_" } split(//,$_)), '\\Q'
} #eg;
if (m#qr/#) {
( run in 1.063 second using v1.01-cache-2.11-cpan-ceb78f64989 )