|
5 | 5 |
|
6 | 6 | import contextlib |
7 | 7 | import errno |
8 | | -from datetime import datetime |
9 | 8 | import os |
10 | 9 | import pathlib |
11 | 10 | import pickle |
12 | 11 | import stat |
13 | 12 | import sys |
14 | 13 | import threading |
15 | 14 | import time |
| 15 | +from datetime import datetime |
16 | 16 | from unittest import SkipTest, mock |
17 | 17 |
|
18 | 18 | import ddt |
|
43 | 43 | rmtree, |
44 | 44 | ) |
45 | 45 | from test.cleanup import cleanup_directory |
46 | | -from test.lib.fixtures import writable_fixture |
47 | 46 | from test.lib import TestBase, requires_symlinks, with_rw_repo |
| 47 | +from test.lib.fixtures import writable_fixture |
48 | 48 |
|
49 | 49 |
|
50 | 50 | @pytest.mark.parametrize( |
@@ -312,6 +312,45 @@ def test_altz_to_utctz_str_accepts_float_seconds(offset, expected): |
312 | 312 | assert utctz_to_altz(result) == utctz_to_altz(expected) |
313 | 313 |
|
314 | 314 |
|
| 315 | +@pytest.mark.parametrize("prefix", ["", "refs/"]) |
| 316 | +@pytest.mark.parametrize("position", [0, -1]) |
| 317 | +def test_iterable_list_accepts_index_protocol(prefix, position): |
| 318 | + class Index: |
| 319 | + def __index__(self): |
| 320 | + return position |
| 321 | + |
| 322 | + values = IterableList("name", prefix) |
| 323 | + members = [_Member(prefix + name) for name in ("one", "two")] |
| 324 | + values.extend(members) |
| 325 | + assert values[Index()] is members[position] |
| 326 | + |
| 327 | + |
| 328 | +@pytest.mark.parametrize("position", [2, -3]) |
| 329 | +def test_iterable_list_index_protocol_preserves_bounds_errors(position): |
| 330 | + class Index: |
| 331 | + def __index__(self): |
| 332 | + return position |
| 333 | + |
| 334 | + values = IterableList("name") |
| 335 | + values.extend([_Member("one"), _Member("two")]) |
| 336 | + with pytest.raises(IndexError): |
| 337 | + values[Index()] |
| 338 | + |
| 339 | + |
| 340 | +def test_iterable_list_index_protocol_preserves_named_lookup_and_slice_rejection(): |
| 341 | + values = IterableList("name", "refs/") |
| 342 | + named = _Member("refs/0") |
| 343 | + values.extend([named, _Member("refs/one")]) |
| 344 | + assert values["0"] is named |
| 345 | + assert values[False] is named |
| 346 | + with pytest.raises(IndexError): |
| 347 | + values["missing"] |
| 348 | + with pytest.raises(ValueError): |
| 349 | + values[:1] |
| 350 | + with pytest.raises(TypeError): |
| 351 | + values[0.0] |
| 352 | + |
| 353 | + |
315 | 354 | @ddt.ddt |
316 | 355 | class TestUtils(TestBase): |
317 | 356 | """Tests for most utilities in :mod:`git.util`.""" |
|
0 commit comments