/** * @param Certification $certification * * @return Certification */ public function compute(Certification $certification) { $result = $certification->getResult()->getResults(); $score = 0; foreach ($certification->getCategories() as $category) { foreach ($category->getQuestions() as $question) { foreach ($question->getAnswers() as $answer) { if (in_array(self::getHash($category, $question, $answer), $result)) { $answer->setAsAnswered(); } } if ($question->isValid()) { $validEvent = new CertificationComputeEvent($question); $this->eventDispatcher->dispatch(CertificationEvents::CERTIFICATION_VALID_QUESTION, $validEvent); if (true === $validEvent->isSkipped()) { if (null !== $this->logger) { $this->logger->info(sprintf('Question %s skipped', $question->getLabel())); } continue; } $score++; } else { $invalidEvent = new CertificationComputeEvent($question); $this->eventDispatcher->dispatch(CertificationEvents::CERTIFICATION_INVALID_QUESTION, $invalidEvent); } } $certification->getMetrics()->addReportMetrics($category); } $certification->getResult()->setScore($score); return $certification; }