public function renderResponded($subject, Cardinality $cardinality)
{
$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;
$minimum = $cardinality->minimum();
$maximum = $cardinality->maximum();
$isNever = null !== $maximum && $maximum < 1;
if ($isCall) {
if ($isNever) {
$expected = 'Expected ' . $renderedSubject . ' call #' . $subject->index() . ' not to respond.';
} else {
$expected = 'Expected ' . $renderedSubject . ' call #' . $subject->index() . ' to respond.';
}
} else {
if ($isNever) {
$expected = 'Expected ' . $renderedSubject . ' not to respond.';
} elseif ($cardinality->isAlways()) {
$expected = 'Expected all ' . $renderedSubject . ' calls to respond.';
} else {
$expected = 'Expected ' . $renderedSubject . ' to respond.';
}
}
$totalCount = count($calls);
$matchCount = 0;
if ($totalCount) {
$renderedCalls = array();
foreach ($calls as $call) {
$responseEvent = $call->responseEvent();
if ($responseEvent) {
++$matchCount;
}
if ($responseEvent 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) {
$returnValue = $responseEvent->value();
$renderedResponse = 'Returned ' . $this->exporter->export($returnValue);
} elseif ($responseEvent instanceof ThrewEvent) {
$exception = $responseEvent->exception();
$renderedResponse = 'Threw ' . $this->exporter->export($exception);
} 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;
}