Fix [ 3527842 ].
[docutils.git] / test / test_viewlist.py
blobe1014f7f5b6eaa9a7639b3fe17106c115d5ea576
1 #! /usr/bin/env python
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 import unittest
12 import sys
13 import re
14 from DocutilsTestSupport import statemachine
17 class ViewListTests(unittest.TestCase):
19 # python 2.3
20 if not hasattr(unittest.TestCase, "assertTrue"):
21 assertTrue = unittest.TestCase.failUnless
23 a_list = list('abcdefg')
24 b_list = list('AEIOU')
25 c_list = list('XYZ')
27 def setUp(self):
28 self.a = statemachine.ViewList(self.a_list, 'a')
29 self.b = statemachine.ViewList(self.b_list, 'b')
30 self.c = statemachine.ViewList(self.c_list, 'c')
32 def test_xitems(self):
33 self.assertEqual(list(self.b.xitems()),
34 [('b', 0, 'A'), ('b', 1, 'E'),
35 ('b', 2, 'I'), ('b', 3, 'O'), ('b', 4, 'U')])
36 self.assertEqual(list(self.c.xitems()),
37 [('c', 0, 'X'), ('c', 1, 'Y'), ('c', 2, 'Z')])
39 def test_lists(self):
40 # be compatible to standard lists whenever sensible:
41 self.assertEqual(self.a, self.a_list)
42 self.assertEqual(str(self.a), str(self.a_list))
43 self.assertEqual(self.b, self.b_list)
44 self.assertEqual(self.c, self.c_list)
45 self.assertEqual(len(self.a), len(self.a_list))
46 self.assertTrue('d' in self.a) # __contains__
47 self.assertEqual([value for value in self.a], self.a_list)
48 # get and set values
49 self.assertEqual(self.a[2], self.a_list[2])
50 a = self.a[:]
51 self.assertEqual(a, self.a)
52 a[1] = 3
53 self.assertEqual(a[1], 3)
54 # the `items` list contains the metadata (source/offset tuples)
55 self.assertEqual(self.a.items,
56 [('a', i) for (i, v) in enumerate(self.a_list)])
58 def test_special_class_methods(self):
59 # `repr` returns instantiation expression
60 self.assertEqual(repr(self.a), "ViewList(%s, items=%s)" %
61 (repr(self.a_list), repr(self.a.items)))
62 # `del` also deletes meta-data:
63 del(self.c[1])
64 self.assertEqual(list(self.c.xitems()),
65 [('c', 0, 'X'), ('c', 2, 'Z')])
66 # operators with extended behaviour
67 ab = self.a + self.b
68 self.assertEqual(ab, self.a_list + self.b_list)
69 self.assertEqual(ab.items, self.a.items + self.b.items)
70 aa = self.a * 2
71 self.assertEqual(aa, self.a_list * 2)
72 self.assertEqual(aa.items, self.a.items * 2)
73 self.a += self.b
74 self.assertEqual(self.a, self.a_list + self.b_list)
75 # self.assertEqual(self.a.items, self.a.items + self.b.items)
77 def test_get_slice(self):
78 a = self.a[1:-1]
79 a_list = self.a_list[1:-1]
80 self.assertEqual(a, a_list)
81 self.assertEqual(a.items, [('a', i+1) for (i, v) in enumerate(a_list)])
82 self.assertEqual(a.parent, self.a)
83 # a.pprint()
85 def test_set_slice(self):
86 a = statemachine.ViewList(self.a[:])
87 s = a[2:-2]
88 s[2:2] = self.b
89 s_list = self.a_list[2:-2]
90 s_list[2:2] = self.b_list
91 # s.pprint()
92 # s[1:4].pprint()
93 self.assertEqual(s, s_list)
94 self.assertEqual(s, a[2:-2])
95 self.assertEqual(s.items, a[2:-2].items)
97 def test_del_slice(self):
98 a = statemachine.ViewList(self.a[:])
99 s = a[2:]
100 s_list = self.a_list[2:]
101 del s[3:5]
102 del s_list[3:5]
103 self.assertEqual(s, s_list)
104 self.assertEqual(s, a[2:])
105 self.assertEqual(s.items, a[2:].items)
107 def test_insert(self):
108 a_list = self.a_list[:]
109 a_list.insert(2, 'Q')
110 a_list[4:4] = self.b_list
111 a = self.a[:]
112 self.assertTrue(isinstance(a, statemachine.ViewList))
113 a.insert(2, 'Q', 'runtime')
114 a.insert(4, self.b)
115 self.assertEqual(a, a_list)
116 self.assertEqual(a.info(2), ('runtime', 0))
117 self.assertEqual(a.info(5), ('b', 1))
119 def test_append(self):
120 a_list = self.a_list[:]
121 a_list.append('Q')
122 a_list.extend(self.b_list)
123 a = statemachine.ViewList(self.a)
124 a.append('Q', 'runtime')
125 a.append(self.b)
126 # a.pprint()
127 self.assertEqual(a, a_list)
128 self.assertEqual(a.info(len(self.a)), ('runtime', 0))
129 self.assertEqual(a.info(-2), ('b', len(self.b) - 2))
131 def test_extend(self):
132 a_list = self.a_list[:]
133 a_list.extend(self.b_list)
134 a = statemachine.ViewList(self.a)
135 a.extend(self.b)
136 self.assertEqual(a, a_list)
137 self.assertEqual(a.info(len(self.a) + 1), ('b', 1))
138 # a.pprint()
140 def test_view(self):
141 a = statemachine.ViewList(self.a[:])
142 a.insert(4, self.b)
143 s = a[2:-2]
144 s.insert(5, self.c)
145 self.assertEqual(s, a[2:-2])
146 self.assertEqual(s.items, a[2:-2].items)
147 s.pop()
148 self.assertEqual(s, a[2:-2])
149 self.assertEqual(s.items, a[2:-2].items)
150 s.remove('X')
151 self.assertEqual(s, a[2:-2])
152 self.assertEqual(s.items, a[2:-2].items)
154 def test_trim(self):
155 a = statemachine.ViewList(self.a[:])
156 s = a[1:-1]
157 s.trim_start(1)
158 self.assertEqual(a, self.a)
159 self.assertEqual(s, a[2:-1])
160 s.trim_end(1)
161 self.assertEqual(a, self.a)
162 self.assertEqual(s, a[2:-2])
164 def test_info(self):
165 ab = self.a + self.b
166 self.assertEqual(ab.info(0), ('a', 0))
167 self.assertEqual(ab.info(-1), ('b', len(self.b)-1))
168 # report source if index is off the list by one
169 self.assertEqual(ab.info(len(ab)), ('b', None))
170 # `source` and `offset` methods are based on info
171 self.assertEqual(ab.source(-1), 'b')
172 self.assertEqual(ab.offset(-1), len(self.b)-1)
174 def test_reverse(self):
175 c = self.c[:]
176 c.reverse()
177 self.assertEqual(list(c.xitems()),
178 [('c', 2, 'Z'), ('c', 1, 'Y'), ('c', 0, 'X')])
180 def test_sort(self):
181 c = self.c[:]
182 c.reverse()
183 # c.pprint()
184 c.sort()
185 self.assertEqual(self.c, c)
187 # print
188 # print a
189 # print s
190 # print a.items
191 # print s.items
194 class StringList(unittest.TestCase):
196 text = """\
197 This is some
198 example text.
200 Here is some
201 indented text.
203 Unindented text.
206 indented_string = """\
208 literal
209 block"""
212 def setUp(self):
213 self.a_list = self.text.splitlines(1)
214 self.a = statemachine.StringList(self.a_list, 'a')
216 def test_trim_left(self):
217 s = self.a[3:5]
218 s.trim_left(4)
219 self.assertEqual(s, [line.lstrip() for line in self.a_list[3:5]])
221 def test_get_indented(self):
222 self.assertEqual(self.a.get_indented(),
223 ([], 0, 0))
224 block = statemachine.StringList(
225 statemachine.string2lines(self.indented_string))
226 self.assertEqual(block.get_indented(),
227 ([s[6:] for s in block], 6, 1))
230 if __name__ == '__main__':
231 unittest.main()