private function verifyArgs(int $invocation, array $expected): bool
    {
        $received = $this->invocations->argumentsOf($invocation);
        if (count($received) < count($expected)) {
            throw new ArgumentMismatch(sprintf(
                    'Argument count for invocation #%d of %s is too'
                    . ' low: received %d argument(s), expected %d argument(s).',
                    $invocation,
                    $this->invocations->name(),
                    count($received),
                    count($expected)
            ));
        }

        foreach ($expected as $atPosition => $constraint) {
            $this->evaluate(
                    $constraint,
                    $received[$atPosition] ?? null,
                    sprintf(
                            'Parameter %sat position %d for invocation #%d of %s'
                            . ' does not match expected value.',
                            $this->invocations->argumentName($atPosition, ' '),
                            $atPosition,
                            $invocation,
                            $this->invocations->name()
                    )
            );
        }

        return true;
    }