#!/usr/bin/perl
#
# Basic functions used by most of the test scripts.
#
sub run_tests {
my ($testref) = @_;
my @tests = @$testref;
my ($nt, $i);
$nt = scalar @tests; # number of sub-tests
foreach $i (1 .. $nt) {
my $testref = shift @tests;
my ($cols, $rows, $text, @output) = @$testref;
my ($ncols, $nrows, $row, $col, $settings);
my ($line, $aline, $alineref, $galine, $passed);
$settings = undef;
if (ref $cols) {
($settings, $cols, $rows, $text, @output) = @$testref;
}
print "$i..$nt\n";
my $vt = Term::VT102->new ('cols' => $cols, 'rows' => $rows);
($ncols, $nrows) = $vt->size ();
if (($cols != $ncols) or ($rows != $nrows)) {
print "not ok $i\n";
warn "returned size: $ncols x $nrows, wanted $cols x $rows\n";
next;
}
if (defined $settings) {
foreach (keys %$settings) {
if (
!defined $vt->option_set ($_,$settings->{$_})
) {
print "not ok $i\n";
warn "failed to set option: $_";
}
}
}
$vt->process ($text);
$row = 0;
$passed = 1;
while ($#output > 0) {
$line = shift @output;
if (ref $output[0]) {
$alineref = shift @output;
$aline = "";
foreach (@$alineref) {
$aline .= $vt->attr_pack (@$_);
}
} else {
$alineref = undef;
}
$row ++;
if ($vt->row_text ($row) ne $line) {
$passed = 0;
print STDERR "test $i: row $row incorrect, got '" .
show_text ($vt->row_text ($row)) . "', expected '" .
show_text ($line) . "'\n";
next;
}
next if (not defined $alineref);
$galine = $vt->row_attr ($row);
for ($col = 0; $col < $cols; $col ++) {
if (substr ($aline, 2 * $col, 2) ne substr ($galine, 2 * $col, 2)) {
$passed = 0;
print STDERR "test $i: row $row col " . ($col + 1) .
" attributes incorrect, got '" .
show_attr ($vt, substr ($galine, 2 * $col, 2)) .
"', expected '" .
show_attr ($vt, substr ($aline, 2 * $col, 2)) . "'\n";
next;
}
}
}
if ($passed == 0) {
print "not ok $i\n";
print STDERR "screen contents ($cols x $rows):\n";
for (my $dumprow = 1; $dumprow <= $rows; $dumprow++) {
print STDERR "[" . $vt->row_plaintext ($dumprow) . "]\n";
}
} else {
print "ok $i\n";
}
}
}
sub show_text {
my ($text) = @_;
return "" if (not defined $text);
$text =~ s/([^\040-\176])/sprintf ("\\%o", ord ($1))/ge;
return $text;
}
sub show_attr {
my ($vt, $attr) = @_;
my ($fg,$bg,$bo,$fa,$st,$ul,$bl,$rv) = $vt->attr_unpack ($attr);
my $str = "$fg-$bg";
$str .= "b" if ($bo != 0);
$str .= "f" if ($fa != 0);
$str .= "s" if ($st != 0);
$str .= "u" if ($ul != 0);
$str .= "F" if ($bl != 0);
$str .= "r" if ($rv != 0);
return $str . "-" . sprintf ("%04X", unpack ('S', $attr));
}
1;
# EOF