public function renderThrew($subject, Cardinality $cardinality, $type)
{
$isCall = $subject instanceof Call;
if ($isCall) {
$calls = array($subject);
$renderedCallee = $this->exporter->exportCallable($subject->callback());
} else {
$calls = $subject->allCalls();
$renderedCallee = $this->exporter->exportCallable($subject);
}
$renderedSubject = $this->bold . $renderedCallee . $this->reset;
if ($type instanceof Matcher) {
$renderedType = $type->describe($this->exporter);
} elseif (is_string($type)) {
$renderedType = $type;
} else {
$renderedType = '<any>';
}
$renderedCriteria = 'behave like:' . PHP_EOL . ' ' . $this->fail . ' Threw ' . $renderedType;
$minimum = $cardinality->minimum();
$maximum = $cardinality->maximum();
$isNever = null !== $maximum && $maximum < 1;
if ($isCall) {
if ($isNever) {
$expected = 'Expected ' . $renderedSubject . ' call #' . $subject->index() . ' not to ' . $renderedCriteria;
} else {
$expected = 'Expected ' . $renderedSubject . ' call #' . $subject->index() . ' to ' . $renderedCriteria;
}
} else {
if ($isNever) {
$expected = 'Expected ' . $renderedSubject . ' not to ' . $renderedCriteria;
} elseif ($cardinality->isAlways()) {
$expected = 'Expected all ' . $renderedSubject . ' calls to ' . $renderedCriteria;
} else {
$expected = 'Expected ' . $renderedSubject . ' to ' . $renderedCriteria;
}
}
$totalCount = count($calls);
$matchCount = 0;
if ($totalCount) {
$renderedCalls = array();
foreach ($calls as $call) {
if ($responseEvent = $call->responseEvent()) {
list($exception, $returnValue) = $call->response();
}
if ($responseEvent instanceof ThrewEvent) {
if ($type instanceof Matcher) {
$isMatch = $type->matches($exception);
} elseif (is_string($type)) {
$isMatch = is_a($exception, $type);
} else {
$isMatch = true;
}
} else {
$isMatch = false;
}
if ($isMatch) {
++$matchCount;
}
if ($isMatch xor $isNever) {
$renderedResult = $this->pass;
} else {
$renderedResult = $this->fail;
}
$renderedArguments = array();
foreach ($call->arguments()->all() as $argument) {
$renderedArguments[] = $this->exporter->export($argument, 0);
}
if ($responseEvent instanceof ReturnedEvent) {
$renderedResponse = 'Returned ' . $this->exporter->export($returnValue);
} elseif ($responseEvent instanceof ThrewEvent) {
$renderedException = $this->exporter->export($exception);
if (!$isMatch && $type instanceof EqualToMatcher) {
$renderedException = $this->differenceEngine->difference($renderedType, $renderedException);
}
$renderedResponse = 'Threw ' . $renderedException;
} else {
$renderedResponse = 'Never responded';
}
$renderedCalls[] = $renderedResult . ' Call #' . $call->index() . ' - ' . $renderedCallee . '(' . implode(', ', $renderedArguments) . '):' . PHP_EOL . ' ' . $renderedResult . ' ' . $renderedResponse;
}
$actual = PHP_EOL . implode(PHP_EOL, $renderedCalls);
} else {
$actual = '';
}
if ($isCall) {
$cardinality = '';
} else {
$cardinality = $this->renderCardinality($minimum, $maximum, $matchCount, $totalCount, $totalCount, false);
}
return $this->reset . $expected . $cardinality . $actual;
}