예제 #1
0
 /**
  * Run this test against a particular question.
  * @param question_usage_by_activity $quba the useage to use when running the test.
  * @param qtype_stack_question $question the question to test.
  * @param int $seed the random seed to use.
  * @return stack_question_test_result the test results.
  */
 public function test_question(question_usage_by_activity $quba, qtype_stack_question $question, $seed)
 {
     $slot = $quba->add_question($question, $question->defaultmark);
     $quba->start_question($slot, $seed);
     $response = self::compute_response($question, $this->inputs);
     $quba->process_action($slot, $response);
     $results = new stack_question_test_result($this);
     foreach ($this->inputs as $inputname => $notused) {
         $inputstate = $question->get_input_state($inputname, $response);
         // The _val below is a hack.  Not all inputnames exist explicitly in
         // the response, but the _val does. Some inputs, e.g. matrices have
         // many entries in the response so none match $response[$inputname].
         if (array_key_exists($inputname, $response)) {
             $inputresponse = $response[$inputname];
         } else {
             $inputresponse = $response[$inputname . '_val'];
         }
         $results->set_input_state($inputname, $inputresponse, $inputstate->contentsdisplayed, $inputstate->status, $inputstate->errors);
     }
     foreach ($this->expectedresults as $prtname => $expectedresult) {
         $result = $question->get_prt_result($prtname, $response, false);
         $results->set_prt_result($prtname, $result);
     }
     return $results;
 }
예제 #2
0
 protected function start_attempt_at_question($question, $preferredbehaviour, $maxmark = null, $variant = 1)
 {
     $this->quba->set_preferred_behaviour($preferredbehaviour);
     $this->slot = $this->quba->add_question($question, $maxmark);
     $this->quba->start_question($this->slot, $variant);
 }
예제 #3
0
파일: locallib.php 프로젝트: rwijaya/moodle
/**
 * Start a subsequent new attempt, in each attempt builds on last mode.
 *
 * @param question_usage_by_activity    $quba         this question usage
 * @param object                        $attempt      this attempt
 * @param object                        $lastattempt  last attempt
 * @return object                       modified attempt object
 *
 */
function quiz_start_attempt_built_on_last($quba, $attempt, $lastattempt) {
    $oldquba = question_engine::load_questions_usage_by_activity($lastattempt->uniqueid);

    $oldnumberstonew = array();
    foreach ($oldquba->get_attempt_iterator() as $oldslot => $oldqa) {
        $newslot = $quba->add_question($oldqa->get_question(), $oldqa->get_max_mark());

        $quba->start_question_based_on($newslot, $oldqa);

        $oldnumberstonew[$oldslot] = $newslot;
    }

    // Update attempt layout.
    $newlayout = array();
    foreach (explode(',', $lastattempt->layout) as $oldslot) {
        if ($oldslot != 0) {
            $newlayout[] = $oldnumberstonew[$oldslot];
        } else {
            $newlayout[] = 0;
        }
    }
    $attempt->layout = implode(',', $newlayout);
    return $attempt;
}
 /**
  * add the questions to the question usage
  * This is called by the question_attmept class on construct of a new attempt
  *
  * @param \question_usage_by_activity $quba
  *
  * @return array
  */
 public function add_questions_to_quba(\question_usage_by_activity $quba)
 {
     // we need the questionids of our questions
     $questionids = array();
     foreach ($this->qbankOrderedQuestions as $qbankquestion) {
         /** @var activequiz_question $qbankquestion */
         if (!in_array($qbankquestion->getQuestion()->id, $questionids)) {
             $questionids[] = $qbankquestion->getQuestion()->id;
         }
     }
     $questions = question_load_questions($questionids);
     // loop through the ordered question bank questions and add them to the quba
     // object
     $attemptlayout = array();
     foreach ($this->qbankOrderedQuestions as $qbankquestion) {
         $questionid = $qbankquestion->getQuestion()->id;
         $q = \question_bank::make_question($questions[$questionid]);
         $attemptlayout[$qbankquestion->getId()] = $quba->add_question($q, $qbankquestion->getPoints());
     }
     // start the questions in the quba
     $quba->start_all_questions();
     /**
      * return the attempt layout which is a set of ids that are the slot ids from the question engine usage by activity instance
      * these are what are used during an actual attempt rather than the questionid themselves, since the question engine will handle
      * the translation
      */
     return $attemptlayout;
 }