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.
14 from DocutilsTestSupport
import statemachine
17 class ViewListTests(unittest
.TestCase
):
20 if not hasattr(unittest
.TestCase
, "assertTrue"):
21 assertTrue
= unittest
.TestCase
.failUnless
23 a_list
= list('abcdefg')
24 b_list
= list('AEIOU')
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')])
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
)
49 self
.assertEqual(self
.a
[2], self
.a_list
[2])
51 self
.assertEqual(a
, self
.a
)
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:
64 self
.assertEqual(list(self
.c
.xitems()),
65 [('c', 0, 'X'), ('c', 2, 'Z')])
66 # operators with extended behaviour
68 self
.assertEqual(ab
, self
.a_list
+ self
.b_list
)
69 self
.assertEqual(ab
.items
, self
.a
.items
+ self
.b
.items
)
71 self
.assertEqual(aa
, self
.a_list
* 2)
72 self
.assertEqual(aa
.items
, self
.a
.items
* 2)
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
):
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
)
85 def test_set_slice(self
):
86 a
= statemachine
.ViewList(self
.a
[:])
89 s_list
= self
.a_list
[2:-2]
90 s_list
[2:2] = self
.b_list
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
[:])
100 s_list
= self
.a_list
[2:]
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
112 self
.assertTrue(isinstance(a
, statemachine
.ViewList
))
113 a
.insert(2, 'Q', 'runtime')
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
[:]
122 a_list
.extend(self
.b_list
)
123 a
= statemachine
.ViewList(self
.a
)
124 a
.append('Q', 'runtime')
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
)
136 self
.assertEqual(a
, a_list
)
137 self
.assertEqual(a
.info(len(self
.a
) + 1), ('b', 1))
141 a
= statemachine
.ViewList(self
.a
[:])
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
)
151 self
.assertEqual(s
, a
[2:-2])
152 self
.assertEqual(s
.items
, a
[2:-2].items
)
155 a
= statemachine
.ViewList(self
.a
[:])
158 self
.assertEqual(a
, self
.a
)
159 self
.assertEqual(s
, a
[2:-1])
161 self
.assertEqual(a
, self
.a
)
162 self
.assertEqual(s
, a
[2:-2])
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
):
177 self
.assertEqual(list(c
.xitems()),
178 [('c', 2, 'Z'), ('c', 1, 'Y'), ('c', 0, 'X')])
185 self
.assertEqual(self
.c
, c
)
194 class StringList(unittest
.TestCase
):
206 indented_string
= """\
213 self
.a_list
= self
.text
.splitlines(1)
214 self
.a
= statemachine
.StringList(self
.a_list
, 'a')
216 def test_trim_left(self
):
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(),
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__':