Mask trailing whitespace in test sample.
[docutils.git] / docutils / test / test_viewlist.py
blobfaa0bd098caea970f6a6258ab49e815ba2cf0ca1
1 #! /usr/bin/env python3
3 # $Id$
4 # Author: David Goodger <goodger@python.org>
5 # Copyright: This module has been placed in the public domain.
7 """
8 Test module for the ViewList class from statemachine.py.
9 """
11 from pathlib import Path
12 import sys
13 import unittest
15 if __name__ == '__main__':
16 # prepend the "docutils root" to the Python library path
17 # so we import the local `docutils` package.
18 sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
20 from docutils import statemachine
23 class ViewListTests(unittest.TestCase):
25 a_list = list('abcdefg')
26 b_list = list('AEIOU')
27 c_list = list('XYZ')
29 def setUp(self):
30 self.a = statemachine.ViewList(self.a_list, 'a')
31 self.b = statemachine.ViewList(self.b_list, 'b')
32 self.c = statemachine.ViewList(self.c_list, 'c')
34 def test_xitems(self):
35 self.assertEqual(list(self.b.xitems()),
36 [('b', 0, 'A'), ('b', 1, 'E'),
37 ('b', 2, 'I'), ('b', 3, 'O'), ('b', 4, 'U')])
38 self.assertEqual(list(self.c.xitems()),
39 [('c', 0, 'X'), ('c', 1, 'Y'), ('c', 2, 'Z')])
41 def test_lists(self):
42 # be compatible to standard lists whenever sensible:
43 self.assertEqual(self.a, self.a_list)
44 self.assertEqual(str(self.a), str(self.a_list))
45 self.assertEqual(self.b, self.b_list)
46 self.assertEqual(self.c, self.c_list)
47 self.assertEqual(len(self.a), len(self.a_list))
48 self.assertTrue('d' in self.a) # __contains__
49 self.assertEqual([value for value in self.a], self.a_list)
50 # get and set values
51 self.assertEqual(self.a[2], self.a_list[2])
52 a = self.a[:]
53 self.assertEqual(a, self.a)
54 a[1] = 3
55 self.assertEqual(a[1], 3)
56 # the `items` list contains the metadata (source/offset tuples)
57 self.assertEqual(self.a.items,
58 [('a', i) for (i, v) in enumerate(self.a_list)])
60 def test_special_class_methods(self):
61 # `repr` returns instantiation expression
62 self.assertEqual(repr(self.a), "ViewList(%s, items=%s)" %
63 (repr(self.a_list), repr(self.a.items)))
64 # `del` also deletes meta-data:
65 del self.c[1]
66 self.assertEqual(list(self.c.xitems()),
67 [('c', 0, 'X'), ('c', 2, 'Z')])
68 # operators with extended behaviour
69 ab = self.a + self.b
70 self.assertEqual(ab, self.a_list + self.b_list)
71 self.assertEqual(ab.items, self.a.items + self.b.items)
72 aa = self.a * 2
73 self.assertEqual(aa, self.a_list * 2)
74 self.assertEqual(aa.items, self.a.items * 2)
75 self.a += self.b
76 self.assertEqual(self.a, self.a_list + self.b_list)
77 # self.assertEqual(self.a.items, self.a.items + self.b.items)
79 def test_get_slice(self):
80 a = self.a[1:-1]
81 a_list = self.a_list[1:-1]
82 self.assertEqual(a, a_list)
83 self.assertEqual(a.items, [('a', i+1) for (i, v) in enumerate(a_list)])
84 self.assertEqual(a.parent, self.a)
86 def test_set_slice(self):
87 a = statemachine.ViewList(self.a[:])
88 s = a[2:-2]
89 s[2:2] = self.b
90 s_list = self.a_list[2:-2]
91 s_list[2:2] = self.b_list
92 self.assertEqual(s, s_list)
93 self.assertEqual(s, a[2:-2])
94 self.assertEqual(s.items, a[2:-2].items)
96 def test_del_slice(self):
97 a = statemachine.ViewList(self.a[:])
98 s = a[2:]
99 s_list = self.a_list[2:]
100 del s[3:5]
101 del s_list[3:5]
102 self.assertEqual(s, s_list)
103 self.assertEqual(s, a[2:])
104 self.assertEqual(s.items, a[2:].items)
106 def test_insert(self):
107 a_list = self.a_list[:]
108 a_list.insert(2, 'Q')
109 a_list[4:4] = self.b_list
110 a = self.a[:]
111 self.assertTrue(isinstance(a, statemachine.ViewList))
112 a.insert(2, 'Q', 'runtime')
113 a.insert(4, self.b)
114 self.assertEqual(a, a_list)
115 self.assertEqual(a.info(2), ('runtime', 0))
116 self.assertEqual(a.info(5), ('b', 1))
118 def test_append(self):
119 a_list = self.a_list[:]
120 a_list.append('Q')
121 a_list.extend(self.b_list)
122 a = statemachine.ViewList(self.a)
123 a.append('Q', 'runtime')
124 a.append(self.b)
125 self.assertEqual(a, a_list)
126 self.assertEqual(a.info(len(self.a)), ('runtime', 0))
127 self.assertEqual(a.info(-2), ('b', len(self.b) - 2))
129 def test_extend(self):
130 a_list = self.a_list[:]
131 a_list.extend(self.b_list)
132 a = statemachine.ViewList(self.a)
133 a.extend(self.b)
134 self.assertEqual(a, a_list)
135 self.assertEqual(a.info(len(self.a) + 1), ('b', 1))
137 def test_view(self):
138 a = statemachine.ViewList(self.a[:])
139 a.insert(4, self.b)
140 s = a[2:-2]
141 s.insert(5, self.c)
142 self.assertEqual(s, a[2:-2])
143 self.assertEqual(s.items, a[2:-2].items)
144 s.pop()
145 self.assertEqual(s, a[2:-2])
146 self.assertEqual(s.items, a[2:-2].items)
147 s.remove('X')
148 self.assertEqual(s, a[2:-2])
149 self.assertEqual(s.items, a[2:-2].items)
151 def test_trim(self):
152 a = statemachine.ViewList(self.a[:])
153 s = a[1:-1]
154 s.trim_start(1)
155 self.assertEqual(a, self.a)
156 self.assertEqual(s, a[2:-1])
157 s.trim_end(1)
158 self.assertEqual(a, self.a)
159 self.assertEqual(s, a[2:-2])
161 def test_info(self):
162 ab = self.a + self.b
163 self.assertEqual(ab.info(0), ('a', 0))
164 self.assertEqual(ab.info(-1), ('b', len(self.b)-1))
165 # report source if index is off the list by one
166 self.assertEqual(ab.info(len(ab)), ('b', None))
167 # `source` and `offset` methods are based on info
168 self.assertEqual(ab.source(-1), 'b')
169 self.assertEqual(ab.offset(-1), len(self.b)-1)
171 def test_reverse(self):
172 c = self.c[:]
173 c.reverse()
174 self.assertEqual(list(c.xitems()),
175 [('c', 2, 'Z'), ('c', 1, 'Y'), ('c', 0, 'X')])
177 def test_sort(self):
178 c = self.c[:]
179 c.reverse()
180 c.sort()
181 self.assertEqual(self.c, c)
184 class StringList(unittest.TestCase):
186 text = """\
187 This is some
188 example text.
190 Here is some
191 indented text.
193 Unindented text.
196 indented_string = """\
198 literal
199 block"""
201 def setUp(self):
202 self.a_list = self.text.splitlines(True)
203 self.a = statemachine.StringList(self.a_list, 'a')
205 def test_trim_left(self):
206 s = self.a[3:5]
207 s.trim_left(4)
208 self.assertEqual(s, [line.lstrip() for line in self.a_list[3:5]])
210 def test_get_indented(self):
211 self.assertEqual(self.a.get_indented(),
212 ([], 0, 0))
213 block = statemachine.StringList(
214 statemachine.string2lines(self.indented_string))
215 self.assertEqual(block.get_indented(),
216 ([s[6:] for s in block], 6, 1))
219 if __name__ == '__main__':
220 unittest.main()