/** * 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; }
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); }
/** * 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; }