/**
  * @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;
 }
 /**
  * @param Certification $certification
  *
  * @return bool
  */
 public function process(Certification $certification)
 {
     $this->createForm($certification->getContext(), ['certification' => $certification]);
     return $this->handle('POST');
 }
 /**
  * @param array $data
  *
  * @return Certification
  */
 public static function __set_state(array $data)
 {
     $certification = new Certification();
     $certification->setCategories($data['categories']);
     $certification->setContext($data['context']);
     $certification->setMetrics($data['metrics']);
     return $certification;
 }