import unittest
-ug = r"""
+lines = r"""
\begin_layout Standard
The
\begin_inset Quotes eld
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):
def test_check_token(self):
line = "\\begin_layout Standard"
- self.assertEquals(check_token(line, '\\begin_layout'), True)
- self.assertEquals(check_token(line, 'Standard'), False)
+ self.assertEqual(check_token(line, '\\begin_layout'), True)
+ self.assertEqual(check_token(line, 'Standard'), False)
def test_is_nonempty_line(self):
- self.assertEquals(is_nonempty_line(lines[0]), False)
- self.assertEquals(is_nonempty_line(lines[1]), True)
- self.assertEquals(is_nonempty_line(" "*5), False)
+ self.assertEqual(is_nonempty_line(lines[0]), False)
+ self.assertEqual(is_nonempty_line(lines[1]), True)
+ self.assertEqual(is_nonempty_line(" "*5), False)
def test_find_token(self):
- self.assertEquals(find_token(lines, '\\emph', 0), 7)
- self.assertEquals(find_token(lines, '\\emph', 0, 5), -1)
- self.assertEquals(find_token(lines, '\\emp', 0, 0, True), -1)
- self.assertEquals(find_token(lines, '\\emp', 0, 0, False), 7)
- self.assertEquals(find_token(lines, 'emph', 0), -1)
+ self.assertEqual(find_token(lines, '\\emph', 0), 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):
tokens = ['\\emph', '\\end_inset']
- self.assertEquals(find_tokens(lines, tokens, 0), 4)
- self.assertEquals(find_tokens(lines, tokens, 0, 4), -1)
-
-
-if __name__ == '__main__':
- unittest.main()
+ self.assertEqual(find_tokens(lines, tokens, 0), 4)
+ 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()