models/classes/runner/navigation/QtiRunnerNavigationPreviousItem.php
public function move(RunnerServiceContext $context, $ref)
    {
        /* @var AssessmentTestSession $session */
        $session = $context->getTestSession();
        $nextPosition = $session->getRoute()->getPosition() - 1;
        
        if ($context->isAdaptive()) {
            $shadowTest = $context->getShadowTest();
            $currentCatItemId = $context->getCurrentCatItemId();
            $search = array_search($currentCatItemId, $shadowTest);
            
            // Consider potential changes in the selected items.
            $context->selectAdaptiveNextItem();
            
            if ($search === 0) {
                QtiRunnerNavigation::checkTimedSectionExit($context, $nextPosition);
                $session->moveBack();
            } else {
                $context->persistCurrentCatItemId($shadowTest[$search - 1]);
            }
        } else {
            QtiRunnerNavigation::checkTimedSectionExit($context, $nextPosition);
            $session->moveBack();
        }
        
        return true;
    }
public function move(RunnerServiceContext $context, $ref)
    {
        /* @var AssessmentTestSession $session */
        $session = $context->getTestSession();
        $nextPosition = $session->getRoute()->getPosition() - 1;
        
        if ($context->isAdaptive()) {
            $shadowTest = $context->getShadowTest();
            $currentCatItemId = $context->getCurrentCatItemId();
            $search = array_search($currentCatItemId, $shadowTest);
            
            // Consider potential changes in the selected items.
            $context->selectAdaptiveNextItem();
            
            if ($search === 0) {
                QtiRunnerNavigation::checkTimedSectionExit($context, $nextPosition);
                $session->moveBack();
            } else {
                $context->persistCurrentCatItemId($shadowTest[$search - 1]);
            }
        } else {
            QtiRunnerNavigation::checkTimedSectionExit($context, $nextPosition);
            $session->moveBack();
        }
        
        return true;
    }
Do the move
@param RunnerServiceContext $context
@param mixed $ref
@return boolean
@throws \common_Exception