1 # This file is part of lyx2lyx
2 # Copyright (C) 2006 José Matos <jamatos@lyx.org>
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 "This modules tests the functions used to help parse lines."
20 from parser_tools import *
25 \begin_layout Standard
27 \begin_inset Quotes eld
35 \begin_inset Quotes erd
38 describes several things in addition to LyX's philosophy: most importantly,
39 the format of all of the manuals.
40 If you don't read it, you'll have a bear of a time navigating this manual.
41 You might also be better served looking in one of the other manuals instead
44 \begin_inset Quotes eld
52 \begin_inset Quotes erd
60 header = r"""\begin_header
62 \paperpagestyle default
66 \html_be_strict fallse
67 \end_header""".splitlines()
69 newheader = r"""\begin_header
71 \paperpagestyle default
76 \end_header""".splitlines()
79 class TestParserTools(unittest.TestCase):
80 def test_check_token(self):
81 line = "\\begin_layout Standard"
83 self.assertEqual(check_token(line, "\\begin_layout"), True)
84 self.assertEqual(check_token(line, "Standard"), False)
86 def test_is_nonempty_line(self):
87 self.assertEqual(is_nonempty_line(lines[0]), False)
88 self.assertEqual(is_nonempty_line(lines[1]), True)
89 self.assertEqual(is_nonempty_line(" " * 5), False)
91 def test_find_token(self):
92 self.assertEqual(find_token(lines, "\\emph", 0), 7)
93 # no line starts with "emph" (without backspace):
94 self.assertEqual(find_token(lines, "emph", 0), -1)
95 # token on line[start] is found:
96 self.assertEqual(find_token(lines, "\\emph", 7), 7)
97 self.assertEqual(find_token(lines, "\\emph", 8), 9)
98 # token on line[end] is not found:
99 self.assertEqual(find_token(lines, "\\emph", 0, 7), -1)
100 # `ignorews` looks for whitespace-separated tokens:
101 self.assertEqual(find_token(lines, "\\emp", 0, ignorews=True), -1)
102 self.assertEqual(find_token(lines, "\\emph", 0, ignorews=True), 7)
103 self.assertEqual(find_token(lines, "\\emph", 7, ignorews=True), 7)
104 self.assertEqual(find_token(lines, "\\emph", 0, 7, True), -1)
105 # only first token is found:
106 self.assertEqual(find_token(lines, "Quotes", 0), -1)
107 self.assertEqual(find_token(lines, "Quotes", 0, ignorews=True), -1)
109 def test_find_tokens(self):
110 tokens = ["\\emph", "\\end_inset"]
111 self.assertEqual(find_tokens(lines, tokens, 0), 4)
112 self.assertEqual(find_tokens(lines, tokens, 0, 4), -1)
114 def test_find_substring(self):
115 # Quotes is not a "token" (substring at the start of any line):
116 self.assertEqual(find_token(lines, "Quotes", 0), -1)
117 self.assertEqual(find_substring(lines, "Quotes", 0), 3)
118 # return -1 on failure:
119 self.assertEqual(find_substring(lines, "Qualen", 0), -1)
121 def test_find_re(self):
122 regexp_object = re.compile(r"\\begin.*Quote")
123 # matching starts with line[start] (default: start=0)
124 self.assertEqual(find_re(lines, regexp_object), 3)
125 self.assertEqual(find_re(lines, regexp_object, start=3), 3)
126 # matching ends one line *before* line[end]:
127 self.assertEqual(find_re(lines, regexp_object, start=4), 11)
128 self.assertEqual(find_re(lines, regexp_object, start=4, end=11), -1)
130 def test_find_complete_lines(self):
131 sublines = ["\\begin_inset Quotes eld", "\\end_inset"]
132 # return index of first line of sublines:
133 self.assertEqual(find_complete_lines(lines, sublines), 3)
134 self.assertEqual(find_complete_lines(lines, ["\\end_inset"]), 4)
135 # return -1 if sublines is not found:
136 self.assertEqual(find_complete_lines(lines, ["x"]), -1)
137 # search includes line `start`:
138 self.assertEqual(find_complete_lines(lines, sublines, 3), 3)
139 self.assertEqual(find_complete_lines(lines, sublines, 4), 20)
140 self.assertEqual(find_complete_lines(lines, sublines, 21), -1)
141 # serch excludes line `end`
142 self.assertEqual(find_complete_lines(lines, sublines, 4, 20), -1)
143 # an empty list is always found
144 self.assertEqual(find_complete_lines(lines, []), 0)
146 def test_find_across_lines(self):
147 # sub with at least 2 line-breaks (uses find_complete_lines):
148 sub = "Quotes eld\n\\end_inset\n\n\n"
149 self.assertEqual(find_across_lines(lines, sub), 3)
150 # Return -1 if not found
151 self.assertEqual(find_across_lines(lines, sub, 4), -1)
152 self.assertEqual(find_across_lines(lines, sub, 0, 6), -1)
153 sub = "Quotes eld\n\\end_inset\nx\n"
154 self.assertEqual(find_across_lines(lines, sub), -1)
155 sub = "Quotes X\n\\end_inset\n\n"
156 self.assertEqual(find_across_lines(lines, sub), -1)
157 sub = "Quotes eld\n\\end_insert\n\n"
158 self.assertEqual(find_across_lines(lines, sub), -1)
159 # sub with up to 1 line-break:
160 sub = "Quotes eld\n\\end_inset"
161 self.assertEqual(find_across_lines(lines, sub), 3)
162 self.assertEqual(find_across_lines(lines, sub, 4), -1)
163 self.assertEqual(find_across_lines(lines, sub, 0, 4), -1)
164 self.assertEqual(find_across_lines(lines, sub, 4, 3), -1)
165 sub = "Quotes X eld\n\\end_inset\n"
166 self.assertEqual(find_across_lines(lines, sub), -1)
167 sub = "Quotes eld\n\\end_insert\n"
168 self.assertEqual(find_across_lines(lines, sub), -1)
169 # sub without line-break
171 self.assertEqual(find_across_lines(lines, sub), 4)
172 self.assertEqual(find_across_lines(lines, sub, 5), 12)
173 self.assertEqual(find_across_lines(lines, sub, 0, 4), -1)
174 self.assertEqual(find_across_lines(lines, sub, 2, 1), -1)
175 self.assertEqual(find_across_lines(lines, "XXX"), -1)
177 def test_get_value(self):
178 self.assertEqual(get_value(lines, "\\begin_inset"), "Quotes eld")
179 # TODO: do we want this:
180 self.assertEqual(get_value(lines, "\\begin_inset Quotes"), "Quotes eld")
181 # or only the part after "token":
182 # self.assertEqual(get_value(lines, "\\begin_inset Quotes"), "eld")
183 # return default if not found
184 self.assertEqual(get_value(lines, "\\begin_insert", default=42), 42)
185 # TODO: do we want this:
186 self.assertEqual(get_value(lines, "\\end_inset", default=None), None)
187 # or emtpy string if token is found but has no value:
188 # self.assertEqual(get_value(lines, "\\end_inset", default=None), "")
190 def test_get_bool_value(self):
191 self.assertEqual(get_bool_value(header, "\\output_changes"), False)
192 self.assertEqual(get_bool_value(newheader, "\\output_changes"), True)
193 self.assertEqual(get_bool_value(header, "\\html_css_as_file"), False)
194 self.assertEqual(get_bool_value(newheader, "\\html_css_as_file"), True)
195 self.assertEqual(get_bool_value(header, "\\something"), None)
196 self.assertEqual(get_bool_value(header, "\\output_changes", 4), None)
198 def test_set_bool_value(self):
199 # set to new value, return old value
200 self.assertEqual(set_bool_value(header, "\\output_changes", True), False)
201 self.assertEqual(set_bool_value(header, "\\html_css_as_file", True), False)
202 # return default if misspelled:
203 self.assertEqual(set_bool_value(header, "\\html_be_strict", False), None)
204 # catch error and insert new setting:
205 self.assertRaises(ValueError, set_bool_value, header, "\\something", 0)
206 self.assertEqual(header, newheader)
208 def test_del_complete_lines(self):
210 sublines = ["\\begin_inset Quotes eld", "\\end_inset"]
211 # normal operation: remove the first occurence of sublines:
212 self.assertEqual(del_complete_lines(l, sublines), True)
213 self.assertEqual(l[3], "")
214 self.assertEqual(len(l), len(lines) - len(sublines))
217 self.assertEqual(del_complete_lines(l, sublines, 21), False)
218 self.assertEqual(l, lines)
219 # deleting empty sublist returns success but does not change the list:
220 self.assertEqual(del_complete_lines(l, [], 21), True)
221 self.assertEqual(l, lines)
223 def test_del_value(self):
225 self.assertEqual(del_value(l, "\\begin_inset"), "Quotes eld")
226 self.assertEqual(del_value(l, "\\begin_inset Quotes"), "erd")
227 # return default if not found
228 self.assertEqual(del_value(l, "\\begin_insert", default=42), 42)
229 self.assertEqual(del_value(l, "\\end_inset", default=None), "")
232 if __name__ == "__main__":