Eloquent\Phony\Assertion\AssertionRenderer::renderCompleted PHP Method

renderCompleted() public method

Render a failed completed() verification.
public renderCompleted ( Eloquent\Phony\Spy\Spy | Eloquent\Phony\Call\Call $subject, Cardinality $cardinality ) : string
$subject Eloquent\Phony\Spy\Spy | Eloquent\Phony\Call\Call The subject.
$cardinality Eloquent\Phony\Verification\Cardinality The cardinality.
return string The rendered failure message.
    public function renderCompleted($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 complete.';
            } else {
                $expected = 'Expected ' . $renderedSubject . ' call #' . $subject->index() . ' to complete.';
            }
        } else {
            if ($isNever) {
                $expected = 'Expected ' . $renderedSubject . ' not to complete.';
            } elseif ($cardinality->isAlways()) {
                $expected = 'Expected all ' . $renderedSubject . ' calls to complete.';
            } else {
                $expected = 'Expected ' . $renderedSubject . ' to complete.';
            }
        }
        $totalCount = count($calls);
        $matchCount = 0;
        if ($totalCount) {
            $renderedCalls = array();
            foreach ($calls as $call) {
                $endEvent = $call->endEvent();
                if ($endEvent) {
                    ++$matchCount;
                }
                if ($endEvent xor $isNever) {
                    $renderedResult = $this->pass;
                } else {
                    $renderedResult = $this->fail;
                }
                $renderedArguments = array();
                foreach ($call->arguments()->all() as $argument) {
                    $renderedArguments[] = $this->exporter->export($argument, 0);
                }
                $responseEvent = $call->responseEvent();
                if ($responseEvent instanceof ReturnedEvent) {
                    $returnValue = $responseEvent->value();
                    if (is_array($returnValue) || $returnValue instanceof Traversable) {
                        $iterableEvents = $call->iterableEvents();
                        $renderedIterableEvents = array();
                        foreach ($iterableEvents as $event) {
                            if ($event instanceof UsedEvent) {
                                $renderedIterableEvents[] = '        - Started iterating';
                            } elseif ($event instanceof ProducedEvent) {
                                $iterableKey = $event->key();
                                $iterableValue = $event->value();
                                $renderedIterableEvents[] = '        - Produced ' . $this->exporter->export($iterableKey) . ' => ' . $this->exporter->export($iterableValue);
                            } elseif ($event instanceof ReceivedEvent) {
                                $iterableValue = $event->value();
                                $renderedIterableEvents[] = '        - Received ' . $this->exporter->export($iterableValue);
                            } elseif ($event instanceof ReceivedExceptionEvent) {
                                $iterableException = $event->exception();
                                $renderedIterableEvents[] = '        - Received exception ' . $this->exporter->export($iterableException);
                            }
                        }
                        if (empty($iterableEvents)) {
                            $renderedIterableEvents[] = '        ' . $renderedResult . ' Never started iterating';
                        } elseif ($endEvent instanceof ConsumedEvent) {
                            $renderedIterableEvents[] = '        ' . $renderedResult . ' Finished iterating';
                        } elseif ($endEvent instanceof ReturnedEvent) {
                            $eventValue = $endEvent->value();
                            $renderedIterableEvents[] = '        ' . $renderedResult . ' Returned ' . $this->exporter->export($eventValue);
                        } elseif ($endEvent instanceof ThrewEvent) {
                            $eventException = $endEvent->exception();
                            $renderedIterableEvents[] = '        ' . $renderedResult . ' Threw ' . $this->exporter->export($eventException);
                        } else {
                            $renderedIterableEvents[] = '        ' . $renderedResult . ' Never finished iterating';
                        }
                        $renderedResponse = 'Returned ' . $this->exporter->export($returnValue, 0) . ', then:' . PHP_EOL . implode(PHP_EOL, $renderedIterableEvents);
                    } else {
                        $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;
    }