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