1 # This file is part of lyx2lyx
2 # -*- coding: utf-8 -*-
3 # Copyright (C) 2006 José Matos <jamatos@lyx.org>
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.
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.
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
19 " This modules tests the functions used to help parse lines."
21 from parser_tools import *
26 \begin_layout Standard
28 \begin_inset Quotes eld
36 \begin_inset Quotes erd
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
45 \begin_inset Quotes eld
53 \begin_inset Quotes erd
61 lines = ug.splitlines()
63 class TestParserTools(unittest.TestCase):
65 def test_check_token(self):
66 line = "\\begin_layout Standard"
68 self.assertEqual(check_token(line, '\\begin_layout'), True)
69 self.assertEqual(check_token(line, 'Standard'), False)
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)
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)
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)
103 def test_find_complete_lines(self):
104 sublines = ["\\begin_inset Quotes eld",
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)
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
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)
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), "")
167 def test_del_complete_lines(self):
169 sublines = ["\\begin_inset Quotes eld",
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))
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)
183 def test_del_value(self):
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), "")
192 if __name__ == '__main__':