use strict;
use lib '.';
use Texinfo::ModulePath (undef, undef, undef, 'updirs' => 2);
use Test::More;
BEGIN { plan tests => 45; }
use Texinfo::Convert::Texinfo;
use Texinfo::Parser;
# For consistent error messages, use the C locale
$ENV{LC_ALL} = 'C';
$ENV{LANGUAGE} = 'en';
# test regressions specific of parse_texi_line
sub test_line($$$$)
{
my $parser = shift;
my $texinfo_line = shift;
my $test_explanation = shift;
my $errors_references = shift;
if (not defined($parser)) {
$parser = Texinfo::Parser::parser();
}
#$parser->{'DEBUG'} = 1; print STDERR "\n$test_explanation\n\n";
my $tree = $parser->parse_texi_line($texinfo_line);
my $check_texinfo = Texinfo::Convert::Texinfo::convert_to_texinfo($tree);
is ($texinfo_line, $check_texinfo, $test_explanation);
my $parser_registrar = $parser->registered_errors();
my ($error_warnings_list, $error_count) = $parser_registrar->errors();
if (defined($errors_references)) {
is (scalar(@$errors_references), scalar(@$error_warnings_list),
"warning/errors nr $test_explanation");
}
my $error_idx = 0;
foreach my $error_message (@$error_warnings_list) {
if (defined($errors_references) and $error_idx < scalar(@$errors_references)) {
my ($error_line_nr_reference, $error_line_reference)
= @{$errors_references->[$error_idx]};
is ($error_message->{'line_nr'}, $error_line_nr_reference,
"$test_explanation error line $error_idx");
is ($error_message->{'error_line'}, $error_line_reference."\n",
"$test_explanation error message $error_idx");
} else {
warn "not caught: $error_message->{'error_line'}";
}
$error_idx++;
}
}
my @tests = (
["\@node a node\n", 'node line'],
["aa \@exdent in exdent", 'exdent error no end line',
[[1, 'warning: @exdent should only appear at the beginning of a line']]],
["aa \@exdent in exdent\n", 'exdent error with end line',
[[1, 'warning: @exdent should only appear at the beginning of a line']]],
['@node node
a node
@setfilename long.info
@copying
In copying
@end copying
@float type, a
@verbatim
in verbatim
@end verbatim
@caption{in caption}
@end float
@cindex in index
@node node 2
@chapter chap
in chapter
@columnfractions a b
@printindex cp
@listoffloats type
@bye
', 'long example', [[4, 'warning: @setfilename after the first element'],
[24, 'column fraction not a number: a'],
[24, 'column fraction not a number: b'],
[20, '@columnfractions only meaningful on a @multitable line'],
]]
);
foreach my $test_string_explanation (@tests) {
my ($texi_string, $explanation, $error_messages) = @$test_string_explanation;
test_line(undef, $texi_string, $explanation, $error_messages);
}
# test with the same parser reused
my $parser = Texinfo::Parser::parser();
my @concatenated_error_messages = ();
foreach my $test_string_explanation (@tests) {
my ($texi_string, $explanation, $error_messages) = @$test_string_explanation;
push @concatenated_error_messages, @$error_messages if (defined($error_messages));
test_line($parser, $texi_string, $explanation, \@concatenated_error_messages);
}