/**
  * Checks if an item has been completed
  * @param Jump $jump
  * @return bool
  */
 private static function isItemCompleted(Jump $jump)
 {
     $itemSession = $jump->getItemSession();
     $routeItem = $jump->getTarget();
     $completed = false;
     if ($routeItem->getTestPart()->getNavigationMode() === NavigationMode::LINEAR) {
         // In linear mode, we consider the item completed if it was presented.
         if ($itemSession->isPresented() === true) {
             $completed = true;
         }
     } else {
         // In nonlinear mode we consider:
         // - an adaptive item completed if it's completion status is 'completed'.
         // - a non-adaptive item to be completed if it is responded.
         $isAdaptive = $itemSession->getAssessmentItem()->isAdaptive();
         if ($isAdaptive === true && $itemSession['completionStatus']->getValue() === AssessmentItemSession::COMPLETION_STATUS_COMPLETED) {
             $completed = true;
         } else {
             if ($isAdaptive === false && $itemSession->isResponded() === true) {
                 $completed = true;
             }
         }
     }
     return $completed;
 }
 /**
  * Gets infos about a particular item
  * @param AssessmentTestSession $session
  * @param Jump $jump
  * @return array
  */
 private static function getItemInfo(AssessmentTestSession $session, Jump $jump)
 {
     $itemSession = $jump->getItemSession();
     $routeItem = $jump->getTarget();
     return array('remainingAttempts' => $itemSession->getRemainingAttempts(), 'answered' => self::isItemCompleted($routeItem, $itemSession), 'viewed' => $itemSession->isPresented(), 'flagged' => self::getItemFlag($session, $jump), 'position' => $jump->getPosition());
 }