private function runEngines()
{
$this->callObservers(self::beforeSetUp);
$this->setUp();
$this->callObservers(self::afterSetUp);
while ($this->runEngine()->engines) {
$engines = $this->engines;
foreach ($engines as $this->currentMethod => $engine) {
$score = $engine->getScore();
if ($score !== null) {
unset($this->engines[$this->currentMethod]);
$this->callObservers(self::afterTestMethod)->score->merge($score);
$runtimeExceptions = $score->getRuntimeExceptions();
if (sizeof($runtimeExceptions) > 0) {
$this->callObservers(self::runtimeException);
throw reset($runtimeExceptions);
} else {
switch (true) {
case $score->getVoidMethodNumber():
$signal = self::void;
break;
case $score->getUncompletedMethodNumber():
$signal = self::uncompleted;
break;
case $score->getSkippedMethodNumber():
$signal = self::skipped;
break;
case $score->getFailNumber():
$signal = self::fail;
break;
case $score->getErrorNumber():
$signal = self::error;
break;
case $score->getExceptionNumber():
$signal = self::exception;
break;
default:
$signal = self::success;
}
$this->callObservers($signal);
}
if ($engine->isAsynchronous() === true) {
$this->asynchronousEngines--;
}
}
}
$this->currentMethod = null;
}
return $this->doTearDown();
}