From 0500a3a92d93c44ff8095b4f80bcba8ccf312208 Mon Sep 17 00:00:00 2001 From: Tim Hunt Date: Thu, 26 May 2011 19:18:12 +0100 Subject: [PATCH] MDL-27413 qtype_multianswer upgrade should be complete. --- .../db/simpletest/testupgradelibnewqe.php | 2075 +++++++++++++++++ question/type/multianswer/db/upgradelib.php | 19 +- 2 files changed, 2092 insertions(+), 2 deletions(-) diff --git a/question/type/multianswer/db/simpletest/testupgradelibnewqe.php b/question/type/multianswer/db/simpletest/testupgradelibnewqe.php index 2f735c3036f..6d9b54948ba 100644 --- a/question/type/multianswer/db/simpletest/testupgradelibnewqe.php +++ b/question/type/multianswer/db/simpletest/testupgradelibnewqe.php @@ -645,4 +645,2079 @@ class qtype_multianswer_attempt_upgrader_test extends question_attempt_upgrader_ $this->assertEqual($expectedqa, $qa); } + + public function test_multianswer_adaptivenopenalty_qsession105() { + $quiz = (object) array( + 'id' => '5', + 'course' => '2', + 'name' => 'Multianswer quiz', + 'intro' => '', + 'introformat' => '1', + 'timeopen' => '0', + 'timeclose' => '0', + 'attempts' => '0', + 'attemptonlast' => '0', + 'grademethod' => '1', + 'decimalpoints' => '2', + 'questiondecimalpoints' => '-1', + 'review' => '4459503', + 'questionsperpage' => '1', + 'shufflequestions' => '0', + 'shuffleanswers' => '1', + 'questions' => '28,19,0', + 'sumgrades' => '14.00000', + 'grade' => '10.00000', + 'timecreated' => '0', + 'timemodified' => '1306424728', + 'timelimit' => '0', + 'password' => '', + 'subnet' => '', + 'popup' => '0', + 'delay1' => '0', + 'delay2' => '0', + 'showuserpicture' => '0', + 'showblocks' => '0', + 'preferredbehaviour' => 'adaptivenopenalty', + ); + $attempt = (object) array( + 'id' => '16', + 'uniqueid' => '16', + 'quiz' => '5', + 'userid' => '4', + 'attempt' => '1', + 'sumgrades' => '6.00000', + 'timestart' => '1306425691', + 'timefinish' => '1306425746', + 'timemodified' => '1306425746', + 'layout' => '28,19,0', + 'preview' => '0', + 'needsupgradetonewqe' => 1, + ); + $question = (object) array( + 'id' => '19', + 'category' => '2', + 'parent' => '0', + 'name' => 'Cloze', + 'questiontext' => '

This question consists of some text with an answer embedded right here {#1}

+

and right after that you will have to deal with this short answer {#2}

+

and finally we have a floating point number {#3}.

+

The multichoice question can also be shown in the vertical display of the standard moodle multiple choice. {#4}

+

Or in an horizontal display that is included here in a table {#5}

+

A shortanswer question where case must match. Write moodle in upper case letters {#6}

+

Note that addresses like www.moodle.org and smileys :-) all work as normal:

+

a) How good is this? {#7}

+

b) What grade would you give it? {#8}

', + 'questiontextformat' => '1', + 'generalfeedback' => '', + 'generalfeedbackformat' => '1', + 'penalty' => '0.1000000', + 'qtype' => 'multianswer', + 'length' => '1', + 'stamp' => 'tjh238.vledev2.open.ac.uk+110525164438+iwiint', + 'version' => 'tjh238.vledev2.open.ac.uk+110525164441+AAjnIy', + 'hidden' => '0', + 'timecreated' => '1306341878', + 'timemodified' => '1306341879', + 'createdby' => '2', + 'modifiedby' => '2', + 'maxmark' => '13.0000000', + 'options' => (object) array( + 'questions' => array( + 1 => (object) array( + 'id' => '20', + 'category' => '2', + 'parent' => '19', + 'name' => 'Cloze', + 'questiontext' => '{1:MULTICHOICE:Wrong answer#Feedback for this wrong answer~Another wrong answer#Feedback for the other wrong answer~=Correct answer#Feedback for correct answer~%50%Answer that gives half the credit#Feedback for half credit answer}', + 'questiontextformat' => '0', + 'generalfeedback' => '', + 'generalfeedbackformat' => '1', + 'defaultgrade' => '1.0000000', + 'penalty' => '0.0000000', + 'qtype' => 'multichoice', + 'length' => '1', + 'stamp' => 'tjh238.vledev2.open.ac.uk+110525164439+cAuJ4r', + 'version' => 'tjh238.vledev2.open.ac.uk+110525164439+5bnnys', + 'hidden' => '0', + 'timecreated' => '1306341879', + 'timemodified' => '1306341879', + 'createdby' => '2', + 'modifiedby' => '2', + 'options' => (object) array( + 'id' => '3', + 'question' => '20', + 'layout' => '0', + 'answers' => array( + 29 => (object) array( + 'id' => '29', + 'question' => '20', + 'answer' => 'Wrong answer', + 'answerformat' => '1', + 'fraction' => '0.0000000', + 'feedback' => 'Feedback for this wrong answer', + 'feedbackformat' => '1', + ), + 30 => (object) array( + 'id' => '30', + 'question' => '20', + 'answer' => 'Another wrong answer', + 'answerformat' => '1', + 'fraction' => '0.0000000', + 'feedback' => 'Feedback for the other wrong answer', + 'feedbackformat' => '1', + ), + 31 => (object) array( + 'id' => '31', + 'question' => '20', + 'answer' => 'Correct answer', + 'answerformat' => '1', + 'fraction' => '1.0000000', + 'feedback' => 'Feedback for correct answer', + 'feedbackformat' => '1', + ), + 32 => (object) array( + 'id' => '32', + 'question' => '20', + 'answer' => 'Answer that gives half the credit', + 'answerformat' => '1', + 'fraction' => '0.5000000', + 'feedback' => 'Feedback for half credit answer', + 'feedbackformat' => '1', + ), + ), + 'single' => '1', + 'shuffleanswers' => '1', + 'correctfeedback' => '', + 'correctfeedbackformat' => '1', + 'partiallycorrectfeedback' => '', + 'partiallycorrectfeedbackformat' => '1', + 'incorrectfeedback' => '', + 'incorrectfeedbackformat' => '1', + 'answernumbering' => '0', + ), + 'maxgrade' => '1.0000000', + ), + 2 => (object) array( + 'id' => '21', + 'category' => '2', + 'parent' => '19', + 'name' => 'Cloze', + 'questiontext' => '{1:SHORTANSWER:Wrong answer#Feedback for this wrong answer~=Correct answer#Feedback for correct answer~%50%Answer that gives half the credit#Feedback for half credit answer}', + 'questiontextformat' => '0', + 'generalfeedback' => '', + 'generalfeedbackformat' => '1', + 'defaultgrade' => '1.0000000', + 'penalty' => '0.0000000', + 'qtype' => 'shortanswer', + 'length' => '1', + 'stamp' => 'tjh238.vledev2.open.ac.uk+110525164440+EN6wCk', + 'version' => 'tjh238.vledev2.open.ac.uk+110525164440+bQzatI', + 'hidden' => '0', + 'timecreated' => '1306341880', + 'timemodified' => '1306341880', + 'createdby' => '2', + 'modifiedby' => '2', + 'options' => (object) array( + 'answers' => array( + 33 => (object) array( + 'id' => '33', + 'question' => '21', + 'answer' => 'Wrong answer', + 'answerformat' => '0', + 'fraction' => '0.0000000', + 'feedback' => 'Feedback for this wrong answer', + 'feedbackformat' => '1', + ), + 34 => (object) array( + 'id' => '34', + 'question' => '21', + 'answer' => 'Correct answer', + 'answerformat' => '0', + 'fraction' => '1.0000000', + 'feedback' => 'Feedback for correct answer', + 'feedbackformat' => '1', + ), + 35 => (object) array( + 'id' => '35', + 'question' => '21', + 'answer' => 'Answer that gives half the credit', + 'answerformat' => '0', + 'fraction' => '0.5000000', + 'feedback' => 'Feedback for half credit answer', + 'feedbackformat' => '1', + ), + ), + 'usecase' => '0', + ), + 'maxgrade' => '1.0000000', + ), + 3 => (object) array( + 'id' => '22', + 'category' => '2', + 'parent' => '19', + 'name' => 'Cloze', + 'questiontext' => '{2:NUMERICAL:=23.8:0.1#Feedback for correct answer 23.8~%50%23.8:2#Feedback for half credit answer in the nearby region of the correct answer}', + 'questiontextformat' => '0', + 'generalfeedback' => '', + 'generalfeedbackformat' => '1', + 'defaultgrade' => '2.0000000', + 'penalty' => '0.0000000', + 'qtype' => 'numerical', + 'length' => '1', + 'stamp' => 'tjh238.vledev2.open.ac.uk+110525164440+Xr29c2', + 'version' => 'tjh238.vledev2.open.ac.uk+110525164441+QTwsGM', + 'hidden' => '0', + 'timecreated' => '1306341880', + 'timemodified' => '1306341880', + 'createdby' => '2', + 'modifiedby' => '2', + 'options' => (object) array( + 'answers' => array( + 36 => (object) array( + 'id' => '36', + 'question' => '22', + 'answer' => '23.8', + 'answerformat' => '0', + 'fraction' => '1.0000000', + 'feedback' => 'Feedback for correct answer 23.8', + 'feedbackformat' => '1', + 'tolerance' => '0.1', + ), + 37 => (object) array( + 'id' => '37', + 'question' => '22', + 'answer' => '23.8', + 'answerformat' => '0', + 'fraction' => '0.5000000', + 'feedback' => 'Feedback for half credit answer in the nearby region of the correct answer', + 'feedbackformat' => '1', + 'tolerance' => '2', + ), + ), + 'units' => array( + ), + 'unitgradingtype' => '0', + 'unitpenalty' => '1.0000000', + 'showunits' => '3', + 'unitsleft' => '0', + 'instructions' => '', + 'instructionsformat' => '1', + ), + 'maxgrade' => '2.0000000', + ), + 4 => (object) array( + 'id' => '23', + 'category' => '2', + 'parent' => '19', + 'name' => 'Cloze', + 'questiontext' => '{2:MCV:1. Wrong answer#Feedback for this wrong answer~2. Another wrong answer#Feedback for the other wrong answer~=3. Correct answer#Feedback for correct answer~%50%4. Answer that gives half the credit#Feedback for half credit answer}', + 'questiontextformat' => '0', + 'generalfeedback' => '', + 'generalfeedbackformat' => '1', + 'defaultgrade' => '2.0000000', + 'penalty' => '0.0000000', + 'qtype' => 'multichoice', + 'length' => '1', + 'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+7R55HA', + 'version' => 'tjh238.vledev2.open.ac.uk+110525164441+uCMoQc', + 'hidden' => '0', + 'timecreated' => '1306341881', + 'timemodified' => '1306341881', + 'createdby' => '2', + 'modifiedby' => '2', + 'options' => (object) array( + 'id' => '4', + 'question' => '23', + 'layout' => '1', + 'answers' => array( + 38 => (object) array( + 'id' => '38', + 'question' => '23', + 'answer' => '1. Wrong answer', + 'answerformat' => '1', + 'fraction' => '0.0000000', + 'feedback' => 'Feedback for this wrong answer', + 'feedbackformat' => '1', + ), + 39 => (object) array( + 'id' => '39', + 'question' => '23', + 'answer' => '2. Another wrong answer', + 'answerformat' => '1', + 'fraction' => '0.0000000', + 'feedback' => 'Feedback for the other wrong answer', + 'feedbackformat' => '1', + ), + 40 => (object) array( + 'id' => '40', + 'question' => '23', + 'answer' => '3. Correct answer', + 'answerformat' => '1', + 'fraction' => '1.0000000', + 'feedback' => 'Feedback for correct answer', + 'feedbackformat' => '1', + ), + 41 => (object) array( + 'id' => '41', + 'question' => '23', + 'answer' => '4. Answer that gives half the credit', + 'answerformat' => '1', + 'fraction' => '0.5000000', + 'feedback' => 'Feedback for half credit answer', + 'feedbackformat' => '1', + ), + ), + 'single' => '1', + 'shuffleanswers' => '1', + 'correctfeedback' => '', + 'correctfeedbackformat' => '1', + 'partiallycorrectfeedback' => '', + 'partiallycorrectfeedbackformat' => '1', + 'incorrectfeedback' => '', + 'incorrectfeedbackformat' => '1', + 'answernumbering' => '0', + ), + 'maxgrade' => '2.0000000', + ), + 5 => (object) array( + 'id' => '24', + 'category' => '2', + 'parent' => '19', + 'name' => 'Cloze', + 'questiontext' => '{2:MCH:a. Wrong answer#Feedback for this wrong answer~b. Another wrong answer#Feedback for the other wrong answer~=c. Correct answer#Feedback for correct answer~%50%d. Answer that gives half the credit#Feedback for half credit answer}', + 'questiontextformat' => '0', + 'generalfeedback' => '', + 'generalfeedbackformat' => '1', + 'defaultgrade' => '2.0000000', + 'penalty' => '0.0000000', + 'qtype' => 'multichoice', + 'length' => '1', + 'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+QGvRpd', + 'version' => 'tjh238.vledev2.open.ac.uk+110525164441+03GsSs', + 'hidden' => '0', + 'timecreated' => '1306341881', + 'timemodified' => '1306341881', + 'createdby' => '2', + 'modifiedby' => '2', + 'options' => (object) array( + 'id' => '5', + 'question' => '24', + 'layout' => '2', + 'answers' => array( + 42 => (object) array( + 'id' => '42', + 'question' => '24', + 'answer' => 'a. Wrong answer', + 'answerformat' => '1', + 'fraction' => '0.0000000', + 'feedback' => 'Feedback for this wrong answer', + 'feedbackformat' => '1', + ), + 43 => (object) array( + 'id' => '43', + 'question' => '24', + 'answer' => 'b. Another wrong answer', + 'answerformat' => '1', + 'fraction' => '0.0000000', + 'feedback' => 'Feedback for the other wrong answer', + 'feedbackformat' => '1', + ), + 44 => (object) array( + 'id' => '44', + 'question' => '24', + 'answer' => 'c. Correct answer', + 'answerformat' => '1', + 'fraction' => '1.0000000', + 'feedback' => 'Feedback for correct answer', + 'feedbackformat' => '1', + ), + 45 => (object) array( + 'id' => '45', + 'question' => '24', + 'answer' => 'd. Answer that gives half the credit', + 'answerformat' => '1', + 'fraction' => '0.5000000', + 'feedback' => 'Feedback for half credit answer', + 'feedbackformat' => '1', + ), + ), + 'single' => '1', + 'shuffleanswers' => '1', + 'correctfeedback' => '', + 'correctfeedbackformat' => '1', + 'partiallycorrectfeedback' => '', + 'partiallycorrectfeedbackformat' => '1', + 'incorrectfeedback' => '', + 'incorrectfeedbackformat' => '1', + 'answernumbering' => '0', + ), + 'maxgrade' => '2.0000000', + ), + 6 => (object) array( + 'id' => '25', + 'category' => '2', + 'parent' => '19', + 'name' => 'Cloze', + 'questiontext' => '{1:SHORTANSWER_C:moodle#Feedback for moodle in lower case ~=MOODLE#Feedback for MOODLE in upper case ~%50%Moodle#Feedback for only first letter in upper case}', + 'questiontextformat' => '0', + 'generalfeedback' => '', + 'generalfeedbackformat' => '1', + 'defaultgrade' => '1.0000000', + 'penalty' => '0.0000000', + 'qtype' => 'shortanswer', + 'length' => '1', + 'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+n9ETJC', + 'version' => 'tjh238.vledev2.open.ac.uk+110525164441+Bvqo6c', + 'hidden' => '0', + 'timecreated' => '1306341881', + 'timemodified' => '1306341881', + 'createdby' => '2', + 'modifiedby' => '2', + 'options' => (object) array( + 'answers' => array( + 46 => (object) array( + 'id' => '46', + 'question' => '25', + 'answer' => 'moodle', + 'answerformat' => '0', + 'fraction' => '0.0000000', + 'feedback' => 'Feedback for moodle in lower case', + 'feedbackformat' => '1', + ), + 47 => (object) array( + 'id' => '47', + 'question' => '25', + 'answer' => 'MOODLE', + 'answerformat' => '0', + 'fraction' => '1.0000000', + 'feedback' => 'Feedback for MOODLE in upper case', + 'feedbackformat' => '1', + ), + 48 => (object) array( + 'id' => '48', + 'question' => '25', + 'answer' => 'Moodle', + 'answerformat' => '0', + 'fraction' => '0.5000000', + 'feedback' => 'Feedback for only first letter in upper case', + 'feedbackformat' => '1', + ), + ), + 'usecase' => '1', + ), + 'maxgrade' => '1.0000000', + ), + 7 => (object) array( + 'id' => '26', + 'category' => '2', + 'parent' => '19', + 'name' => 'Cloze', + 'questiontext' => '{:MULTICHOICE:=Yes#Correct~No#We have a different opinion}', + 'questiontextformat' => '0', + 'generalfeedback' => '', + 'generalfeedbackformat' => '1', + 'defaultgrade' => '1.0000000', + 'penalty' => '0.0000000', + 'qtype' => 'multichoice', + 'length' => '1', + 'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+0YjnZ7', + 'version' => 'tjh238.vledev2.open.ac.uk+110525164441+1giLRX', + 'hidden' => '0', + 'timecreated' => '1306341881', + 'timemodified' => '1306341881', + 'createdby' => '2', + 'modifiedby' => '2', + 'options' => (object) array( + 'id' => '6', + 'question' => '26', + 'layout' => '0', + 'answers' => array( + 49 => (object) array( + 'id' => '49', + 'question' => '26', + 'answer' => 'Yes', + 'answerformat' => '1', + 'fraction' => '1.0000000', + 'feedback' => 'Correct', + 'feedbackformat' => '1', + ), + 50 => (object) array( + 'id' => '50', + 'question' => '26', + 'answer' => 'No', + 'answerformat' => '1', + 'fraction' => '0.0000000', + 'feedback' => 'We have a different opinion', + 'feedbackformat' => '1', + ), + ), + 'single' => '1', + 'shuffleanswers' => '1', + 'correctfeedback' => '', + 'correctfeedbackformat' => '1', + 'partiallycorrectfeedback' => '', + 'partiallycorrectfeedbackformat' => '1', + 'incorrectfeedback' => '', + 'incorrectfeedbackformat' => '1', + 'answernumbering' => '0', + ), + 'maxgrade' => '1.0000000', + ), + 8 => (object) array( + 'id' => '27', + 'category' => '2', + 'parent' => '19', + 'name' => 'Cloze', + 'questiontext' => '{3:NUMERICAL:=3:2}', + 'questiontextformat' => '0', + 'generalfeedback' => '', + 'generalfeedbackformat' => '1', + 'defaultgrade' => '3.0000000', + 'penalty' => '0.0000000', + 'qtype' => 'numerical', + 'length' => '1', + 'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+glbCBN', + 'version' => 'tjh238.vledev2.open.ac.uk+110525164441+xWusxR', + 'hidden' => '0', + 'timecreated' => '1306341881', + 'timemodified' => '1306341881', + 'createdby' => '2', + 'modifiedby' => '2', + 'options' => (object) array( + 'answers' => array( + 51 => (object) array( + 'id' => '51', + 'question' => '27', + 'answer' => '3', + 'answerformat' => '0', + 'fraction' => '1.0000000', + 'feedback' => '', + 'feedbackformat' => '1', + 'tolerance' => '2', + ), + ), + 'units' => array( + ), + 'unitgradingtype' => '0', + 'unitpenalty' => '1.0000000', + 'showunits' => '3', + 'unitsleft' => '0', + 'instructions' => '', + 'instructionsformat' => '1', + ), + 'maxgrade' => '3.0000000', + ), + ), + ), + 'defaultmark' => '13.0000000', + ); + $qsession = (object) array( + 'id' => '105', + 'attemptid' => '16', + 'questionid' => '19', + 'newest' => '286', + 'newgraded' => '286', + 'sumpenalty' => '2.6000000', + 'manualcomment' => '', + 'manualcommentformat' => '1', + 'flagged' => '0', + ); + $qstates = array( + 282 => (object) array( + 'id' => '282', + 'attempt' => '16', + 'question' => '19', + 'seq_number' => '0', + 'answer' => '1-,2-,3-,4-,5-,6-,7-,8-', + 'timestamp' => '1306425691', + 'event' => '0', + 'grade' => '0.0000000', + 'raw_grade' => '0.0000000', + 'penalty' => '0.0000000', + ), + 284 => (object) array( + 'id' => '284', + 'attempt' => '16', + 'question' => '19', + 'seq_number' => '1', + 'answer' => '1-31,2-dsf,3-sadf,4-39,5-44,6-MOODLE,7-49,8-100%', + 'timestamp' => '1306425739', + 'event' => '3', + 'grade' => '5.0000000', + 'raw_grade' => '5.0000000', + 'penalty' => '1.3000000', + ), + 286 => (object) array( + 'id' => '286', + 'attempt' => '16', + 'question' => '19', + 'seq_number' => '2', + 'answer' => '1-31,2-dsf,3-sadf,4-39,5-44,6-MOODLE,7-49,8-100%', + 'timestamp' => '1306425739', + 'event' => '6', + 'grade' => '5.0000000', + 'raw_grade' => '5.0000000', + 'penalty' => '1.3000000', + ), + ); + + $qa = $this->updater->convert_question_attempt($quiz, $attempt, $question, $qsession, $qstates); + + $expectedqa = (object) array( + 'behaviour' => 'adaptivenopenalty', + 'questionid' => 19, + 'maxmark' => 13.0000000, + 'minfraction' => 0, + 'flagged' => 0, + 'questionsummary' => 'This question consists of some text with an answer embedded right here {Wrong answer; Another wrong answer; Correct answer; Answer that gives half the credit} + +and right after that you will have to deal with this short answer _____ + +and finally we have a floating point number _____. + +The multichoice question can also be shown in the vertical display of the standard moodle multiple choice. {1. Wrong answer; 2. Another wrong answer; 3. Correct answer; 4. Answer that gives half the credit} + +Or in an horizontal display that is included here in a table {a. Wrong answer; b. Another wrong answer; c. Correct answer; d. Answer that gives half the credit} + +A shortanswer question where case must match. Write moodle in upper case letters _____ + +Note that addresses like www.moodle.org and smileys :-) all work as normal: + +a) How good is this? {Yes; No} + +b) What grade would you give it? _____', + 'rightanswer' => 'part 1: Correct answer; part 2: Correct answer; part 3: 23.8; part 4: 3. Correct answer; part 5: c. Correct answer; part 6: MOODLE; part 7: Yes; part 8: 3', + 'responsesummary' => 'part 1: Correct answer; part 2: dsf; part 3: sadf; part 4: 2. Another wrong answer; part 5: c. Correct answer; part 6: MOODLE; part 7: Yes; part 8: 100%', + 'timemodified' => 1306425739, + 'steps' => array( + 0 => (object) array( + 'sequencenumber' => 0, + 'state' => 'todo', + 'fraction' => null, + 'timecreated' => 1306425691, + 'userid' => 4, + 'data' => array('-_try' => '1', '_sub1_order' => '29,30,31,32', + '_sub3_separators' => '.$,', '_sub4_order' => '38,39,40,41', + '_sub5_order' => '42,43,44,45', '_sub7_order' => '49,50', + '_sub8_separators' => '.$,'), + ), + 1 => (object) array( + 'sequencenumber' => 1, + 'state' => 'todo', + 'fraction' => 0.38461538461538466, + 'timecreated' => 1306425739, + 'userid' => 4, + 'data' => array('sub1_answer' => '2', 'sub2_answer' => 'dsf', + 'sub3_answer' => 'sadf', 'sub4_answer' => '1', + 'sub5_answer' => '2', 'sub6_answer' => 'MOODLE', + 'sub7_answer' => 'sadf', 'sub8_answer' => '100%', '-_try' => '2', + '-_rawfraction' => '0.38461538461538466', '-submit' => '1'), + ), + 2 => (object) array( + 'sequencenumber' => 2, + 'state' => 'gradedpartial', + 'fraction' => 0.38461538461538466, + 'timecreated' => 1306425739, + 'userid' => 4, + 'data' => array('sub1_answer' => '2', 'sub2_answer' => 'dsf', + 'sub3_answer' => 'sadf', 'sub4_answer' => '1', + 'sub5_answer' => '2', 'sub6_answer' => 'MOODLE', + 'sub7_answer' => 'sadf', 'sub8_answer' => '100%', '-_try' => '2', + '-_rawfraction' => '0.38461538461538466', '-finish' => '1'), + ), + ), + ); + + $this->assertEqual($expectedqa, $qa); + } + + public function test_multianswer_adaptivenopenalty_qsession107() { + $quiz = (object) array( + 'id' => '5', + 'course' => '2', + 'name' => 'Multianswer quiz', + 'intro' => '', + 'introformat' => '1', + 'timeopen' => '0', + 'timeclose' => '0', + 'attempts' => '0', + 'attemptonlast' => '0', + 'grademethod' => '1', + 'decimalpoints' => '2', + 'questiondecimalpoints' => '-1', + 'review' => '4459503', + 'questionsperpage' => '1', + 'shufflequestions' => '0', + 'shuffleanswers' => '1', + 'questions' => '28,19,0', + 'sumgrades' => '14.00000', + 'grade' => '10.00000', + 'timecreated' => '0', + 'timemodified' => '1306424728', + 'timelimit' => '0', + 'password' => '', + 'subnet' => '', + 'popup' => '0', + 'delay1' => '0', + 'delay2' => '0', + 'showuserpicture' => '0', + 'showblocks' => '0', + 'preferredbehaviour' => 'adaptivenopenalty', + ); + $attempt = (object) array( + 'id' => '17', + 'uniqueid' => '17', + 'quiz' => '5', + 'userid' => '4', + 'attempt' => '2', + 'sumgrades' => '0.00000', + 'timestart' => '1306425757', + 'timefinish' => '1306425762', + 'timemodified' => '1306425762', + 'layout' => '28,19,0', + 'preview' => '0', + 'needsupgradetonewqe' => 1, + ); + $question = (object) array( + 'id' => '19', + 'category' => '2', + 'parent' => '0', + 'name' => 'Cloze', + 'questiontext' => '

This question consists of some text with an answer embedded right here {#1}

+

and right after that you will have to deal with this short answer {#2}

+

and finally we have a floating point number {#3}.

+

The multichoice question can also be shown in the vertical display of the standard moodle multiple choice. {#4}

+

Or in an horizontal display that is included here in a table {#5}

+

A shortanswer question where case must match. Write moodle in upper case letters {#6}

+

Note that addresses like www.moodle.org and smileys :-) all work as normal:

+

a) How good is this? {#7}

+

b) What grade would you give it? {#8}

', + 'questiontextformat' => '1', + 'generalfeedback' => '', + 'generalfeedbackformat' => '1', + 'penalty' => '0.1000000', + 'qtype' => 'multianswer', + 'length' => '1', + 'stamp' => 'tjh238.vledev2.open.ac.uk+110525164438+iwiint', + 'version' => 'tjh238.vledev2.open.ac.uk+110525164441+AAjnIy', + 'hidden' => '0', + 'timecreated' => '1306341878', + 'timemodified' => '1306341879', + 'createdby' => '2', + 'modifiedby' => '2', + 'maxmark' => '13.0000000', + 'options' => (object) array( + 'questions' => array( + 1 => (object) array( + 'id' => '20', + 'category' => '2', + 'parent' => '19', + 'name' => 'Cloze', + 'questiontext' => '{1:MULTICHOICE:Wrong answer#Feedback for this wrong answer~Another wrong answer#Feedback for the other wrong answer~=Correct answer#Feedback for correct answer~%50%Answer that gives half the credit#Feedback for half credit answer}', + 'questiontextformat' => '0', + 'generalfeedback' => '', + 'generalfeedbackformat' => '1', + 'defaultgrade' => '1.0000000', + 'penalty' => '0.0000000', + 'qtype' => 'multichoice', + 'length' => '1', + 'stamp' => 'tjh238.vledev2.open.ac.uk+110525164439+cAuJ4r', + 'version' => 'tjh238.vledev2.open.ac.uk+110525164439+5bnnys', + 'hidden' => '0', + 'timecreated' => '1306341879', + 'timemodified' => '1306341879', + 'createdby' => '2', + 'modifiedby' => '2', + 'options' => (object) array( + 'id' => '3', + 'question' => '20', + 'layout' => '0', + 'answers' => array( + 29 => (object) array( + 'id' => '29', + 'question' => '20', + 'answer' => 'Wrong answer', + 'answerformat' => '1', + 'fraction' => '0.0000000', + 'feedback' => 'Feedback for this wrong answer', + 'feedbackformat' => '1', + ), + 30 => (object) array( + 'id' => '30', + 'question' => '20', + 'answer' => 'Another wrong answer', + 'answerformat' => '1', + 'fraction' => '0.0000000', + 'feedback' => 'Feedback for the other wrong answer', + 'feedbackformat' => '1', + ), + 31 => (object) array( + 'id' => '31', + 'question' => '20', + 'answer' => 'Correct answer', + 'answerformat' => '1', + 'fraction' => '1.0000000', + 'feedback' => 'Feedback for correct answer', + 'feedbackformat' => '1', + ), + 32 => (object) array( + 'id' => '32', + 'question' => '20', + 'answer' => 'Answer that gives half the credit', + 'answerformat' => '1', + 'fraction' => '0.5000000', + 'feedback' => 'Feedback for half credit answer', + 'feedbackformat' => '1', + ), + ), + 'single' => '1', + 'shuffleanswers' => '1', + 'correctfeedback' => '', + 'correctfeedbackformat' => '1', + 'partiallycorrectfeedback' => '', + 'partiallycorrectfeedbackformat' => '1', + 'incorrectfeedback' => '', + 'incorrectfeedbackformat' => '1', + 'answernumbering' => '0', + ), + 'maxgrade' => '1.0000000', + ), + 2 => (object) array( + 'id' => '21', + 'category' => '2', + 'parent' => '19', + 'name' => 'Cloze', + 'questiontext' => '{1:SHORTANSWER:Wrong answer#Feedback for this wrong answer~=Correct answer#Feedback for correct answer~%50%Answer that gives half the credit#Feedback for half credit answer}', + 'questiontextformat' => '0', + 'generalfeedback' => '', + 'generalfeedbackformat' => '1', + 'defaultgrade' => '1.0000000', + 'penalty' => '0.0000000', + 'qtype' => 'shortanswer', + 'length' => '1', + 'stamp' => 'tjh238.vledev2.open.ac.uk+110525164440+EN6wCk', + 'version' => 'tjh238.vledev2.open.ac.uk+110525164440+bQzatI', + 'hidden' => '0', + 'timecreated' => '1306341880', + 'timemodified' => '1306341880', + 'createdby' => '2', + 'modifiedby' => '2', + 'options' => (object) array( + 'answers' => array( + 33 => (object) array( + 'id' => '33', + 'question' => '21', + 'answer' => 'Wrong answer', + 'answerformat' => '0', + 'fraction' => '0.0000000', + 'feedback' => 'Feedback for this wrong answer', + 'feedbackformat' => '1', + ), + 34 => (object) array( + 'id' => '34', + 'question' => '21', + 'answer' => 'Correct answer', + 'answerformat' => '0', + 'fraction' => '1.0000000', + 'feedback' => 'Feedback for correct answer', + 'feedbackformat' => '1', + ), + 35 => (object) array( + 'id' => '35', + 'question' => '21', + 'answer' => 'Answer that gives half the credit', + 'answerformat' => '0', + 'fraction' => '0.5000000', + 'feedback' => 'Feedback for half credit answer', + 'feedbackformat' => '1', + ), + ), + 'usecase' => '0', + ), + 'maxgrade' => '1.0000000', + ), + 3 => (object) array( + 'id' => '22', + 'category' => '2', + 'parent' => '19', + 'name' => 'Cloze', + 'questiontext' => '{2:NUMERICAL:=23.8:0.1#Feedback for correct answer 23.8~%50%23.8:2#Feedback for half credit answer in the nearby region of the correct answer}', + 'questiontextformat' => '0', + 'generalfeedback' => '', + 'generalfeedbackformat' => '1', + 'defaultgrade' => '2.0000000', + 'penalty' => '0.0000000', + 'qtype' => 'numerical', + 'length' => '1', + 'stamp' => 'tjh238.vledev2.open.ac.uk+110525164440+Xr29c2', + 'version' => 'tjh238.vledev2.open.ac.uk+110525164441+QTwsGM', + 'hidden' => '0', + 'timecreated' => '1306341880', + 'timemodified' => '1306341880', + 'createdby' => '2', + 'modifiedby' => '2', + 'options' => (object) array( + 'answers' => array( + 36 => (object) array( + 'id' => '36', + 'question' => '22', + 'answer' => '23.8', + 'answerformat' => '0', + 'fraction' => '1.0000000', + 'feedback' => 'Feedback for correct answer 23.8', + 'feedbackformat' => '1', + 'tolerance' => '0.1', + ), + 37 => (object) array( + 'id' => '37', + 'question' => '22', + 'answer' => '23.8', + 'answerformat' => '0', + 'fraction' => '0.5000000', + 'feedback' => 'Feedback for half credit answer in the nearby region of the correct answer', + 'feedbackformat' => '1', + 'tolerance' => '2', + ), + ), + 'units' => array( + ), + 'unitgradingtype' => '0', + 'unitpenalty' => '1.0000000', + 'showunits' => '3', + 'unitsleft' => '0', + 'instructions' => '', + 'instructionsformat' => '1', + ), + 'maxgrade' => '2.0000000', + ), + 4 => (object) array( + 'id' => '23', + 'category' => '2', + 'parent' => '19', + 'name' => 'Cloze', + 'questiontext' => '{2:MCV:1. Wrong answer#Feedback for this wrong answer~2. Another wrong answer#Feedback for the other wrong answer~=3. Correct answer#Feedback for correct answer~%50%4. Answer that gives half the credit#Feedback for half credit answer}', + 'questiontextformat' => '0', + 'generalfeedback' => '', + 'generalfeedbackformat' => '1', + 'defaultgrade' => '2.0000000', + 'penalty' => '0.0000000', + 'qtype' => 'multichoice', + 'length' => '1', + 'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+7R55HA', + 'version' => 'tjh238.vledev2.open.ac.uk+110525164441+uCMoQc', + 'hidden' => '0', + 'timecreated' => '1306341881', + 'timemodified' => '1306341881', + 'createdby' => '2', + 'modifiedby' => '2', + 'options' => (object) array( + 'id' => '4', + 'question' => '23', + 'layout' => '1', + 'answers' => array( + 38 => (object) array( + 'id' => '38', + 'question' => '23', + 'answer' => '1. Wrong answer', + 'answerformat' => '1', + 'fraction' => '0.0000000', + 'feedback' => 'Feedback for this wrong answer', + 'feedbackformat' => '1', + ), + 39 => (object) array( + 'id' => '39', + 'question' => '23', + 'answer' => '2. Another wrong answer', + 'answerformat' => '1', + 'fraction' => '0.0000000', + 'feedback' => 'Feedback for the other wrong answer', + 'feedbackformat' => '1', + ), + 40 => (object) array( + 'id' => '40', + 'question' => '23', + 'answer' => '3. Correct answer', + 'answerformat' => '1', + 'fraction' => '1.0000000', + 'feedback' => 'Feedback for correct answer', + 'feedbackformat' => '1', + ), + 41 => (object) array( + 'id' => '41', + 'question' => '23', + 'answer' => '4. Answer that gives half the credit', + 'answerformat' => '1', + 'fraction' => '0.5000000', + 'feedback' => 'Feedback for half credit answer', + 'feedbackformat' => '1', + ), + ), + 'single' => '1', + 'shuffleanswers' => '1', + 'correctfeedback' => '', + 'correctfeedbackformat' => '1', + 'partiallycorrectfeedback' => '', + 'partiallycorrectfeedbackformat' => '1', + 'incorrectfeedback' => '', + 'incorrectfeedbackformat' => '1', + 'answernumbering' => '0', + ), + 'maxgrade' => '2.0000000', + ), + 5 => (object) array( + 'id' => '24', + 'category' => '2', + 'parent' => '19', + 'name' => 'Cloze', + 'questiontext' => '{2:MCH:a. Wrong answer#Feedback for this wrong answer~b. Another wrong answer#Feedback for the other wrong answer~=c. Correct answer#Feedback for correct answer~%50%d. Answer that gives half the credit#Feedback for half credit answer}', + 'questiontextformat' => '0', + 'generalfeedback' => '', + 'generalfeedbackformat' => '1', + 'defaultgrade' => '2.0000000', + 'penalty' => '0.0000000', + 'qtype' => 'multichoice', + 'length' => '1', + 'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+QGvRpd', + 'version' => 'tjh238.vledev2.open.ac.uk+110525164441+03GsSs', + 'hidden' => '0', + 'timecreated' => '1306341881', + 'timemodified' => '1306341881', + 'createdby' => '2', + 'modifiedby' => '2', + 'options' => (object) array( + 'id' => '5', + 'question' => '24', + 'layout' => '2', + 'answers' => array( + 42 => (object) array( + 'id' => '42', + 'question' => '24', + 'answer' => 'a. Wrong answer', + 'answerformat' => '1', + 'fraction' => '0.0000000', + 'feedback' => 'Feedback for this wrong answer', + 'feedbackformat' => '1', + ), + 43 => (object) array( + 'id' => '43', + 'question' => '24', + 'answer' => 'b. Another wrong answer', + 'answerformat' => '1', + 'fraction' => '0.0000000', + 'feedback' => 'Feedback for the other wrong answer', + 'feedbackformat' => '1', + ), + 44 => (object) array( + 'id' => '44', + 'question' => '24', + 'answer' => 'c. Correct answer', + 'answerformat' => '1', + 'fraction' => '1.0000000', + 'feedback' => 'Feedback for correct answer', + 'feedbackformat' => '1', + ), + 45 => (object) array( + 'id' => '45', + 'question' => '24', + 'answer' => 'd. Answer that gives half the credit', + 'answerformat' => '1', + 'fraction' => '0.5000000', + 'feedback' => 'Feedback for half credit answer', + 'feedbackformat' => '1', + ), + ), + 'single' => '1', + 'shuffleanswers' => '1', + 'correctfeedback' => '', + 'correctfeedbackformat' => '1', + 'partiallycorrectfeedback' => '', + 'partiallycorrectfeedbackformat' => '1', + 'incorrectfeedback' => '', + 'incorrectfeedbackformat' => '1', + 'answernumbering' => '0', + ), + 'maxgrade' => '2.0000000', + ), + 6 => (object) array( + 'id' => '25', + 'category' => '2', + 'parent' => '19', + 'name' => 'Cloze', + 'questiontext' => '{1:SHORTANSWER_C:moodle#Feedback for moodle in lower case ~=MOODLE#Feedback for MOODLE in upper case ~%50%Moodle#Feedback for only first letter in upper case}', + 'questiontextformat' => '0', + 'generalfeedback' => '', + 'generalfeedbackformat' => '1', + 'defaultgrade' => '1.0000000', + 'penalty' => '0.0000000', + 'qtype' => 'shortanswer', + 'length' => '1', + 'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+n9ETJC', + 'version' => 'tjh238.vledev2.open.ac.uk+110525164441+Bvqo6c', + 'hidden' => '0', + 'timecreated' => '1306341881', + 'timemodified' => '1306341881', + 'createdby' => '2', + 'modifiedby' => '2', + 'options' => (object) array( + 'answers' => array( + 46 => (object) array( + 'id' => '46', + 'question' => '25', + 'answer' => 'moodle', + 'answerformat' => '0', + 'fraction' => '0.0000000', + 'feedback' => 'Feedback for moodle in lower case', + 'feedbackformat' => '1', + ), + 47 => (object) array( + 'id' => '47', + 'question' => '25', + 'answer' => 'MOODLE', + 'answerformat' => '0', + 'fraction' => '1.0000000', + 'feedback' => 'Feedback for MOODLE in upper case', + 'feedbackformat' => '1', + ), + 48 => (object) array( + 'id' => '48', + 'question' => '25', + 'answer' => 'Moodle', + 'answerformat' => '0', + 'fraction' => '0.5000000', + 'feedback' => 'Feedback for only first letter in upper case', + 'feedbackformat' => '1', + ), + ), + 'usecase' => '1', + ), + 'maxgrade' => '1.0000000', + ), + 7 => (object) array( + 'id' => '26', + 'category' => '2', + 'parent' => '19', + 'name' => 'Cloze', + 'questiontext' => '{:MULTICHOICE:=Yes#Correct~No#We have a different opinion}', + 'questiontextformat' => '0', + 'generalfeedback' => '', + 'generalfeedbackformat' => '1', + 'defaultgrade' => '1.0000000', + 'penalty' => '0.0000000', + 'qtype' => 'multichoice', + 'length' => '1', + 'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+0YjnZ7', + 'version' => 'tjh238.vledev2.open.ac.uk+110525164441+1giLRX', + 'hidden' => '0', + 'timecreated' => '1306341881', + 'timemodified' => '1306341881', + 'createdby' => '2', + 'modifiedby' => '2', + 'options' => (object) array( + 'id' => '6', + 'question' => '26', + 'layout' => '0', + 'answers' => array( + 49 => (object) array( + 'id' => '49', + 'question' => '26', + 'answer' => 'Yes', + 'answerformat' => '1', + 'fraction' => '1.0000000', + 'feedback' => 'Correct', + 'feedbackformat' => '1', + ), + 50 => (object) array( + 'id' => '50', + 'question' => '26', + 'answer' => 'No', + 'answerformat' => '1', + 'fraction' => '0.0000000', + 'feedback' => 'We have a different opinion', + 'feedbackformat' => '1', + ), + ), + 'single' => '1', + 'shuffleanswers' => '1', + 'correctfeedback' => '', + 'correctfeedbackformat' => '1', + 'partiallycorrectfeedback' => '', + 'partiallycorrectfeedbackformat' => '1', + 'incorrectfeedback' => '', + 'incorrectfeedbackformat' => '1', + 'answernumbering' => '0', + ), + 'maxgrade' => '1.0000000', + ), + 8 => (object) array( + 'id' => '27', + 'category' => '2', + 'parent' => '19', + 'name' => 'Cloze', + 'questiontext' => '{3:NUMERICAL:=3:2}', + 'questiontextformat' => '0', + 'generalfeedback' => '', + 'generalfeedbackformat' => '1', + 'defaultgrade' => '3.0000000', + 'penalty' => '0.0000000', + 'qtype' => 'numerical', + 'length' => '1', + 'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+glbCBN', + 'version' => 'tjh238.vledev2.open.ac.uk+110525164441+xWusxR', + 'hidden' => '0', + 'timecreated' => '1306341881', + 'timemodified' => '1306341881', + 'createdby' => '2', + 'modifiedby' => '2', + 'options' => (object) array( + 'answers' => array( + 51 => (object) array( + 'id' => '51', + 'question' => '27', + 'answer' => '3', + 'answerformat' => '0', + 'fraction' => '1.0000000', + 'feedback' => '', + 'feedbackformat' => '1', + 'tolerance' => '2', + ), + ), + 'units' => array( + ), + 'unitgradingtype' => '0', + 'unitpenalty' => '1.0000000', + 'showunits' => '3', + 'unitsleft' => '0', + 'instructions' => '', + 'instructionsformat' => '1', + ), + 'maxgrade' => '3.0000000', + ), + ), + ), + 'defaultmark' => '13.0000000', + ); + $qsession = (object) array( + 'id' => '107', + 'attemptid' => '17', + 'questionid' => '19', + 'newest' => '290', + 'newgraded' => '290', + 'sumpenalty' => '1.3000000', + 'manualcomment' => '', + 'manualcommentformat' => '1', + 'flagged' => '0', + ); + $qstates = array( + 288 => (object) array( + 'id' => '288', + 'attempt' => '17', + 'question' => '19', + 'seq_number' => '0', + 'answer' => '1-,2-,3-,4-,5-,6-,7-,8-', + 'timestamp' => '1306425757', + 'event' => '0', + 'grade' => '0.0000000', + 'raw_grade' => '0.0000000', + 'penalty' => '0.0000000', + ), + 290 => (object) array( + 'id' => '290', + 'attempt' => '17', + 'question' => '19', + 'seq_number' => '1', + 'answer' => '1-,2-,3-,4-,5-,6-,7-,8-', + 'timestamp' => '1306425757', + 'event' => '6', + 'grade' => '0.0000000', + 'raw_grade' => '0.0000000', + 'penalty' => '1.3000000', + ), + ); + + $qa = $this->updater->convert_question_attempt($quiz, $attempt, $question, $qsession, $qstates); + + $expectedqa = (object) array( + 'behaviour' => 'adaptivenopenalty', + 'questionid' => 19, + 'maxmark' => 13.0000000, + 'minfraction' => 0, + 'flagged' => 0, + 'questionsummary' => 'This question consists of some text with an answer embedded right here {Wrong answer; Another wrong answer; Correct answer; Answer that gives half the credit} + +and right after that you will have to deal with this short answer _____ + +and finally we have a floating point number _____. + +The multichoice question can also be shown in the vertical display of the standard moodle multiple choice. {1. Wrong answer; 2. Another wrong answer; 3. Correct answer; 4. Answer that gives half the credit} + +Or in an horizontal display that is included here in a table {a. Wrong answer; b. Another wrong answer; c. Correct answer; d. Answer that gives half the credit} + +A shortanswer question where case must match. Write moodle in upper case letters _____ + +Note that addresses like www.moodle.org and smileys :-) all work as normal: + +a) How good is this? {Yes; No} + +b) What grade would you give it? _____', + 'rightanswer' => 'part 1: Correct answer; part 2: Correct answer; part 3: 23.8; part 4: 3. Correct answer; part 5: c. Correct answer; part 6: MOODLE; part 7: Yes; part 8: 3', + 'responsesummary' => 'part 1: ; part 2: ; part 3: ; part 4: ; part 5: ; part 6: ; part 7: ; part 8: ', + 'timemodified' => 1306425757, + 'steps' => array( + 0 => (object) array( + 'sequencenumber' => 0, + 'state' => 'todo', + 'fraction' => null, + 'timecreated' => 1306425757, + 'userid' => 4, + 'data' => array('-_try' => '1', '_sub1_order' => '29,30,31,32', + '_sub3_separators' => '.$,', '_sub4_order' => '38,39,40,41', + '_sub5_order' => '42,43,44,45', '_sub7_order' => '49,50', + '_sub8_separators' => '.$,'), + ), + 1 => (object) array( + 'sequencenumber' => 1, + 'state' => 'gradedwrong', + 'fraction' => 0.0, + 'timecreated' => 1306425757, + 'userid' => 4, + 'data' => array('-finish' => '1', '-_try' => '1', '-_rawfraction' => 0.0), + ), + ), + ); + + $this->assertEqual($expectedqa, $qa); + } + + public function test_multianswer_adaptivenopenalty_qsession109() { + $quiz = (object) array( + 'id' => '5', + 'course' => '2', + 'name' => 'Multianswer quiz', + 'intro' => '', + 'introformat' => '1', + 'timeopen' => '0', + 'timeclose' => '0', + 'attempts' => '0', + 'attemptonlast' => '0', + 'grademethod' => '1', + 'decimalpoints' => '2', + 'questiondecimalpoints' => '-1', + 'review' => '4459503', + 'questionsperpage' => '1', + 'shufflequestions' => '0', + 'shuffleanswers' => '1', + 'questions' => '28,19,0', + 'sumgrades' => '14.00000', + 'grade' => '10.00000', + 'timecreated' => '0', + 'timemodified' => '1306424728', + 'timelimit' => '0', + 'password' => '', + 'subnet' => '', + 'popup' => '0', + 'delay1' => '0', + 'delay2' => '0', + 'showuserpicture' => '0', + 'showblocks' => '0', + 'preferredbehaviour' => 'adaptivenopenalty', + ); + $attempt = (object) array( + 'id' => '18', + 'uniqueid' => '18', + 'quiz' => '5', + 'userid' => '3', + 'attempt' => '1', + 'sumgrades' => '10.40000', + 'timestart' => '1306425784', + 'timefinish' => '1306425931', + 'timemodified' => '1306425931', + 'layout' => '28,19,0', + 'preview' => '0', + 'needsupgradetonewqe' => 1, + ); + $question = (object) array( + 'id' => '19', + 'category' => '2', + 'parent' => '0', + 'name' => 'Cloze', + 'questiontext' => '

This question consists of some text with an answer embedded right here {#1}

+

and right after that you will have to deal with this short answer {#2}

+

and finally we have a floating point number {#3}.

+

The multichoice question can also be shown in the vertical display of the standard moodle multiple choice. {#4}

+

Or in an horizontal display that is included here in a table {#5}

+

A shortanswer question where case must match. Write moodle in upper case letters {#6}

+

Note that addresses like www.moodle.org and smileys :-) all work as normal:

+

a) How good is this? {#7}

+

b) What grade would you give it? {#8}

', + 'questiontextformat' => '1', + 'generalfeedback' => '', + 'generalfeedbackformat' => '1', + 'penalty' => '0.1000000', + 'qtype' => 'multianswer', + 'length' => '1', + 'stamp' => 'tjh238.vledev2.open.ac.uk+110525164438+iwiint', + 'version' => 'tjh238.vledev2.open.ac.uk+110525164441+AAjnIy', + 'hidden' => '0', + 'timecreated' => '1306341878', + 'timemodified' => '1306341879', + 'createdby' => '2', + 'modifiedby' => '2', + 'maxmark' => '13.0000000', + 'options' => (object) array( + 'questions' => array( + 1 => (object) array( + 'id' => '20', + 'category' => '2', + 'parent' => '19', + 'name' => 'Cloze', + 'questiontext' => '{1:MULTICHOICE:Wrong answer#Feedback for this wrong answer~Another wrong answer#Feedback for the other wrong answer~=Correct answer#Feedback for correct answer~%50%Answer that gives half the credit#Feedback for half credit answer}', + 'questiontextformat' => '0', + 'generalfeedback' => '', + 'generalfeedbackformat' => '1', + 'defaultgrade' => '1.0000000', + 'penalty' => '0.0000000', + 'qtype' => 'multichoice', + 'length' => '1', + 'stamp' => 'tjh238.vledev2.open.ac.uk+110525164439+cAuJ4r', + 'version' => 'tjh238.vledev2.open.ac.uk+110525164439+5bnnys', + 'hidden' => '0', + 'timecreated' => '1306341879', + 'timemodified' => '1306341879', + 'createdby' => '2', + 'modifiedby' => '2', + 'options' => (object) array( + 'id' => '3', + 'question' => '20', + 'layout' => '0', + 'answers' => array( + 29 => (object) array( + 'id' => '29', + 'question' => '20', + 'answer' => 'Wrong answer', + 'answerformat' => '1', + 'fraction' => '0.0000000', + 'feedback' => 'Feedback for this wrong answer', + 'feedbackformat' => '1', + ), + 30 => (object) array( + 'id' => '30', + 'question' => '20', + 'answer' => 'Another wrong answer', + 'answerformat' => '1', + 'fraction' => '0.0000000', + 'feedback' => 'Feedback for the other wrong answer', + 'feedbackformat' => '1', + ), + 31 => (object) array( + 'id' => '31', + 'question' => '20', + 'answer' => 'Correct answer', + 'answerformat' => '1', + 'fraction' => '1.0000000', + 'feedback' => 'Feedback for correct answer', + 'feedbackformat' => '1', + ), + 32 => (object) array( + 'id' => '32', + 'question' => '20', + 'answer' => 'Answer that gives half the credit', + 'answerformat' => '1', + 'fraction' => '0.5000000', + 'feedback' => 'Feedback for half credit answer', + 'feedbackformat' => '1', + ), + ), + 'single' => '1', + 'shuffleanswers' => '1', + 'correctfeedback' => '', + 'correctfeedbackformat' => '1', + 'partiallycorrectfeedback' => '', + 'partiallycorrectfeedbackformat' => '1', + 'incorrectfeedback' => '', + 'incorrectfeedbackformat' => '1', + 'answernumbering' => '0', + ), + 'maxgrade' => '1.0000000', + ), + 2 => (object) array( + 'id' => '21', + 'category' => '2', + 'parent' => '19', + 'name' => 'Cloze', + 'questiontext' => '{1:SHORTANSWER:Wrong answer#Feedback for this wrong answer~=Correct answer#Feedback for correct answer~%50%Answer that gives half the credit#Feedback for half credit answer}', + 'questiontextformat' => '0', + 'generalfeedback' => '', + 'generalfeedbackformat' => '1', + 'defaultgrade' => '1.0000000', + 'penalty' => '0.0000000', + 'qtype' => 'shortanswer', + 'length' => '1', + 'stamp' => 'tjh238.vledev2.open.ac.uk+110525164440+EN6wCk', + 'version' => 'tjh238.vledev2.open.ac.uk+110525164440+bQzatI', + 'hidden' => '0', + 'timecreated' => '1306341880', + 'timemodified' => '1306341880', + 'createdby' => '2', + 'modifiedby' => '2', + 'options' => (object) array( + 'answers' => array( + 33 => (object) array( + 'id' => '33', + 'question' => '21', + 'answer' => 'Wrong answer', + 'answerformat' => '0', + 'fraction' => '0.0000000', + 'feedback' => 'Feedback for this wrong answer', + 'feedbackformat' => '1', + ), + 34 => (object) array( + 'id' => '34', + 'question' => '21', + 'answer' => 'Correct answer', + 'answerformat' => '0', + 'fraction' => '1.0000000', + 'feedback' => 'Feedback for correct answer', + 'feedbackformat' => '1', + ), + 35 => (object) array( + 'id' => '35', + 'question' => '21', + 'answer' => 'Answer that gives half the credit', + 'answerformat' => '0', + 'fraction' => '0.5000000', + 'feedback' => 'Feedback for half credit answer', + 'feedbackformat' => '1', + ), + ), + 'usecase' => '0', + ), + 'maxgrade' => '1.0000000', + ), + 3 => (object) array( + 'id' => '22', + 'category' => '2', + 'parent' => '19', + 'name' => 'Cloze', + 'questiontext' => '{2:NUMERICAL:=23.8:0.1#Feedback for correct answer 23.8~%50%23.8:2#Feedback for half credit answer in the nearby region of the correct answer}', + 'questiontextformat' => '0', + 'generalfeedback' => '', + 'generalfeedbackformat' => '1', + 'defaultgrade' => '2.0000000', + 'penalty' => '0.0000000', + 'qtype' => 'numerical', + 'length' => '1', + 'stamp' => 'tjh238.vledev2.open.ac.uk+110525164440+Xr29c2', + 'version' => 'tjh238.vledev2.open.ac.uk+110525164441+QTwsGM', + 'hidden' => '0', + 'timecreated' => '1306341880', + 'timemodified' => '1306341880', + 'createdby' => '2', + 'modifiedby' => '2', + 'options' => (object) array( + 'answers' => array( + 36 => (object) array( + 'id' => '36', + 'question' => '22', + 'answer' => '23.8', + 'answerformat' => '0', + 'fraction' => '1.0000000', + 'feedback' => 'Feedback for correct answer 23.8', + 'feedbackformat' => '1', + 'tolerance' => '0.1', + ), + 37 => (object) array( + 'id' => '37', + 'question' => '22', + 'answer' => '23.8', + 'answerformat' => '0', + 'fraction' => '0.5000000', + 'feedback' => 'Feedback for half credit answer in the nearby region of the correct answer', + 'feedbackformat' => '1', + 'tolerance' => '2', + ), + ), + 'units' => array( + ), + 'unitgradingtype' => '0', + 'unitpenalty' => '1.0000000', + 'showunits' => '3', + 'unitsleft' => '0', + 'instructions' => '', + 'instructionsformat' => '1', + ), + 'maxgrade' => '2.0000000', + ), + 4 => (object) array( + 'id' => '23', + 'category' => '2', + 'parent' => '19', + 'name' => 'Cloze', + 'questiontext' => '{2:MCV:1. Wrong answer#Feedback for this wrong answer~2. Another wrong answer#Feedback for the other wrong answer~=3. Correct answer#Feedback for correct answer~%50%4. Answer that gives half the credit#Feedback for half credit answer}', + 'questiontextformat' => '0', + 'generalfeedback' => '', + 'generalfeedbackformat' => '1', + 'defaultgrade' => '2.0000000', + 'penalty' => '0.0000000', + 'qtype' => 'multichoice', + 'length' => '1', + 'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+7R55HA', + 'version' => 'tjh238.vledev2.open.ac.uk+110525164441+uCMoQc', + 'hidden' => '0', + 'timecreated' => '1306341881', + 'timemodified' => '1306341881', + 'createdby' => '2', + 'modifiedby' => '2', + 'options' => (object) array( + 'id' => '4', + 'question' => '23', + 'layout' => '1', + 'answers' => array( + 38 => (object) array( + 'id' => '38', + 'question' => '23', + 'answer' => '1. Wrong answer', + 'answerformat' => '1', + 'fraction' => '0.0000000', + 'feedback' => 'Feedback for this wrong answer', + 'feedbackformat' => '1', + ), + 39 => (object) array( + 'id' => '39', + 'question' => '23', + 'answer' => '2. Another wrong answer', + 'answerformat' => '1', + 'fraction' => '0.0000000', + 'feedback' => 'Feedback for the other wrong answer', + 'feedbackformat' => '1', + ), + 40 => (object) array( + 'id' => '40', + 'question' => '23', + 'answer' => '3. Correct answer', + 'answerformat' => '1', + 'fraction' => '1.0000000', + 'feedback' => 'Feedback for correct answer', + 'feedbackformat' => '1', + ), + 41 => (object) array( + 'id' => '41', + 'question' => '23', + 'answer' => '4. Answer that gives half the credit', + 'answerformat' => '1', + 'fraction' => '0.5000000', + 'feedback' => 'Feedback for half credit answer', + 'feedbackformat' => '1', + ), + ), + 'single' => '1', + 'shuffleanswers' => '1', + 'correctfeedback' => '', + 'correctfeedbackformat' => '1', + 'partiallycorrectfeedback' => '', + 'partiallycorrectfeedbackformat' => '1', + 'incorrectfeedback' => '', + 'incorrectfeedbackformat' => '1', + 'answernumbering' => '0', + ), + 'maxgrade' => '2.0000000', + ), + 5 => (object) array( + 'id' => '24', + 'category' => '2', + 'parent' => '19', + 'name' => 'Cloze', + 'questiontext' => '{2:MCH:a. Wrong answer#Feedback for this wrong answer~b. Another wrong answer#Feedback for the other wrong answer~=c. Correct answer#Feedback for correct answer~%50%d. Answer that gives half the credit#Feedback for half credit answer}', + 'questiontextformat' => '0', + 'generalfeedback' => '', + 'generalfeedbackformat' => '1', + 'defaultgrade' => '2.0000000', + 'penalty' => '0.0000000', + 'qtype' => 'multichoice', + 'length' => '1', + 'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+QGvRpd', + 'version' => 'tjh238.vledev2.open.ac.uk+110525164441+03GsSs', + 'hidden' => '0', + 'timecreated' => '1306341881', + 'timemodified' => '1306341881', + 'createdby' => '2', + 'modifiedby' => '2', + 'options' => (object) array( + 'id' => '5', + 'question' => '24', + 'layout' => '2', + 'answers' => array( + 42 => (object) array( + 'id' => '42', + 'question' => '24', + 'answer' => 'a. Wrong answer', + 'answerformat' => '1', + 'fraction' => '0.0000000', + 'feedback' => 'Feedback for this wrong answer', + 'feedbackformat' => '1', + ), + 43 => (object) array( + 'id' => '43', + 'question' => '24', + 'answer' => 'b. Another wrong answer', + 'answerformat' => '1', + 'fraction' => '0.0000000', + 'feedback' => 'Feedback for the other wrong answer', + 'feedbackformat' => '1', + ), + 44 => (object) array( + 'id' => '44', + 'question' => '24', + 'answer' => 'c. Correct answer', + 'answerformat' => '1', + 'fraction' => '1.0000000', + 'feedback' => 'Feedback for correct answer', + 'feedbackformat' => '1', + ), + 45 => (object) array( + 'id' => '45', + 'question' => '24', + 'answer' => 'd. Answer that gives half the credit', + 'answerformat' => '1', + 'fraction' => '0.5000000', + 'feedback' => 'Feedback for half credit answer', + 'feedbackformat' => '1', + ), + ), + 'single' => '1', + 'shuffleanswers' => '1', + 'correctfeedback' => '', + 'correctfeedbackformat' => '1', + 'partiallycorrectfeedback' => '', + 'partiallycorrectfeedbackformat' => '1', + 'incorrectfeedback' => '', + 'incorrectfeedbackformat' => '1', + 'answernumbering' => '0', + ), + 'maxgrade' => '2.0000000', + ), + 6 => (object) array( + 'id' => '25', + 'category' => '2', + 'parent' => '19', + 'name' => 'Cloze', + 'questiontext' => '{1:SHORTANSWER_C:moodle#Feedback for moodle in lower case ~=MOODLE#Feedback for MOODLE in upper case ~%50%Moodle#Feedback for only first letter in upper case}', + 'questiontextformat' => '0', + 'generalfeedback' => '', + 'generalfeedbackformat' => '1', + 'defaultgrade' => '1.0000000', + 'penalty' => '0.0000000', + 'qtype' => 'shortanswer', + 'length' => '1', + 'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+n9ETJC', + 'version' => 'tjh238.vledev2.open.ac.uk+110525164441+Bvqo6c', + 'hidden' => '0', + 'timecreated' => '1306341881', + 'timemodified' => '1306341881', + 'createdby' => '2', + 'modifiedby' => '2', + 'options' => (object) array( + 'answers' => array( + 46 => (object) array( + 'id' => '46', + 'question' => '25', + 'answer' => 'moodle', + 'answerformat' => '0', + 'fraction' => '0.0000000', + 'feedback' => 'Feedback for moodle in lower case', + 'feedbackformat' => '1', + ), + 47 => (object) array( + 'id' => '47', + 'question' => '25', + 'answer' => 'MOODLE', + 'answerformat' => '0', + 'fraction' => '1.0000000', + 'feedback' => 'Feedback for MOODLE in upper case', + 'feedbackformat' => '1', + ), + 48 => (object) array( + 'id' => '48', + 'question' => '25', + 'answer' => 'Moodle', + 'answerformat' => '0', + 'fraction' => '0.5000000', + 'feedback' => 'Feedback for only first letter in upper case', + 'feedbackformat' => '1', + ), + ), + 'usecase' => '1', + ), + 'maxgrade' => '1.0000000', + ), + 7 => (object) array( + 'id' => '26', + 'category' => '2', + 'parent' => '19', + 'name' => 'Cloze', + 'questiontext' => '{:MULTICHOICE:=Yes#Correct~No#We have a different opinion}', + 'questiontextformat' => '0', + 'generalfeedback' => '', + 'generalfeedbackformat' => '1', + 'defaultgrade' => '1.0000000', + 'penalty' => '0.0000000', + 'qtype' => 'multichoice', + 'length' => '1', + 'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+0YjnZ7', + 'version' => 'tjh238.vledev2.open.ac.uk+110525164441+1giLRX', + 'hidden' => '0', + 'timecreated' => '1306341881', + 'timemodified' => '1306341881', + 'createdby' => '2', + 'modifiedby' => '2', + 'options' => (object) array( + 'id' => '6', + 'question' => '26', + 'layout' => '0', + 'answers' => array( + 49 => (object) array( + 'id' => '49', + 'question' => '26', + 'answer' => 'Yes', + 'answerformat' => '1', + 'fraction' => '1.0000000', + 'feedback' => 'Correct', + 'feedbackformat' => '1', + ), + 50 => (object) array( + 'id' => '50', + 'question' => '26', + 'answer' => 'No', + 'answerformat' => '1', + 'fraction' => '0.0000000', + 'feedback' => 'We have a different opinion', + 'feedbackformat' => '1', + ), + ), + 'single' => '1', + 'shuffleanswers' => '1', + 'correctfeedback' => '', + 'correctfeedbackformat' => '1', + 'partiallycorrectfeedback' => '', + 'partiallycorrectfeedbackformat' => '1', + 'incorrectfeedback' => '', + 'incorrectfeedbackformat' => '1', + 'answernumbering' => '0', + ), + 'maxgrade' => '1.0000000', + ), + 8 => (object) array( + 'id' => '27', + 'category' => '2', + 'parent' => '19', + 'name' => 'Cloze', + 'questiontext' => '{3:NUMERICAL:=3:2}', + 'questiontextformat' => '0', + 'generalfeedback' => '', + 'generalfeedbackformat' => '1', + 'defaultgrade' => '3.0000000', + 'penalty' => '0.0000000', + 'qtype' => 'numerical', + 'length' => '1', + 'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+glbCBN', + 'version' => 'tjh238.vledev2.open.ac.uk+110525164441+xWusxR', + 'hidden' => '0', + 'timecreated' => '1306341881', + 'timemodified' => '1306341881', + 'createdby' => '2', + 'modifiedby' => '2', + 'options' => (object) array( + 'answers' => array( + 51 => (object) array( + 'id' => '51', + 'question' => '27', + 'answer' => '3', + 'answerformat' => '0', + 'fraction' => '1.0000000', + 'feedback' => '', + 'feedbackformat' => '1', + 'tolerance' => '2', + ), + ), + 'units' => array( + ), + 'unitgradingtype' => '0', + 'unitpenalty' => '1.0000000', + 'showunits' => '3', + 'unitsleft' => '0', + 'instructions' => '', + 'instructionsformat' => '1', + ), + 'maxgrade' => '3.0000000', + ), + ), + ), + 'defaultmark' => '13.0000000', + ); + $qsession = (object) array( + 'id' => '109', + 'attemptid' => '18', + 'questionid' => '19', + 'newest' => '299', + 'newgraded' => '299', + 'sumpenalty' => '5.2000000', + 'manualcomment' => '', + 'manualcommentformat' => '1', + 'flagged' => '0', + ); + $qstates = array( + 292 => (object) array( + 'id' => '292', + 'attempt' => '18', + 'question' => '19', + 'seq_number' => '0', + 'answer' => '1-,2-,3-,4-,5-,6-,7-,8-', + 'timestamp' => '1306425784', + 'event' => '0', + 'grade' => '0.0000000', + 'raw_grade' => '0.0000000', + 'penalty' => '0.0000000', + ), + 294 => (object) array( + 'id' => '294', + 'attempt' => '18', + 'question' => '19', + 'seq_number' => '1', + 'answer' => '1-32,2-asdgf,3-saedf,4-39,5-43,6-sadf,7-,8-', + 'timestamp' => '1306425801', + 'event' => '3', + 'grade' => '0.5000000', + 'raw_grade' => '0.5000000', + 'penalty' => '1.3000000', + ), + 295 => (object) array( + 'id' => '295', + 'attempt' => '18', + 'question' => '19', + 'seq_number' => '2', + 'answer' => '1-31,2-asdgf,3-28.3,4-40,5-44,6-MOODLE,7-49,8-13', + 'timestamp' => '1306425836', + 'event' => '3', + 'grade' => '5.7000000', + 'raw_grade' => '7.0000000', + 'penalty' => '1.3000000', + ), + 296 => (object) array( + 'id' => '296', + 'attempt' => '18', + 'question' => '19', + 'seq_number' => '3', + 'answer' => '1-31,2-Correct answer,3-23.8,4-40,5-44,6-MOODLE,7-49,8-3', + 'timestamp' => '1306425886', + 'event' => '3', + 'grade' => '9.4000000', + 'raw_grade' => '12.0000000', + 'penalty' => '1.3000000', + ), + 299 => (object) array( + 'id' => '299', + 'attempt' => '18', + 'question' => '19', + 'seq_number' => '4', + 'answer' => '1-31,2-Correct answer,3-23.8,4-40,5-44,6-MOODLE,7-49,8-3', + 'timestamp' => '1306425886', + 'event' => '6', + 'grade' => '9.4000000', + 'raw_grade' => '12.0000000', + 'penalty' => '1.3000000', + ), + ); + + $qa = $this->updater->convert_question_attempt($quiz, $attempt, $question, $qsession, $qstates); + + $expectedqa = (object) array( + 'behaviour' => 'adaptivenopenalty', + 'questionid' => 19, + 'maxmark' => 13.0000000, + 'minfraction' => 0, + 'flagged' => 0, + 'questionsummary' => 'This question consists of some text with an answer embedded right here {Wrong answer; Another wrong answer; Correct answer; Answer that gives half the credit} + +and right after that you will have to deal with this short answer _____ + +and finally we have a floating point number _____. + +The multichoice question can also be shown in the vertical display of the standard moodle multiple choice. {1. Wrong answer; 2. Another wrong answer; 3. Correct answer; 4. Answer that gives half the credit} + +Or in an horizontal display that is included here in a table {a. Wrong answer; b. Another wrong answer; c. Correct answer; d. Answer that gives half the credit} + +A shortanswer question where case must match. Write moodle in upper case letters _____ + +Note that addresses like www.moodle.org and smileys :-) all work as normal: + +a) How good is this? {Yes; No} + +b) What grade would you give it? _____', + 'rightanswer' => 'part 1: Correct answer; part 2: Correct answer; part 3: 23.8; part 4: 3. Correct answer; part 5: c. Correct answer; part 6: MOODLE; part 7: Yes; part 8: 3', + 'responsesummary' => 'part 1: Correct answer; part 2: Correct answer; part 3: 23.8; part 4: 3. Correct answer; part 5: c. Correct answer; part 6: MOODLE; part 7: Yes; part 8: 3', + 'timemodified' => 1306425886, + 'steps' => array( + 0 => (object) array( + 'sequencenumber' => 0, + 'state' => 'todo', + 'fraction' => null, + 'timecreated' => 1306425784, + 'userid' => 3, + 'data' => array('-_try' => '1', '_sub1_order' => '29,30,31,32', + '_sub3_separators' => '.$,', '_sub4_order' => '38,39,40,41', + '_sub5_order' => '42,43,44,45', '_sub7_order' => '49,50', + '_sub8_separators' => '.$,'), + ), + 1 => (object) array( + 'sequencenumber' => 1, + 'state' => 'todo', + 'fraction' => 0.038461538461538464, + 'timecreated' => 1306425801, + 'userid' => 3, + 'data' => array('sub1_answer' => '3', 'sub2_answer' => 'asdgf', + 'sub3_answer' => 'saedf', 'sub4_answer' => '1', + 'sub5_answer' => '1', 'sub6_answer' => 'sadf', + '-_try' => '2', + '-_rawfraction' => '0.038461538461538464', '-submit' => '1'), + ), + 2 => (object) array( + 'sequencenumber' => 2, + 'state' => 'todo', + 'fraction' => 0.43846153846153845, + 'timecreated' => 1306425836, + 'userid' => 3, + 'data' => array('sub1_answer' => '2', 'sub2_answer' => 'asdgf', + 'sub3_answer' => '28.3', 'sub4_answer' => '2', + 'sub5_answer' => '2', 'sub6_answer' => 'MOODLE', + 'sub7_answer' => '0', 'sub8_answer' => '13', '-_try' => '3', + '-_rawfraction' => '0.53846153846153845', '-submit' => '1'), + ), + 3 => (object) array( + 'sequencenumber' => 3, + 'state' => 'todo', + 'fraction' => 0.72307692307692311, + 'timecreated' => 1306425886, + 'userid' => 3, + 'data' => array('sub1_answer' => '2', 'sub2_answer' => 'Correct answer', + 'sub3_answer' => '23.8', 'sub4_answer' => '2', + 'sub5_answer' => '2', 'sub6_answer' => 'MOODLE', + 'sub7_answer' => '0', 'sub8_answer' => '3', '-_try' => '4', + '-_rawfraction' => '0.92307692307692311', '-submit' => '1'), + ), + 4 => (object) array( + 'sequencenumber' => 4, + 'state' => 'gradedpartial', + 'fraction' => 0.72307692307692311, + 'timecreated' => 1306425886, + 'userid' => 3, + 'data' => array('sub1_answer' => '2', 'sub2_answer' => 'Correct answer', + 'sub3_answer' => '23.8', 'sub4_answer' => '2', + 'sub5_answer' => '2', 'sub6_answer' => 'MOODLE', + 'sub7_answer' => '0', 'sub8_answer' => '3', '-_try' => '4', + '-_rawfraction' => '0.92307692307692311', '-finish' => '1'), + ), + ), + ); + + $this->assertEqual($expectedqa, $qa); + } } diff --git a/question/type/multianswer/db/upgradelib.php b/question/type/multianswer/db/upgradelib.php index a87654dff8d..c0988b09855 100644 --- a/question/type/multianswer/db/upgradelib.php +++ b/question/type/multianswer/db/upgradelib.php @@ -104,7 +104,7 @@ class qtype_multianswer_qe2_attempt_updater extends question_qtype_attempt_updat $response = $this->explode_answer($state->answer); foreach ($this->question->options->questions as $i => $subq) { if ($response[$i] && $subq->qtype == 'multichoice') { - $response[$i] = $subq->options->answers[$response[$i]]; + $response[$i] = $subq->options->answers[$response[$i]]->answer; } } return $this->display_response($response); @@ -115,6 +115,17 @@ class qtype_multianswer_qe2_attempt_updater extends question_qtype_attempt_updat } public function set_first_step_data_elements($state, &$data) { + foreach ($this->question->options->questions as $i => $subq) { + switch ($subq->qtype) { + case 'multichoice': + $data[$this->add_prefix('_order', $i)] = + implode(',', array_keys($subq->options->answers)); + break; + case 'numerical': + $data[$this->add_prefix('_separators', $i)] = '.$,'; + break; + } + } } public function supply_missing_first_step_data(&$data) { @@ -130,8 +141,12 @@ class qtype_multianswer_qe2_attempt_updater extends question_qtype_attempt_updat switch ($subq->qtype) { case 'multichoice': $choices = array(); + $order = 0; foreach ($subq->options->answers as $ans) { - $choices[] = $this->to_text($ans->answer); + if ($ans->id == $response[$i]) { + $data[$this->add_prefix('answer', $i)] = $order; + } + $order++; } $answerbit = '{' . implode('; ', $choices) . '}'; break;