Lines 75.00% 6 / 8
Functions and Methods 50.00% 1 / 2
Classes and Traits 0.00% 0 / 1
Name Lines Functions and Methods CRAP Classes and Traits
EventLoopTicks 75.00% 6 / 8 50.00% 1 / 2 6.56 0.00% 0 / 1
 settle 0.00% 0 / 2 0.00% 0 / 1 6
 settleUntil 100.00% 6 / 6 100.00% 1 / 1 4
1<?php
2
3declare(strict_types=1);
4
5namespace Stewart\Testing\Time;
6
7use Closure;
8use PHPUnit\Framework\AssertionFailedError;
9
10use function Amp\delay;
11
12final class EventLoopTicks
13{
14    private const int DEFAULT_TICK_LIMIT = 50;
15
16    public static function settle(int $ticks = 2): void
17    {
18        for ($tick = 0; $tick < $ticks; ++$tick) {
19            delay(0);
20        }
21    }
22
23    /** @param Closure(): bool $condition */
24    public static function settleUntil(Closure $condition, int $maxTicks = self::DEFAULT_TICK_LIMIT): void
25    {
26        for ($tick = 0; $tick < $maxTicks; ++$tick) {
27            if ($condition()) {
28                return;
29            }
30
31            delay(0);
32        }
33
34        if (!$condition()) {
35            throw new AssertionFailedError(\sprintf('The condition still fails after %d event loop ticks.', $maxTicks));
36        }
37    }
38}