X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Flyx2lyx%2Ftest_parser_tools.py;h=55d6d89e056c634357ef56094d57f4620eb31737;hb=69ed8cb89abd291b19ca2a3423d1f368a0d67f71;hp=bb3b32feb79c73ffd6f427f3c3dffc3bada03b74;hpb=6fe2e45f9731ef4a915aaf17d5ca2aa6ec796a76;p=lyx.git diff --git a/lib/lyx2lyx/test_parser_tools.py b/lib/lyx2lyx/test_parser_tools.py index bb3b32feb7..55d6d89e05 100644 --- a/lib/lyx2lyx/test_parser_tools.py +++ b/lib/lyx2lyx/test_parser_tools.py @@ -22,7 +22,7 @@ from parser_tools import * import unittest -ug = r""" +lines = r""" \begin_layout Standard The \begin_inset Quotes eld @@ -56,9 +56,26 @@ Introduction describes that, too. \end_layout -""" +""".splitlines() + +header = r"""\begin_header +\origin unavailable +\paperpagestyle default +\output_changes false +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict fallse +\end_header""".splitlines() + +newheader = r"""\begin_header +\origin unavailable +\paperpagestyle default +\output_changes true +\html_math_output 0 +\html_css_as_file 1 +\html_be_strict false +\end_header""".splitlines() -lines = ug.splitlines() class TestParserTools(unittest.TestCase): @@ -77,10 +94,21 @@ class TestParserTools(unittest.TestCase): def test_find_token(self): self.assertEqual(find_token(lines, '\\emph', 0), 7) - self.assertEqual(find_token(lines, '\\emph', 0, 5), -1) - self.assertEqual(find_token(lines, '\\emp', 0, 0, True), -1) - self.assertEqual(find_token(lines, '\\emp', 0, 0, False), 7) + # no line starts with "emph" (without backspace): self.assertEqual(find_token(lines, 'emph', 0), -1) + # token on line[start] is found: + self.assertEqual(find_token(lines, '\\emph', 7), 7) + self.assertEqual(find_token(lines, '\\emph', 8), 9) + # token on line[end] is not found: + self.assertEqual(find_token(lines, '\\emph', 0, 7), -1) + # `ignorews` looks for whitespace-separated tokens: + self.assertEqual(find_token(lines, '\\emp', 0, ignorews=True), -1) + self.assertEqual(find_token(lines, '\\emph',0, ignorews=True), 7) + self.assertEqual(find_token(lines, '\\emph', 7, ignorews=True), 7) + self.assertEqual(find_token(lines, '\\emph', 0, 7, True), -1) + # only first token is found: + self.assertEqual(find_token(lines, 'Quotes', 0), -1) + self.assertEqual(find_token(lines, 'Quotes', 0, ignorews=True), -1) def test_find_tokens(self): @@ -89,5 +117,128 @@ class TestParserTools(unittest.TestCase): self.assertEqual(find_tokens(lines, tokens, 0, 4), -1) + def test_find_substring(self): + # Quotes is not a "token" (substring at the start of any line): + self.assertEqual(find_token(lines, "Quotes", 0), -1) + self.assertEqual(find_substring(lines, "Quotes", 0), 3) + # return -1 on failure: + self.assertEqual(find_substring(lines, "Qualen", 0), -1) + + + def test_find_re(self): + regexp_object = re.compile(r'\\begin.*Quote') + # matching starts with line[start] (default: start=0) + self.assertEqual(find_re(lines, regexp_object), 3) + self.assertEqual(find_re(lines, regexp_object, start=3), 3) + # matching ends one line *before* line[end]: + self.assertEqual(find_re(lines, regexp_object, start=4), 11) + self.assertEqual(find_re(lines, regexp_object, start=4, end=11), -1) + + def test_find_complete_lines(self): + sublines = ["\\begin_inset Quotes eld", + "\\end_inset"] + # return index of first line of sublines: + self.assertEqual(find_complete_lines(lines, sublines), 3) + self.assertEqual(find_complete_lines(lines, ["\\end_inset"]), 4) + # return -1 if sublines is not found: + self.assertEqual(find_complete_lines(lines, ['x']), -1) + # search includes line `start`: + self.assertEqual(find_complete_lines(lines, sublines, 3), 3) + self.assertEqual(find_complete_lines(lines, sublines, 4), 20) + self.assertEqual(find_complete_lines(lines, sublines, 21), -1) + # serch excludes line `end` + self.assertEqual(find_complete_lines(lines, sublines, 4, 20), -1) + # an empty list is always found + self.assertEqual(find_complete_lines(lines, []), 0) + + + def test_find_across_lines(self): + # sub with at least 2 line-breaks (uses find_complete_lines): + sub = "Quotes eld\n\\end_inset\n\n\n" + self.assertEqual(find_across_lines(lines, sub), 3) + # Return -1 if not found + self.assertEqual(find_across_lines(lines, sub, 4), -1) + self.assertEqual(find_across_lines(lines, sub, 0, 6), -1) + sub = "Quotes eld\n\\end_inset\nx\n" + self.assertEqual(find_across_lines(lines, sub), -1) + sub = "Quotes X\n\\end_inset\n\n" + self.assertEqual(find_across_lines(lines, sub), -1) + sub = "Quotes eld\n\\end_insert\n\n" + self.assertEqual(find_across_lines(lines, sub), -1) + # sub with up to 1 line-break: + sub = "Quotes eld\n\\end_inset" + self.assertEqual(find_across_lines(lines, sub), 3) + self.assertEqual(find_across_lines(lines, sub, 4), -1) + self.assertEqual(find_across_lines(lines, sub, 0, 4), -1) + self.assertEqual(find_across_lines(lines, sub, 4, 3), -1) + sub = "Quotes X eld\n\\end_inset\n" + self.assertEqual(find_across_lines(lines, sub), -1) + sub = "Quotes eld\n\\end_insert\n" + self.assertEqual(find_across_lines(lines, sub), -1) + # sub without line-break + sub = "end_" + self.assertEqual(find_across_lines(lines, sub), 4) + self.assertEqual(find_across_lines(lines, sub, 5), 12) + self.assertEqual(find_across_lines(lines, sub, 0, 4), -1) + self.assertEqual(find_across_lines(lines, sub, 2, 1), -1) + self.assertEqual(find_across_lines(lines, "XXX"), -1) + + + def test_get_value(self): + self.assertEqual(get_value(lines, "\\begin_inset"), "Quotes eld") + # TODO: do we want this: + self.assertEqual(get_value(lines, "\\begin_inset Quotes"), "Quotes eld") + # or only the part after "token": + # self.assertEqual(get_value(lines, "\\begin_inset Quotes"), "eld") + # return default if not found + self.assertEqual(get_value(lines, "\\begin_insert", default=42), 42) + # TODO: do we want this: + self.assertEqual(get_value(lines, "\\end_inset", default=None), None) + # or emtpy string if token is found but has no value: + # self.assertEqual(get_value(lines, "\\end_inset", default=None), "") + + def test_get_bool_value(self): + self.assertEqual(get_bool_value(header, "\\output_changes"), False) + self.assertEqual(get_bool_value(newheader, "\\output_changes"), True) + self.assertEqual(get_bool_value(header, "\\html_css_as_file"), False) + self.assertEqual(get_bool_value(newheader, "\\html_css_as_file"), True) + self.assertEqual(get_bool_value(header, "\\something"), None) + self.assertEqual(get_bool_value(header, "\\output_changes", 4), None) + + def test_set_bool_value(self): + # set to new value, return old value + self.assertEqual(set_bool_value(header, "\\output_changes", True), False) + self.assertEqual(set_bool_value(header, "\\html_css_as_file", True), False) + # return default if misspelled: + self.assertEqual(set_bool_value(header, "\\html_be_strict", False), None) + # catch error and insert new setting: + self.assertRaises(ValueError, set_bool_value, header, "\\something", 0) + self.assertEqual(header, newheader) + + def test_del_complete_lines(self): + l = lines[:] + sublines = ["\\begin_inset Quotes eld", + "\\end_inset"] + # normal operation: remove the first occurence of sublines: + self.assertEqual(del_complete_lines(l, sublines), True) + self.assertEqual(l[3], "") + self.assertEqual(len(l), len(lines)-len(sublines)) + # special cases: + l = lines[:] + self.assertEqual(del_complete_lines(l, sublines, 21), False) + self.assertEqual(l, lines) + # deleting empty sublist returns success but does not change the list: + self.assertEqual(del_complete_lines(l, [], 21), True) + self.assertEqual(l, lines) + + def test_del_value(self): + l = lines[:] + self.assertEqual(del_value(l, "\\begin_inset"), "Quotes eld") + self.assertEqual(del_value(l, "\\begin_inset Quotes"), "erd") + # return default if not found + self.assertEqual(del_value(l, "\\begin_insert", default=42), 42) + self.assertEqual(del_value(l, "\\end_inset", default=None), "") + + if __name__ == '__main__': unittest.main()