1 #! /usr/bin/env python3
4 # Author: David Goodger <goodger@python.org>
5 # Copyright: This module has been placed in the public domain.
8 Test module for the ViewList class from statemachine.py.
11 from pathlib
import Path
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')
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')])
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
)
51 self
.assertEqual(self
.a
[2], self
.a_list
[2])
53 self
.assertEqual(a
, self
.a
)
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:
66 self
.assertEqual(list(self
.c
.xitems()),
67 [('c', 0, 'X'), ('c', 2, 'Z')])
68 # operators with extended behaviour
70 self
.assertEqual(ab
, self
.a_list
+ self
.b_list
)
71 self
.assertEqual(ab
.items
, self
.a
.items
+ self
.b
.items
)
73 self
.assertEqual(aa
, self
.a_list
* 2)
74 self
.assertEqual(aa
.items
, self
.a
.items
* 2)
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
):
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
[:])
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
[:])
99 s_list
= self
.a_list
[2:]
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
111 self
.assertTrue(isinstance(a
, statemachine
.ViewList
))
112 a
.insert(2, 'Q', 'runtime')
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
[:]
121 a_list
.extend(self
.b_list
)
122 a
= statemachine
.ViewList(self
.a
)
123 a
.append('Q', 'runtime')
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
)
134 self
.assertEqual(a
, a_list
)
135 self
.assertEqual(a
.info(len(self
.a
) + 1), ('b', 1))
138 a
= statemachine
.ViewList(self
.a
[:])
142 self
.assertEqual(s
, a
[2:-2])
143 self
.assertEqual(s
.items
, a
[2:-2].items
)
145 self
.assertEqual(s
, a
[2:-2])
146 self
.assertEqual(s
.items
, a
[2:-2].items
)
148 self
.assertEqual(s
, a
[2:-2])
149 self
.assertEqual(s
.items
, a
[2:-2].items
)
152 a
= statemachine
.ViewList(self
.a
[:])
155 self
.assertEqual(a
, self
.a
)
156 self
.assertEqual(s
, a
[2:-1])
158 self
.assertEqual(a
, self
.a
)
159 self
.assertEqual(s
, a
[2:-2])
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
):
174 self
.assertEqual(list(c
.xitems()),
175 [('c', 2, 'Z'), ('c', 1, 'Y'), ('c', 0, 'X')])
181 self
.assertEqual(self
.c
, c
)
184 class StringList(unittest
.TestCase
):
196 indented_string
= """\
202 self
.a_list
= self
.text
.splitlines(True)
203 self
.a
= statemachine
.StringList(self
.a_list
, 'a')
205 def test_trim_left(self
):
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(),
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__':