|
20 | 20 | to_bin_sha, |
21 | 21 | NULL_HEX_SHA, |
22 | 22 | LockedFD, |
23 | | - Actor |
| 23 | + Actor, |
| 24 | + IterableList |
24 | 25 | ) |
25 | 26 |
|
26 | 27 |
|
| 28 | +class TestIterableMember(object): |
| 29 | + """A member of an iterable list""" |
| 30 | + __slots__ = ("name", "prefix_name") |
| 31 | + |
| 32 | + def __init__(self, name): |
| 33 | + self.name = name |
| 34 | + self.prefix_name = name |
| 35 | + |
| 36 | + |
27 | 37 | class TestUtils(TestBase): |
28 | 38 | def setup(self): |
29 | 39 | self.testdict = { |
@@ -203,6 +213,53 @@ def test_lockedfd(self): |
203 | 213 | self.fail("expected OSError") |
204 | 214 | # END handle exceptions |
205 | 215 |
|
| 216 | + def test_iterable_list(self): |
| 217 | + for args in (('name',), ('name', 'prefix_')): |
| 218 | + l = IterableList('name') |
| 219 | + |
| 220 | + m1 = TestIterableMember('one') |
| 221 | + m2 = TestIterableMember('two') |
| 222 | + |
| 223 | + l.extend((m1, m2)) |
| 224 | + |
| 225 | + assert len(l) == 2 |
| 226 | + |
| 227 | + # contains works with name and identity |
| 228 | + assert m1.name in l |
| 229 | + assert m2.name in l |
| 230 | + assert m2 in l |
| 231 | + assert m2 in l |
| 232 | + assert 'invalid' not in l |
| 233 | + |
| 234 | + # with string index |
| 235 | + assert l[m1.name] is m1 |
| 236 | + assert l[m2.name] is m2 |
| 237 | + |
| 238 | + # with int index |
| 239 | + assert l[0] is m1 |
| 240 | + assert l[1] is m2 |
| 241 | + |
| 242 | + # with getattr |
| 243 | + assert l.one is m1 |
| 244 | + assert l.two is m2 |
| 245 | + |
| 246 | + # test exceptions |
| 247 | + self.failUnlessRaises(AttributeError, getattr, l, 'something') |
| 248 | + self.failUnlessRaises(IndexError, l.__getitem__, 'something') |
| 249 | + |
| 250 | + # delete by name and index |
| 251 | + self.failUnlessRaises(IndexError, l.__delitem__, 'something') |
| 252 | + del(l[m2.name]) |
| 253 | + assert len(l) == 1 |
| 254 | + assert m2.name not in l and m1.name in l |
| 255 | + del(l[0]) |
| 256 | + assert m1.name not in l |
| 257 | + assert len(l) == 0 |
| 258 | + |
| 259 | + self.failUnlessRaises(IndexError, l.__delitem__, 0) |
| 260 | + self.failUnlessRaises(IndexError, l.__delitem__, 'something') |
| 261 | + #END for each possible mode |
| 262 | + |
206 | 263 |
|
207 | 264 | class TestActor(TestBase): |
208 | 265 | def test_from_string_should_separate_name_and_email(self): |
|
0 commit comments