public function checkThrew($type = null)
{
$cardinality = $this->resetCardinality();
if ($this->subject instanceof Call) {
$cardinality->assertSingular();
}
$matchingEvents = array();
$matchCount = 0;
$isTypeSupported = false;
if (!$type) {
$isTypeSupported = true;
foreach ($this->calls as $call) {
if (!$call->isGenerator() || !($endEvent = $call->endEvent())) {
continue;
}
list($exception) = $call->generatorResponse();
if ($exception) {
$matchingEvents[] = $endEvent;
++$matchCount;
}
}
} elseif (is_string($type)) {
$isTypeSupported = true;
foreach ($this->calls as $call) {
if (!$call->isGenerator() || !($endEvent = $call->endEvent())) {
continue;
}
list($exception) = $call->generatorResponse();
if ($exception && is_a($exception, $type)) {
$matchingEvents[] = $endEvent;
++$matchCount;
}
}
} elseif (is_object($type)) {
if ($type instanceof Throwable || $type instanceof Exception) {
$isTypeSupported = true;
$type = $this->matcherFactory->equalTo($type, true);
} elseif ($this->matcherFactory->isMatcher($type)) {
$isTypeSupported = true;
$type = $this->matcherFactory->adapt($type);
}
if ($isTypeSupported) {
foreach ($this->calls as $call) {
if (!$call->isGenerator() || !($endEvent = $call->endEvent())) {
continue;
}
list($exception) = $call->generatorResponse();
if ($exception && $type->matches($exception)) {
$matchingEvents[] = $endEvent;
++$matchCount;
}
}
}
}
if (!$isTypeSupported) {
throw new InvalidArgumentException(sprintf('Unable to match exceptions against %s.', $this->assertionRenderer->renderValue($type)));
}
if ($cardinality->matches($matchCount, $this->callCount)) {
return $this->assertionRecorder->createSuccess($matchingEvents);
}
}