blob: ee08e202054aa783afab8ccc3f02559ff93711b7 [file] [log] [blame]
use strict;
use Test::More;
use File::Spec;
use File::Basename;
use lib '.';
use Texinfo::ModulePath (undef, undef, undef, 'updirs' => 2);
BEGIN { plan tests => 122 ; }
use Texinfo::Convert::Paragraph;
ok(1, "modules loading"); # If we made it this far, we're ok.
sub test_para($$$;$)
{
my $args = shift;
my $reference = shift;
my $name = shift;
my $conf = shift;
my $result = '';
$conf = {} if (!defined($conf));
#$conf->{'DEBUG'} = 1;
my $para = Texinfo::Convert::Paragraph->new($conf);
foreach my $arg (@$args) {
$result .= add_text($para, $arg);
}
$result .= Texinfo::Convert::Paragraph::end($para);
if (defined($reference)) {
is ($result, $reference, $name);
} else {
print STDERR "$result\n";
}
}
test_para(['word'], "word\n", 'word');
test_para(['word other'], "word other\n", 'two_words');
test_para(['word other'], "word other\n", 'two_words two spaces');
test_para(['word ', ' other'], "word other\n", 'two_words feed, space inside');
test_para(['word '], "word\n", 'trailing spaces');
test_para([' word'], "word\n", 'leading spaces');
test_para([' ', ' word'], "word\n", 'double leading spaces');
test_para(["word\n", "a"], "word a\n", 'trailing end of line and word');
test_para(['word', "\n", "a"], "word a\n", 'appended end of line and word');
test_para(['word other'], "word\nother\n", 'two_words_max', {'max' => 2});
test_para(['word other'], "word\nother\n", 'two_words_max_less_one', {'max' => 3});
test_para(['word other'], "word\nother\n", 'two_words_max_exact', {'max' => 4});
test_para(['word other'], "word\nother\n", 'two_words_max_plus_one', {'max' => 5});
test_para(['word other'], "word\nother\n", 'two_words_max_plus_two', {'max' => 6});
test_para(['word o'], "word\no\n", 'word_letter_max_exact', {'max' => 5});
test_para(['word o'], "word o\n", 'word_letter_max_plus_two', {'max' => 6});
test_para(['word other'], "word other\n", 'two_words_two_spaces');
test_para(['word. other'], "word. other\n", 'two_words_dot');
#test_para(['word. other'], "word. other\n", 'two_words_dot_one_space');
test_para(['word. other'], "word. other\n", 'two_words_dot_one_space');
test_para(['word.) other'], "word.) other\n", 'two_words_dot_paren_one_space');
test_para(['word.). other'], "word.). other\n", 'two_words_dot_paren_dot');
test_para(['word.. other'], "word.. other\n", 'two_words_dot_dot');
test_para(['worD. other'], "worD. other\n", 'two_words_dot_upper');
test_para(['worD.) other'], "worD.) other\n", 'two_words_dot_paren_upper');
test_para(['worD). other'], "worD). other\n", 'two_words_paren_dot_upper');
test_para(["word.\n", "\n", "\n", 'other',], "word. other\n", 'three_newlines');
test_para(['word','other'], "wordother\n", 'concatenate');
test_para(['word.', ' A'], "word. A\n", 'punctuation_at_end_fragment');
test_para(['word','other'], "wordother\n", 'concatenate_max', {'max' => 2});
test_para(['word ','other'], "word\nother\n", 'two_elements_max', {'max' => 2});
test_para(['word',' other'], "word\nother\n", 'two_elements_space_max', {'max' => 2});
test_para(["\x{7b2c}\x{4e00} ",'other'], "\x{7b2c}\n\x{4e00}\nother\n", 'east_asian', {'max' => 2});
test_para(['word. other'], "word. other\n", 'two_words_dot_frenchspacing', {'frenchspacing' => 1});
test_para(["aa.)\x{7b2c} b"], "aa.)\x{7b2c} b\n", 'end_sentence_east_asian');
test_para(["B\x{7b2c}. After\x{7b2c}. Last"], "B\x{7b2c}. After\x{7b2c}. Last\n",
'east_asian_before_end_sentence');
# uses a fullwidth b
test_para(["B\x{ff42}. After\x{ff42}. Last"], "B\x{ff42}. After\x{ff42}. Last\n",
'fullwidth_lower_case_latin_before_end_sentence');
# uses a fullwidth R
test_para(["B\x{ff32}. After\x{ff32}. Last"], "B\x{ff32}. After\x{ff32}. Last\n",
'fullwidth_upper_case_latin_before_end_sentence');
test_para(["aaaa bbbbbbb cccccccc dddddddddddd eeeeeeeeeeee fffffffff ggggggg"],
" aaaa
bbbbbbb
cccccccc
dddddddddddd
eeeeeeeeeeee
fffffffff
ggggggg
",
'indent_indent_next', {'max' => 6, 'indent_length' => 3, 'indent_length_next' => 1});
test_para(["aaaa bbbbbbb cccccccc dddddddddddd eeeeeeeeeeee fffffffff ggggggg"],
" aaaa
bbbbbbb
cccccccc
dddddddddddd
eeeeeeeeeeee
fffffffff
ggggggg
",
'indent_no_indent_next', {'max' => 12, 'indent_length' => 4, 'indent_length_next' => 0});
test_para(["aaaa bbbbbbb cccccccc dddddddddddd eeeeeeeeeeee fffffffff ggggggg"],
" aaaa
bbbbbbb
cccccccc
dddddddddddd
eeeeeeeeeeee
fffffffff
ggggggg
",
'indent_undef_indent_next', {'max' => 12, 'indent_length' => 4});
test_para(["aaaa bbbbbbb cccccccc dddddddddddd eeeeeeeeeeee fffffffff ggggggg"],
"aaaa bbbbbbb
cccccccc
dddddddddddd
eeeeeeeeeeee
fffffffff
ggggggg
",
'indent_next_no_indent', {'max' => 12, 'indent_length' => 0, 'indent_length_next' => 3});
test_para(["aaaa bbbbbbb cccccccc dddddddddddd eeeeeeeeeeee fffffffff ggggggg"],
"aaaa bbbbbbb
cccccccc
dddddddddddd
eeeeeeeeeeee
fffffffff
ggggggg
",
'indent_next_undef_indent', {'max' => 12, 'indent_length_next' => 3});
test_para(["aaaa"], " aaaa\n", 'indent_and_counter_lower',
{'indent_length' => 8, 'counter' => 6});
test_para(["aaaa"], "aaaa\n", 'indent_zero_and_counter',
{'indent_length' => 0, 'counter' => 6});
test_para(["aaaa"], "aaaa\n", 'indent_and_counter_higher',
{'indent_length' => 3, 'counter' => 6});
test_para(["aaaa bbbbbbb cccccccc dddddddddddd"],
"aaaa bbbbbbb\ncccccccc dddddddddddd\n",
"counter_and_line", {'counter' => 60});
my $para = Texinfo::Convert::Paragraph->new();
my $result = '';
$result .= add_text($para, 'aa.)');
$result .= add_next($para, '_');
$result .= add_text($para, ' after');
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result, "aa.)_ after\n", 'add char after end sentence parentheses');
$para = Texinfo::Convert::Paragraph->new();
$result = '';
$result .= add_text($para, 'b ');
$result .= add_next($para, '_');
$result .= add_text($para, '.');
$result .= add_next($para, '_');
$result .= add_text($para, ' after');
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result, "b _._ after\n", 'add char after end sentence');
$para = Texinfo::Convert::Paragraph->new();
$result = '';
$result .= add_next($para, 'a');
$result .= add_next($para, "\n");
$result .= add_next($para, '_');
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result, "a\n_\n", 'add_next: add char after separate end line');
$para = Texinfo::Convert::Paragraph->new();
$result = '';
$result .= add_next($para, "a\n");
$result .= add_next($para, '_');
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result, "a\n_\n", 'add_next: add char after end line');
$para = Texinfo::Convert::Paragraph->new();
$result = '';
$result .= add_text($para, "A");
$result .= add_next($para, '_');
$result .= add_text($para, ".)");
$result .= add_text($para, " Next");
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result, "A_.) Next\n", 'add_next: period after next, not transparent');
$para = Texinfo::Convert::Paragraph->new();
$result = '';
$result .= add_text($para, "A");
$result .= add_next($para, '_', 1);
$result .= add_text($para, ".)");
$result .= add_text($para, " Next");
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result, "A_.) Next\n", 'add_next: period after next, transparent');
$para = Texinfo::Convert::Paragraph->new();
$result = '';
$result .= add_text($para, "aa.\n");
set_space_protection($para, undef,undef,undef,1);
$result .= add_next($para, '_');
$result .= add_text($para, "b");
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result, "aa. _b\n", 'add char after space protection end sentence space');
$para = Texinfo::Convert::Paragraph->new();
$result = '';
set_space_protection($para, undef,undef,undef,1);
$result .= add_text($para, "b");
set_space_protection($para, undef,undef,undef,0);
$result .= add_text($para, ". after");
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result, "b. after\n", 'punctuation after end space protection');
$para = Texinfo::Convert::Paragraph->new();
$result = '';
set_space_protection($para, undef,undef,undef,1);
$result .= add_text($para, "b.");
set_space_protection($para, undef,undef,undef,0);
$result .= add_text($para, " follow");
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result, "b. follow\n", 'punctuation before end space protection');
$para = Texinfo::Convert::Paragraph->new();
$result = '';
set_space_protection($para, undef,undef,undef,1);
$result .= add_text($para, "b.");
set_space_protection($para, undef,undef,undef,0);
$result .= add_text($para, " follow");
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result, "b. follow\n", 'punctuation before end space protection 2 space');
$para = Texinfo::Convert::Paragraph->new();
$result = '';
set_space_protection($para, undef,undef,undef,1);
$result .= add_text($para, "b. ");
set_space_protection($para, undef,undef,undef,0);
$result .= add_text($para, " follow");
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result, "b. follow\n", 'punctuation space before end space protection');
$para = Texinfo::Convert::Paragraph->new();
$result = '';
$result .= add_text($para, "In w:\n");
set_space_protection($para, 1,1);
$result .= add_text($para, "Out of code -- out-of-code. ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg");
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result, "In w: Out of code -- out-of-code. ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg\n", 'space protection after end sentence');
$para = Texinfo::Convert::Paragraph->new();
$result = '';
$result .= add_text($para, "In w:\n");
set_space_protection($para, 1,1);
$result .= add_text($para, "Out of code -- out-of-code.");
set_space_protection($para, undef,undef,undef,1);
$result .= add_text($para, "in code");
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result, "In w: Out of code -- out-of-code.in code\n", 'set frenchspacing after space protection');
$para = Texinfo::Convert::Paragraph->new();
$result = '';
$result .= add_text($para, "a ");
$result .= add_next($para, '...', 1);
$result .= add_text($para, "c");
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result, "a ...c\n", 'add end sentence and text');
$para = Texinfo::Convert::Paragraph->new();
$result = '';
$result .= end_line($para);
$result .= add_text($para, ' after');
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result, "\nafter\n", 'space after end_line');
#print STDERR "$result";
$para = Texinfo::Convert::Paragraph->new();
$result = '';
$result .= add_text($para, 'aa.)');
$result .= add_pending_word($para);
is ($result, 'aa.)', 'call add_pending_word');
$result = end_line($para);
is ($result, "\n", 'call end_line after add_pending_word');
$result = Texinfo::Convert::Paragraph::end($para);
is ($result, '', 'call end after end_line');
$para = Texinfo::Convert::Paragraph->new();
$result = '';
$result .= add_text($para, 'aa.)');
$result .= add_pending_word($para);
$result .= add_text($para, ' after');
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result, "aa.) after\n", 'space after sentence and add_pending_word');
$para = Texinfo::Convert::Paragraph->new();
$result = '';
$result .= add_text($para, 'aA');
$result .= add_next($para, '.');
add_end_sentence($para, 1);
$result .= add_text($para, ' after');
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result, "aA. after\n", 'force end sentence after upper case');
$para = Texinfo::Convert::Paragraph->new();
$result = '';
$result .= add_text($para, 'aa');
$result .= add_next($para, '.');
add_end_sentence($para, 1);
$result .= add_text($para, 'b c');
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result, "aa.b c\n", 'force end sentence followed by text');
$para = Texinfo::Convert::Paragraph->new();
$result = '';
$result .= add_text($para, 'aA');
$result .= add_text($para, '.');
$result .= add_text($para, ' after');
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result, "aA. after\n", 'end sentence after upper case');
$para = Texinfo::Convert::Paragraph->new();
$result = '';
$result .= add_text($para, 'aa.)');
$result .= add_text($para, '))');
$result .= add_text($para, ' after');
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result, "aa.))) after\n", 'continue with after_punctuation_characters');
$para = Texinfo::Convert::Paragraph->new();
$result = '';
$result .= add_text($para, 'aa.)');
remove_end_sentence($para, );
$result .= add_text($para, ' after');
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result, "aa.) after\n", 'inhibit end sentence');
$para = Texinfo::Convert::Paragraph->new();
$result = '';
$result .= add_text($para, 'aa.)');
remove_end_sentence($para, );
$result .= add_next($para, '_');
$result .= add_text($para, ' after');
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result, "aa.)_ after\n", 'inhibit end sentence then add next');
$para = Texinfo::Convert::Paragraph->new();
$result = '';
$result .= add_text($para, 'aa.)');
remove_end_sentence($para, );
$result .= add_text($para, 'aa.)');
$result .= add_text($para, ' after');
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result, "aa.)aa.) after\n", 'cancel inhibit end sentence');
$para = Texinfo::Convert::Paragraph->new();
$result = '';
$result .= add_text($para, 'aa.)');
remove_end_sentence($para, );
$result .= add_text($para, '))');
$result .= add_text($para, ' after');
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result, "aa.))) after\n", 'inhibit end sentence and ))');
$para = Texinfo::Convert::Paragraph->new();
$result = '';
set_space_protection($para, undef,1,1);
$result .= add_text($para, ' aa.) bb.');
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result,"aa.) bb.\n", 'leading spaces ignore columns and keep spaces');
$para = Texinfo::Convert::Paragraph->new({'max' => 2});
$result = '';
set_space_protection($para, 1,1);
$result .= add_text($para, 'aa.) bb ');
$result = add_text($para, ' eee ');
$result .= add_text($para, ' .)');
$result .= add_next($para, '_');
$result .= add_text($para, "\n");
$result .= add_text($para, "aa\n");
$result .= add_text($para, ' . gg');
$result .= add_text($para, ". \n");
$result .= add_text($para, "a");
$result .= add_text($para, ' ');
set_space_protection($para, 0,0);
$result .= add_text($para, "c ");
is ($result, "aa.) bb eee .)_ aa . gg. a c\n", "protected spaces many inputs");
Texinfo::Convert::Paragraph::end($para);
$para = Texinfo::Convert::Paragraph->new({'max' => 10});
$result = '';
$result .= add_next($para, "AAAAAAA");
$result .= add_text($para, "GGG GGG");
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result, "AAAAAAAGGG\nGGG\n", 'line split check');
$para = Texinfo::Convert::Paragraph->new({'max' => 10});
$result = '';
$result .= add_next($para, "AAAAAAA\n");
$result .= add_text($para, "GGG GGG");
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result, "AAAAAAA\nGGG GGG\n", 'end line reset counter');
$para = Texinfo::Convert::Paragraph->new({'indent_length' => 3});
$result = '';
set_space_protection($para, 1,1);
$result .= add_text($para, " a\n");
set_space_protection($para, 0,0);
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result, " a \n", 'end space protection by end line');
$para = Texinfo::Convert::Paragraph->new();
$result = '';
set_space_protection($para, 1,1);
$result .= add_text($para, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb bbbbb bbb b b b b b b b b b bb .\n");
$result .= add_text($para, "ccc dddd");
set_space_protection($para, 0,0);
$result .= add_text($para, "gg.\n");
$result .= Texinfo::Convert::Paragraph::end($para);
is ($result, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb bbbbb bbb b b b b b b b b b bb . ccc ddddgg.\n", 'long text followed by text protected');
$para = Texinfo::Convert::Paragraph->new();
$result = '';
$result .= add_text($para, 'aa');
set_space_protection($para, 1,1);
$result .= add_text($para, ' f f');
set_space_protection($para, 0,0);
$result .= add_text($para, "ggg\n");
is ($result, 'aa f fggg', 'protected space within words');
Texinfo::Convert::Paragraph::end($para);
$para = Texinfo::Convert::Paragraph->new();
$result = '';
$result = add_text($para, 'aa');
set_space_protection($para, 1,1);
$result .= add_text($para, ' f f ');
set_space_protection($para, 0,0);
$result .= add_text($para, "ggg\n");
is ($result, 'aa f f ggg', 'protected space and space within words');
Texinfo::Convert::Paragraph::end($para);
$para = Texinfo::Convert::Paragraph->new();
$result = '';
$result = add_text($para, 'aa ');
set_space_protection($para, 1,1);
$result .= add_text($para, ' f f ');
set_space_protection($para, 0,0);
$result .= add_text($para, "ggg\n");
is ($result, 'aa f f ggg', 'text space protected space and space within words');
Texinfo::Convert::Paragraph::end($para);
$para = Texinfo::Convert::Paragraph->new();
$result = '';
$result = add_text($para, 'aa ');
set_space_protection($para, 1,1);
$result .= add_text($para, ' f f ');
set_space_protection($para, 0,0);
$result .= add_text($para, " ggg\n");
is ($result, 'aa f f ggg', 'text space protected space and space after');
Texinfo::Convert::Paragraph::end($para);
$para = Texinfo::Convert::Paragraph->new();
$result = '';
$result = add_text($para, 'aa ');
set_space_protection($para, 1,1);
set_space_protection($para, 0,0);
$result .= add_text($para, " ggg\n");
is ($result, 'aa ggg', 'empty protected 2 space');
Texinfo::Convert::Paragraph::end($para);
$para = Texinfo::Convert::Paragraph->new();
$result = '';
$result = add_text($para, 'aa ');
set_space_protection($para, 1,1);
set_space_protection($para, 0,0);
$result .= add_text($para, "ggg\n");
is ($result, 'aa ggg', 'empty protected 1 before space');
Texinfo::Convert::Paragraph::end($para);
$para = Texinfo::Convert::Paragraph->new();
$result = '';
$result = add_text($para, 'aa');
set_space_protection($para, 1,1);
set_space_protection($para, 0,0);
$result .= add_text($para, " ggg\n");
is ($result, 'aa ggg', 'empty protected 1 after space');
Texinfo::Convert::Paragraph::end($para);
$para = Texinfo::Convert::Paragraph->new();
$result = '';
$result = add_text($para, 'aa ');
set_space_protection($para, 1,1);
$result .= add_text($para, ' ');
set_space_protection($para, 0,0);
$result .= add_text($para, " ggg\n");
is ($result, 'aa ggg', 'space protected space');
Texinfo::Convert::Paragraph::end($para);
sub _new_line_formatter(;$)
{
my $conf = shift;
if (!$conf) {
$conf = {};
}
$conf->{'max'} = 10000001;
$conf->{'keep_end_lines'} = 1;
$conf->{'no_final_newline'} = 1;
$conf->{'add_final_space'} = 1;
my $paragraph = Texinfo::Convert::Paragraph->new($conf);
return $paragraph;
}
sub test_line($$$;$)
{
my $args = shift;
my $reference = shift;
my $name = shift;
my $conf = shift;
my $result = '';
#$conf = {'DEBUG' => 1} if (!defined($conf));
$conf = {} if (!defined($conf));
my $line = _new_line_formatter($conf);
foreach my $arg (@$args) {
$result .= add_text($line, $arg);
}
$result .= Texinfo::Convert::Paragraph::end($line);
is ($result, $reference, "line $name");
#print STDERR "$result\n";
}
test_line(["word\n"], "word\n", 'word');
test_line(['word other'], "word other", 'two_words');
test_line(['word '], 'word ', 'trailing spaces');
test_line(["word \n"], "word\n", 'trailing spaces eol');
test_line([' word'], "word", 'leading spaces');
test_line([' ', ' word'], "word", 'double leading spaces');
test_line(['word other'], "word other", 'two_words_two_spaces');
test_line(['word. other'], "word. other", 'two_words_dot');
test_line(['word. other'], "word. other", 'two_words_dot_one_space');
test_line(['word.) other'], "word.) other", 'two_words_dot_paren_one_space');
test_line(['worD. other'], "worD. other", 'two_words_dot_upper');
test_line(['word','other',"\n"], "wordother\n", 'concatenate');
test_line(["\x{7b2c}\x{4e00} ","other \n"], "\x{7b2c}\x{4e00} other\n", 'east_asian');
test_line(['word. other'], "word. other", 'two_words_dot_frenchspacing', {'frenchspacing' => 1});
test_line(["aa.)\x{7b2c} b"], "aa.)\x{7b2c} b", 'end_sentence_east_asian');
my $line = _new_line_formatter();
$result = '';
$result .= add_text($line, 'aa.)');
$result .= add_next($line, '_');
$result .= add_text($line, ' after');
$result .= Texinfo::Convert::Paragraph::end($line);
is ($result, "aa.)_ after", 'line add char after end sentence');
$line = _new_line_formatter();
$result = '';
$result .= end_line($line);
$result .= add_text($line, ' after');
$result .= Texinfo::Convert::Paragraph::end($line);
is ($result, "\nafter", 'line space after end_line');
#print STDERR "$result";
$line = _new_line_formatter();
$result = '';
$result .= add_text($line, "A");
$result .= add_next($line, '_', 1);
$result .= add_text($line, ".)");
$result .= add_text($line, " Next");
$result .= Texinfo::Convert::Paragraph::end($line);
is ($result, "A_.) Next", 'line add_next: period after next, transparent');
$line = _new_line_formatter();
$result = '';
$result .= add_text($line, 'aa.)');
$result .= add_pending_word($line);
is ($result, 'aa.)', 'line call add_pending_word');
$result = end_line($line);
is ($result, "\n", 'line call end_line after add_pending_word');
$result = Texinfo::Convert::Paragraph::end($line);
is ($result, "", 'line call end after end_line');
$line = _new_line_formatter();
$result = '';
$result .= add_text($line, 'aa.)');
$result .= add_pending_word($line);
$result .= add_text($line, ' after');
$result .= Texinfo::Convert::Paragraph::end($line);
is ($result, "aa.) after", 'line space after sentence and add_pending_word');
$line = _new_line_formatter();
$result = '';
$result .= add_text($line, 'aA');
$result .= add_next($line, '.');
add_end_sentence($line, 1);
$result .= add_text($line, ' after');
$result .= Texinfo::Convert::Paragraph::end($line);
is ($result, "aA. after", 'line force end sentence after upper case');
$line = _new_line_formatter();
$result = '';
$result .= add_text($line, 'aA');
$result .= add_text($line, '.');
$result .= add_text($line, ' after');
$result .= Texinfo::Convert::Paragraph::end($line);
is ($result, "aA. after", 'line end sentence after upper case');
$line = _new_line_formatter();
$result = '';
$result .= add_text($line, 'aa.)');
$result .= add_text($line, '))');
$result .= add_text($line, ' after');
$result .= Texinfo::Convert::Paragraph::end($line);
is ($result, "aa.))) after", 'line continue with after_punctuation_characters');
$line = _new_line_formatter();
$result = '';
$result .= add_text($line, 'aa.)');
remove_end_sentence($line, );
$result .= add_text($line, ' after');
$result .= Texinfo::Convert::Paragraph::end($line);
is ($result, "aa.) after", 'line inhibit end sentence');
$line = _new_line_formatter();
$result = '';
$result .= add_text($line, 'aa.)');
remove_end_sentence($line, );
$result .= add_next($line, '_');
$result .= add_text($line, ' after');
$result .= Texinfo::Convert::Paragraph::end($line);
is ($result, "aa.)_ after", 'line inhibit end sentence then add next');
$line = _new_line_formatter();
$result = '';
$result .= add_text($line, 'aa.)');
remove_end_sentence($line, );
$result .= add_text($line, 'aa.)');
$result .= add_text($line, ' after');
$result .= Texinfo::Convert::Paragraph::end($line);
is ($result, "aa.)aa.) after", 'line cancel inhibit end sentence');
$line = _new_line_formatter();
$result = '';
$result .= add_text($line, 'aa.)');
remove_end_sentence($line, );
$result .= add_text($line, '))');
$result .= add_text($line, ' after');
$result .= Texinfo::Convert::Paragraph::end($line);
is ($result, "aa.))) after", 'line inhibit end sentence and ))');
$line = _new_line_formatter();
$result = '';
set_space_protection($line, 1,1);
$result .= add_text($line, ' aa.)');
$result .= add_text($line, ' ');
$result .= add_text($line, 'then');
$result .= add_text($line, 'fff g');
set_space_protection($line, 0,0);
$result .= Texinfo::Convert::Paragraph::end($line);
is ($result, " aa.) thenfff g", 'line space_protection and spaces');
$line = _new_line_formatter();
$result = '';
$result .= add_text($line, "aa. ");
set_space_protection($line, undef,undef,undef,1);
$result .= add_next($line, '_');
$result .= add_text($line, "b");
set_space_protection($line, undef,undef,undef,0);
$result .= add_text($line, ". after");
$result .= Texinfo::Convert::Paragraph::end($line);
is ($result, "aa. _b. after", 'line add char after space protection end sentence space');
$line = _new_line_formatter();
$result = '';
set_space_protection($line, undef,undef,undef,1);
$result .= add_text($line, "b.");
set_space_protection($line, undef,undef,undef,0);
$result .= add_text($line, " follow");
$result .= Texinfo::Convert::Paragraph::end($line);
is ($result, "b. follow", 'line punctuation before end space protection 2 space');
$line = _new_line_formatter();
$result = '';
set_space_protection($line, 1,1);
$result .= add_text($line, "protected. B");
set_space_protection($line, 0,0);
$result .= add_text($line, " after");
$result .= Texinfo::Convert::Paragraph::end($line);
is ($result, "protected. B after", 'line 2 spaces after end space protection');
$line = _new_line_formatter();
$result = '';
set_space_protection($line, 1,1);
$result .= add_text($line, "protected");
set_space_protection($line, 0,0);
$result .= add_text($line, " after");
$result .= Texinfo::Convert::Paragraph::end($line);
is ($result, "protected after", 'line 2 spaces after end space protection with dot');
1;