public static createGeneratorSpy ( Eloquent\Phony\Call\Call $call, Generator $generator, |
||
$call | Eloquent\Phony\Call\Call | The call from which the generator originated. |
$generator | Generator | The generator. |
$callEventFactory | The call event factory to use. | |
return | Generator | The newly created generator spy. |
public static function createGeneratorSpy(Call $call, Generator $generator, CallEventFactory $callEventFactory)
{
$call->addIterableEvent($callEventFactory->createUsed());
$isFirst = true;
$received = null;
$receivedException = null;
while (true) {
$thrown = null;
try {
if (!$isFirst) {
if ($receivedException) {
$generator->throw($receivedException);
} else {
$generator->send($received);
}
}
if (!$generator->valid()) {
$returnValue = $generator->getReturn();
$call->setEndEvent($callEventFactory->createReturned($returnValue));
return $returnValue;
}
} catch (Throwable $thrown) {
// re-thrown after recording
// @codeCoverageIgnoreStart
} catch (Exception $thrown) {
// re-thrown after recording
}
// @codeCoverageIgnoreEnd
if ($thrown) {
$call->setEndEvent($callEventFactory->createThrew($thrown));
throw $thrown;
}
$key = $generator->key();
$value = $generator->current();
$received = null;
$receivedException = null;
$call->addIterableEvent($callEventFactory->createProduced($key, $value));
try {
$received = (yield $key => $value);
$call->addIterableEvent($callEventFactory->createReceived($received));
} catch (Exception $receivedException) {
$call->addIterableEvent($callEventFactory->createReceivedException($receivedException));
}
$isFirst = false;
unset($value);
}
}
/** * Create a new generator spy. * * @param Call $call The call from which the generator originated. * @param Generator $generator The generator. * * @return Generator The newly created generator spy. */ public function create(Call $call, Generator $generator) { if ($this->isHhvm) { // @codeCoverageIgnoreStart if ($this->isGeneratorReturnSupported) { $spy = GeneratorSpyFactoryDetailHhvmWithReturn::createGeneratorSpy($call, $generator, $this->callEventFactory); } else { $spy = GeneratorSpyFactoryDetailHhvm::createGeneratorSpy($call, $generator, $this->callEventFactory, $this->isGeneratorImplicitNextSupported); } // @codeCoverageIgnoreEnd } elseif ($this->isGeneratorReturnSupported) { $spy = GeneratorSpyFactoryDetailPhpWithReturn::createGeneratorSpy($call, $generator, $this->callEventFactory); // @codeCoverageIgnoreStart } else { $spy = GeneratorSpyFactoryDetailPhp::createGeneratorSpy($call, $generator, $this->callEventFactory); } // @codeCoverageIgnoreEnd $spy->_phonySubject = $generator; return $spy; }