Loop for unittests. It manages self time directly. If something scheduled to be executed later then on next loop iteration after all ready handlers done generator passed to __init__ is calling. Generator should be like this: def gen(): ... when
| 329 | |
| 330 | |
| 331 | class TestLoop(base_events.BaseEventLoop): |
| 332 | """Loop for unittests. |
| 333 | |
| 334 | It manages self time directly. |
| 335 | If something scheduled to be executed later then |
| 336 | on next loop iteration after all ready handlers done |
| 337 | generator passed to __init__ is calling. |
| 338 | |
| 339 | Generator should be like this: |
| 340 | |
| 341 | def gen(): |
| 342 | ... |
| 343 | when = yield ... |
| 344 | ... = yield time_advance |
| 345 | |
| 346 | Value returned by yield is absolute time of next scheduled handler. |
| 347 | Value passed to yield is time advance to move loop's time forward. |
| 348 | """ |
| 349 | |
| 350 | def __init__(self, gen=None): |
| 351 | super().__init__() |
| 352 | |
| 353 | if gen is None: |
| 354 | def gen(): |
| 355 | yield |
| 356 | self._check_on_close = False |
| 357 | else: |
| 358 | self._check_on_close = True |
| 359 | |
| 360 | self._gen = gen() |
| 361 | next(self._gen) |
| 362 | self._time = 0 |
| 363 | self._clock_resolution = 1e-9 |
| 364 | self._timers = [] |
| 365 | self._selector = TestSelector() |
| 366 | |
| 367 | self.readers = {} |
| 368 | self.writers = {} |
| 369 | self.reset_counters() |
| 370 | |
| 371 | self._transports = weakref.WeakValueDictionary() |
| 372 | |
| 373 | def time(self): |
| 374 | return self._time |
| 375 | |
| 376 | def advance_time(self, advance): |
| 377 | """Move test time forward.""" |
| 378 | if advance: |
| 379 | self._time += advance |
| 380 | |
| 381 | def close(self): |
| 382 | super().close() |
| 383 | if self._check_on_close: |
| 384 | try: |
| 385 | self._gen.send(0) |
| 386 | except StopIteration: |
| 387 | pass |
| 388 | else: # pragma: no cover |
no outgoing calls
no test coverage detected
searching dependent graphs…