]> git.lyx.org Git - lyx.git/blob - lib/lyx2lyx/test_parser_tools.py
Move DrawStrategy enum to update_flags.h.
[lyx.git] / lib / lyx2lyx / test_parser_tools.py
1 # This file is part of lyx2lyx
2 # Copyright (C) 2006 José Matos <jamatos@lyx.org>
3 #
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.
8 #
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.
13 #
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
17
18 "This modules tests the functions used to help parse lines."
19
20 import unittest
21
22 from parser_tools import (
23     check_token,
24     del_complete_lines,
25     del_value,
26     find_across_lines,
27     find_complete_lines,
28     find_re,
29     find_substring,
30     find_token,
31     find_tokens,
32     get_bool_value,
33     get_value,
34     is_nonempty_line,
35     re,
36     set_bool_value,
37 )
38
39 lines = r"""
40 \begin_layout Standard
41 The
42 \begin_inset Quotes eld
43 \end_inset
44
45
46 \emph on
47 Introduction
48 \emph default
49
50 \begin_inset Quotes erd
51 \end_inset
52
53  describes several things in addition to LyX's philosophy: most importantly,
54  the format of all of the manuals.
55  If you don't read it, you'll have a bear of a time navigating this manual.
56  You might also be better served looking in one of the other manuals instead
57  of this one.
58
59 \begin_inset Quotes eld
60 \end_inset
61
62
63 \emph on
64 Introduction
65 \emph default
66
67 \begin_inset Quotes erd
68 \end_inset
69
70  describes that, too.
71 \end_layout
72
73 """.splitlines()
74
75 header = r"""\begin_header
76 \origin unavailable
77 \paperpagestyle default
78 \output_changes false
79 \html_math_output 0
80 \html_css_as_file 0
81 \html_be_strict fallse
82 \end_header""".splitlines()
83
84 newheader = r"""\begin_header
85 \origin unavailable
86 \paperpagestyle default
87 \output_changes true
88 \html_math_output 0
89 \html_css_as_file 1
90 \html_be_strict false
91 \end_header""".splitlines()
92
93
94 class TestParserTools(unittest.TestCase):
95     def test_check_token(self):
96         line = "\\begin_layout Standard"
97
98         self.assertEqual(check_token(line, "\\begin_layout"), True)
99         self.assertEqual(check_token(line, "Standard"), False)
100
101     def test_is_nonempty_line(self):
102         self.assertEqual(is_nonempty_line(lines[0]), False)
103         self.assertEqual(is_nonempty_line(lines[1]), True)
104         self.assertEqual(is_nonempty_line(" " * 5), False)
105
106     def test_find_token(self):
107         self.assertEqual(find_token(lines, "\\emph", 0), 7)
108         # no line starts with "emph" (without backspace):
109         self.assertEqual(find_token(lines, "emph", 0), -1)
110         # token on line[start] is found:
111         self.assertEqual(find_token(lines, "\\emph", 7), 7)
112         self.assertEqual(find_token(lines, "\\emph", 8), 9)
113         # token on line[end] is not found:
114         self.assertEqual(find_token(lines, "\\emph", 0, 7), -1)
115         # `ignorews` looks for whitespace-separated tokens:
116         self.assertEqual(find_token(lines, "\\emp", 0, ignorews=True), -1)
117         self.assertEqual(find_token(lines, "\\emph", 0, ignorews=True), 7)
118         self.assertEqual(find_token(lines, "\\emph", 7, ignorews=True), 7)
119         self.assertEqual(find_token(lines, "\\emph", 0, 7, True), -1)
120         # only first token is found:
121         self.assertEqual(find_token(lines, "Quotes", 0), -1)
122         self.assertEqual(find_token(lines, "Quotes", 0, ignorews=True), -1)
123
124     def test_find_tokens(self):
125         tokens = ["\\emph", "\\end_inset"]
126         self.assertEqual(find_tokens(lines, tokens, 0), 4)
127         self.assertEqual(find_tokens(lines, tokens, 0, 4), -1)
128
129     def test_find_substring(self):
130         # Quotes is not a "token" (substring at the start of any line):
131         self.assertEqual(find_token(lines, "Quotes", 0), -1)
132         self.assertEqual(find_substring(lines, "Quotes", 0), 3)
133         # return -1 on failure:
134         self.assertEqual(find_substring(lines, "Qualen", 0), -1)
135
136     def test_find_re(self):
137         regexp_object = re.compile(r"\\begin.*Quote")
138         # matching starts with line[start] (default: start=0)
139         self.assertEqual(find_re(lines, regexp_object), 3)
140         self.assertEqual(find_re(lines, regexp_object, start=3), 3)
141         # matching ends one line *before* line[end]:
142         self.assertEqual(find_re(lines, regexp_object, start=4), 11)
143         self.assertEqual(find_re(lines, regexp_object, start=4, end=11), -1)
144
145     def test_find_complete_lines(self):
146         sublines = ["\\begin_inset Quotes eld", "\\end_inset"]
147         # return index of first line of sublines:
148         self.assertEqual(find_complete_lines(lines, sublines), 3)
149         self.assertEqual(find_complete_lines(lines, ["\\end_inset"]), 4)
150         # return -1 if sublines is not found:
151         self.assertEqual(find_complete_lines(lines, ["x"]), -1)
152         # search includes line `start`:
153         self.assertEqual(find_complete_lines(lines, sublines, 3), 3)
154         self.assertEqual(find_complete_lines(lines, sublines, 4), 20)
155         self.assertEqual(find_complete_lines(lines, sublines, 21), -1)
156         # serch excludes line `end`
157         self.assertEqual(find_complete_lines(lines, sublines, 4, 20), -1)
158         # an empty list is always found
159         self.assertEqual(find_complete_lines(lines, []), 0)
160
161     def test_find_across_lines(self):
162         # sub with at least 2 line-breaks (uses find_complete_lines):
163         sub = "Quotes eld\n\\end_inset\n\n\n"
164         self.assertEqual(find_across_lines(lines, sub), 3)
165         # Return -1 if not found
166         self.assertEqual(find_across_lines(lines, sub, 4), -1)
167         self.assertEqual(find_across_lines(lines, sub, 0, 6), -1)
168         sub = "Quotes eld\n\\end_inset\nx\n"
169         self.assertEqual(find_across_lines(lines, sub), -1)
170         sub = "Quotes X\n\\end_inset\n\n"
171         self.assertEqual(find_across_lines(lines, sub), -1)
172         sub = "Quotes eld\n\\end_insert\n\n"
173         self.assertEqual(find_across_lines(lines, sub), -1)
174         # sub with up to 1 line-break:
175         sub = "Quotes eld\n\\end_inset"
176         self.assertEqual(find_across_lines(lines, sub), 3)
177         self.assertEqual(find_across_lines(lines, sub, 4), -1)
178         self.assertEqual(find_across_lines(lines, sub, 0, 4), -1)
179         self.assertEqual(find_across_lines(lines, sub, 4, 3), -1)
180         sub = "Quotes X eld\n\\end_inset\n"
181         self.assertEqual(find_across_lines(lines, sub), -1)
182         sub = "Quotes eld\n\\end_insert\n"
183         self.assertEqual(find_across_lines(lines, sub), -1)
184         # sub without line-break
185         sub = "end_"
186         self.assertEqual(find_across_lines(lines, sub), 4)
187         self.assertEqual(find_across_lines(lines, sub, 5), 12)
188         self.assertEqual(find_across_lines(lines, sub, 0, 4), -1)
189         self.assertEqual(find_across_lines(lines, sub, 2, 1), -1)
190         self.assertEqual(find_across_lines(lines, "XXX"), -1)
191
192     def test_get_value(self):
193         self.assertEqual(get_value(lines, "\\begin_inset"), "Quotes eld")
194         # TODO: do we want this:
195         self.assertEqual(get_value(lines, "\\begin_inset Quotes"), "Quotes eld")
196         # or only the part after "token":
197         #  self.assertEqual(get_value(lines, "\\begin_inset Quotes"), "eld")
198         # return default if not found
199         self.assertEqual(get_value(lines, "\\begin_insert", default=42), 42)
200         # TODO: do we want this:
201         self.assertEqual(get_value(lines, "\\end_inset", default=None), None)
202         # or emtpy string if token is found but has no value:
203         #  self.assertEqual(get_value(lines, "\\end_inset", default=None), "")
204
205     def test_get_bool_value(self):
206         self.assertEqual(get_bool_value(header, "\\output_changes"), False)
207         self.assertEqual(get_bool_value(newheader, "\\output_changes"), True)
208         self.assertEqual(get_bool_value(header, "\\html_css_as_file"), False)
209         self.assertEqual(get_bool_value(newheader, "\\html_css_as_file"), True)
210         self.assertEqual(get_bool_value(header, "\\something"), None)
211         self.assertEqual(get_bool_value(header, "\\output_changes", 4), None)
212
213     def test_set_bool_value(self):
214         # set to new value, return old value
215         self.assertEqual(set_bool_value(header, "\\output_changes", True), False)
216         self.assertEqual(set_bool_value(header, "\\html_css_as_file", True), False)
217         # return default if misspelled:
218         self.assertEqual(set_bool_value(header, "\\html_be_strict", False), None)
219         # catch error and insert new setting:
220         self.assertRaises(ValueError, set_bool_value, header, "\\something", 0)
221         self.assertEqual(header, newheader)
222
223     def test_del_complete_lines(self):
224         l = lines[:]
225         sublines = ["\\begin_inset Quotes eld", "\\end_inset"]
226         # normal operation: remove the first occurence of sublines:
227         self.assertEqual(del_complete_lines(l, sublines), True)
228         self.assertEqual(l[3], "")
229         self.assertEqual(len(l), len(lines) - len(sublines))
230         # special cases:
231         l = lines[:]
232         self.assertEqual(del_complete_lines(l, sublines, 21), False)
233         self.assertEqual(l, lines)
234         # deleting empty sublist returns success but does not change the list:
235         self.assertEqual(del_complete_lines(l, [], 21), True)
236         self.assertEqual(l, lines)
237
238     def test_del_value(self):
239         l = lines[:]
240         self.assertEqual(del_value(l, "\\begin_inset"), "Quotes eld")
241         self.assertEqual(del_value(l, "\\begin_inset Quotes"), "erd")
242         # return default if not found
243         self.assertEqual(del_value(l, "\\begin_insert", default=42), 42)
244         self.assertEqual(del_value(l, "\\end_inset", default=None), "")
245
246
247 if __name__ == "__main__":
248     unittest.main()