]> git.lyx.org Git - lyx.git/blob - lib/lyx2lyx/test_parser_tools.py
New lyx2lyx tools.
[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 ug = 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 """
60
61 lines = ug.splitlines()
62
63 class TestParserTools(unittest.TestCase):
64
65     def test_check_token(self):
66         line = "\\begin_layout Standard"
67
68         self.assertEqual(check_token(line, '\\begin_layout'), True)
69         self.assertEqual(check_token(line, 'Standard'), False)
70
71
72     def test_is_nonempty_line(self):
73         self.assertEqual(is_nonempty_line(lines[0]), False)
74         self.assertEqual(is_nonempty_line(lines[1]), True)
75         self.assertEqual(is_nonempty_line(" "*5), False)
76
77
78     def test_find_token(self):
79         self.assertEqual(find_token(lines, '\\emph', 0), 7)
80         # no line starts with "emph" (without backspace):
81         self.assertEqual(find_token(lines, 'emph', 0), -1)
82         # token on line[start] is found:
83         self.assertEqual(find_token(lines, '\\emph', 7), 7)
84         self.assertEqual(find_token(lines, '\\emph', 8), 9)
85         # token on line[end] is not found:
86         self.assertEqual(find_token(lines, '\\emph', 0, 7), -1)
87         # `ignorews` looks for whitespace-separated tokens:
88         self.assertEqual(find_token(lines, '\\emp', 0, ignorews=True), -1)
89         self.assertEqual(find_token(lines, '\\emph',0, ignorews=True), 7)
90         self.assertEqual(find_token(lines, '\\emph', 7, ignorews=True), 7)
91         self.assertEqual(find_token(lines, '\\emph', 0, 7, True), -1)
92         # only first token is found:
93         self.assertEqual(find_token(lines, 'Quotes', 0), -1)
94         self.assertEqual(find_token(lines, 'Quotes', 0, ignorews=True), -1)
95
96
97     def test_find_tokens(self):
98         tokens = ['\\emph', '\\end_inset']
99         self.assertEqual(find_tokens(lines, tokens, 0), 4)
100         self.assertEqual(find_tokens(lines, tokens, 0, 4), -1)
101
102
103     def test_find_complete_lines(self):
104         sublines = ["\\begin_inset Quotes eld",
105                     "\\end_inset"]
106         # return index of first line of sublines:
107         self.assertEqual(find_complete_lines(lines, sublines), 3)
108         self.assertEqual(find_complete_lines(lines, ["\\end_inset"]), 4)
109         # return -1 if sublines is not found:
110         self.assertEqual(find_complete_lines(lines, ['x']), -1)
111         # search includes line `start`:
112         self.assertEqual(find_complete_lines(lines, sublines, 3), 3)
113         self.assertEqual(find_complete_lines(lines, sublines, 4), 20)
114         self.assertEqual(find_complete_lines(lines, sublines, 21), -1)
115         # serch excludes line `end`
116         self.assertEqual(find_complete_lines(lines, sublines, 4, 20), -1)
117         # an empty list is always found
118         self.assertEqual(find_complete_lines(lines, []), 0)
119
120
121     def test_find_across_lines(self):
122         # sub with at least 2 line-breaks (uses find_complete_lines):
123         sub = "Quotes eld\n\\end_inset\n\n\n"
124         self.assertEqual(find_across_lines(lines, sub), 3)
125         # Return -1 if not found
126         self.assertEqual(find_across_lines(lines, sub, 4), -1)
127         self.assertEqual(find_across_lines(lines, sub, 0, 6), -1)
128         sub = "Quotes eld\n\\end_inset\nx\n"
129         self.assertEqual(find_across_lines(lines, sub), -1)
130         sub = "Quotes X\n\\end_inset\n\n"
131         self.assertEqual(find_across_lines(lines, sub), -1)
132         sub = "Quotes eld\n\\end_insert\n\n"
133         self.assertEqual(find_across_lines(lines, sub), -1)
134         # sub with up to 1 line-break:
135         sub = "Quotes eld\n\\end_inset"
136         self.assertEqual(find_across_lines(lines, sub), 3)
137         self.assertEqual(find_across_lines(lines, sub, 4), -1)
138         self.assertEqual(find_across_lines(lines, sub, 0, 4), -1)
139         self.assertEqual(find_across_lines(lines, sub, 4, 3), -1)
140         sub = "Quotes X eld\n\\end_inset\n"
141         self.assertEqual(find_across_lines(lines, sub), -1)
142         sub = "Quotes eld\n\\end_insert\n"
143         self.assertEqual(find_across_lines(lines, sub), -1)
144         # sub without line-break
145         sub = "end_"
146         self.assertEqual(find_across_lines(lines, sub), 4)
147         self.assertEqual(find_across_lines(lines, sub, 5), 12)
148         self.assertEqual(find_across_lines(lines, sub, 0, 4), -1)
149         self.assertEqual(find_across_lines(lines, sub, 2, 1), -1)
150         self.assertEqual(find_across_lines(lines, "XXX"), -1)
151
152
153     def test_get_value(self):
154         self.assertEqual(get_value(lines, "\\begin_inset"), "Quotes eld")
155         # TODO: do we want this:
156         self.assertEqual(get_value(lines, "\\begin_inset Quotes"), "Quotes eld")
157         # or only the part after "token":
158         #  self.assertEqual(get_value(lines, "\\begin_inset Quotes"), "eld")
159         # return default if not found
160         self.assertEqual(get_value(lines, "\\begin_insert", default=42), 42)
161         # TODO: do we want this:
162         self.assertEqual(get_value(lines, "\\end_inset", default=None), None)
163         # or emtpy string if token is found but has no value:
164         #  self.assertEqual(get_value(lines, "\\end_inset", default=None), "")
165
166
167     def test_del_complete_lines(self):
168         l = lines[:]
169         sublines = ["\\begin_inset Quotes eld",
170                     "\\end_inset"]
171         # normal operation: remove the first occurence of sublines:
172         self.assertEqual(del_complete_lines(l, sublines), True)
173         self.assertEqual(l[3], "")
174         self.assertEqual(len(l), len(lines)-len(sublines))
175         # special cases:
176         l = lines[:]
177         self.assertEqual(del_complete_lines(l, sublines, 21), False)
178         self.assertEqual(l, lines)
179         # deleting empty sublist returns success but does not change the list:
180         self.assertEqual(del_complete_lines(l, [], 21), True)
181         self.assertEqual(l, lines)
182
183     def test_del_value(self):
184         l = lines[:]
185         self.assertEqual(del_value(l, "\\begin_inset"), "Quotes eld")
186         self.assertEqual(del_value(l, "\\begin_inset Quotes"), "erd")
187         # return default if not found
188         self.assertEqual(del_value(l, "\\begin_insert", default=42), 42)
189         self.assertEqual(del_value(l, "\\end_inset", default=None), "")
190
191
192 if __name__ == '__main__':
193     unittest.main()