Merge branch 'MDL-70148-310' of git://github.com/andrewnicols/moodle into MOODLE_310_...
[moodle.git] / question / type / calculatedmulti / tests / upgradelibnewqe_test.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * Tests of the upgrade to the new Moodle question engine for attempts at
19  * calculated multiple-choice questions.
20  *
21  * @package    qtype
22  * @subpackage calculatedmulti
23  * @copyright  2011 The Open University
24  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
25  */
28 defined('MOODLE_INTERNAL') || die();
30 global $CFG;
31 require_once($CFG->dirroot . '/question/engine/upgrade/tests/helper.php');
34 /**
35  * Testing the upgrade of calculated multiple-choice question attempts.
36  *
37  * @copyright  2011 The Open University
38  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
39  */
40 class qtype_calculatedmulti_attempt_upgrader_test extends question_attempt_upgrader_test_base {
41     public function test_calculatedmulti_adaptive_qsession96() {
42         $quiz = (object) array(
43             'id' => '4',
44             'course' => '2',
45             'name' => 'Calculated quiz',
46             'intro' => '',
47             'introformat' => '1',
48             'timeopen' => '0',
49             'timeclose' => '0',
50             'attempts' => '0',
51             'attemptonlast' => '0',
52             'grademethod' => '1',
53             'decimalpoints' => '2',
54             'questiondecimalpoints' => '-1',
55             'questionsperpage' => '1',
56             'shufflequestions' => '0',
57             'shuffleanswers' => '1',
58             'sumgrades' => '3.00000',
59             'grade' => '10.00000',
60             'timecreated' => '0',
61             'timemodified' => '1305648351',
62             'timelimit' => '0',
63             'password' => '',
64             'subnet' => '',
65             'popup' => '0',
66             'delay1' => '0',
67             'delay2' => '0',
68             'showuserpicture' => '0',
69             'showblocks' => '0',
70             'preferredbehaviour' => 'adaptive',
71             'reviewattempt' => '69888',
72             'reviewcorrectness' => '69888',
73             'reviewmarks' => '69888',
74             'reviewspecificfeedback' => '69888',
75             'reviewgeneralfeedback' => '69888',
76             'reviewrightanswer' => '69888',
77             'reviewoverallfeedback' => '4352',
78         );
79         $attempt = (object) array(
80             'id' => '13',
81             'uniqueid' => '13',
82             'quiz' => '4',
83             'userid' => '4',
84             'attempt' => '1',
85             'sumgrades' => '0.00000',
86             'timestart' => '1305830650',
87             'timefinish' => '1305830656',
88             'timemodified' => '1305830656',
89             'layout' => '16,0,17,0,18,0',
90             'preview' => '0',
91         );
92         $question = (object) array(
93             'id' => '17',
94             'category' => '2',
95             'parent' => '0',
96             'name' => 'Calculated multiple-choice',
97             'questiontext' => '<p>What is {a} + {b}?</p>',
98             'questiontextformat' => '1',
99             'generalfeedback' => '',
100             'generalfeedbackformat' => '1',
101             'defaultmark' => '1.0000000',
102             'penalty' => '0.1',
103             'qtype' => 'calculatedmulti',
104             'length' => '1',
105             'stamp' => 'tjh238.vledev2.open.ac.uk+110519184120+gpbLCv',
106             'version' => 'tjh238.vledev2.open.ac.uk+110519184120+P5jpWJ',
107             'hidden' => '0',
108             'timecreated' => '1305830480',
109             'timemodified' => '1305830480',
110             'createdby' => '2',
111             'modifiedby' => '2',
112             'maxmark' => '1.0000000',
113             'options' => (object) array(
114                 'id' => '1',
115                 'question' => '17',
116                 'synchronize' => '0',
117                 'single' => '1',
118                 'shuffleanswers' => '1',
119                 'correctfeedback' => '',
120                 'correctfeedbackformat' => '1',
121                 'partiallycorrectfeedback' => '',
122                 'partiallycorrectfeedbackformat' => '1',
123                 'incorrectfeedback' => '',
124                 'incorrectfeedbackformat' => '1',
125                 'answernumbering' => 'abc',
126                 'shownumcorrect' => '0',
127                 'answers' => array(
128                     24 => (object) array(
129                         'id' => '24',
130                         'question' => '17',
131                         'answer' => '{={a} - {b}}',
132                         'answerformat' => '0',
133                         'fraction' => '0.0000000',
134                         'feedback' => '',
135                         'feedbackformat' => '1',
136                         'tolerance' => '0.01',
137                         'tolerancetype' => '1',
138                         'correctanswerlength' => '2',
139                         'correctanswerformat' => '1',
140                     ),
141                     25 => (object) array(
142                         'id' => '25',
143                         'question' => '17',
144                         'answer' => '{={a} + {b}}',
145                         'answerformat' => '0',
146                         'fraction' => '1.0000000',
147                         'feedback' => '',
148                         'feedbackformat' => '1',
149                         'tolerance' => '0.01',
150                         'tolerancetype' => '1',
151                         'correctanswerlength' => '2',
152                         'correctanswerformat' => '1',
153                     ),
154                     26 => (object) array(
155                         'id' => '26',
156                         'question' => '17',
157                         'answer' => '{={a} / {b}}',
158                         'answerformat' => '0',
159                         'fraction' => '0.0000000',
160                         'feedback' => '',
161                         'feedbackformat' => '1',
162                         'tolerance' => '0.01',
163                         'tolerancetype' => '1',
164                         'correctanswerlength' => '2',
165                         'correctanswerformat' => '1',
166                     ),
167                     27 => (object) array(
168                         'id' => '27',
169                         'question' => '17',
170                         'answer' => '{={a} * {b}}',
171                         'answerformat' => '0',
172                         'fraction' => '0.0000000',
173                         'feedback' => '',
174                         'feedbackformat' => '1',
175                         'tolerance' => '0.01',
176                         'tolerancetype' => '1',
177                         'correctanswerlength' => '2',
178                         'correctanswerformat' => '1',
179                     ),
180                 ),
181             ),
182             'hints' => array(
183             ),
184         );
185         $qsession = (object) array(
186             'id' => '96',
187             'attemptid' => '13',
188             'questionid' => '17',
189             'newest' => '257',
190             'newgraded' => '257',
191             'sumpenalty' => '0.1000000',
192             'manualcomment' => '',
193             'manualcommentformat' => '1',
194             'flagged' => '0',
195         );
196         $qstates = array(
197             254 => (object) array(
198                 'id' => '254',
199                 'attempt' => '13',
200                 'question' => '17',
201                 'seq_number' => '0',
202                 'answer' => 'dataset3-24,26,27,25:',
203                 'timestamp' => '1305830650',
204                 'event' => '0',
205                 'grade' => '0.0000000',
206                 'raw_grade' => '0.0000000',
207                 'penalty' => '0.0000000',
208             ),
209             257 => (object) array(
210                 'id' => '257',
211                 'attempt' => '13',
212                 'question' => '17',
213                 'seq_number' => '1',
214                 'answer' => 'dataset3-24,26,27,25:',
215                 'timestamp' => '1305830650',
216                 'event' => '6',
217                 'grade' => '0.0000000',
218                 'raw_grade' => '0.0000000',
219                 'penalty' => '0.1000000',
220             ),
221         );
222         $this->loader->put_dataset_in_cache($question->id, 3, array('a' => '4.3', 'b' => '5.4'));
224         $qa = $this->updater->convert_question_attempt($quiz, $attempt, $question, $qsession, $qstates);
226         $expectedqa = (object) array(
227             'behaviour' => 'adaptive',
228             'questionid' => 17,
229             'variant' => 3,
230             'maxmark' => 1.0000000,
231             'minfraction' => 0,
232             'maxfraction' => 1,
233             'flagged' => 0,
234             'questionsummary' => 'What is 4.3 + 5.4?',
235             'rightanswer' => '9.7',
236             'responsesummary' => '',
237             'timemodified' => 1305830650,
238             'steps' => array(
239                 0 => (object) array(
240                     'sequencenumber' => 0,
241                     'state' => 'todo',
242                     'fraction' => null,
243                     'timecreated' => 1305830650,
244                     'userid' => 4,
245                     'data' => array('_order' => '24,26,27,25', '_var_a' => '4.3', '_var_b' => '5.4'),
246                 ),
247                 1 => (object) array(
248                     'sequencenumber' => 1,
249                     'state' => 'gradedwrong',
250                     'fraction' => null,
251                     'timecreated' => 1305830650,
252                     'userid' => 4,
253                     'data' => array('-finish' => 1, '-_try' => 1, '-_rawfraction' => 0),
254                 ),
255             ),
256         );
258         $this->compare_qas($expectedqa, $qa);
259     }
261     public function test_calculatedmulti_adaptive_qsession99() {
262         $quiz = (object) array(
263             'id' => '4',
264             'course' => '2',
265             'name' => 'Calculated quiz',
266             'intro' => '',
267             'introformat' => '1',
268             'timeopen' => '0',
269             'timeclose' => '0',
270             'attempts' => '0',
271             'attemptonlast' => '0',
272             'grademethod' => '1',
273             'decimalpoints' => '2',
274             'questiondecimalpoints' => '-1',
275             'questionsperpage' => '1',
276             'shufflequestions' => '0',
277             'shuffleanswers' => '1',
278             'sumgrades' => '3.00000',
279             'grade' => '10.00000',
280             'timecreated' => '0',
281             'timemodified' => '1305648351',
282             'timelimit' => '0',
283             'password' => '',
284             'subnet' => '',
285             'popup' => '0',
286             'delay1' => '0',
287             'delay2' => '0',
288             'showuserpicture' => '0',
289             'showblocks' => '0',
290             'preferredbehaviour' => 'adaptive',
291             'reviewattempt' => '69888',
292             'reviewcorrectness' => '69888',
293             'reviewmarks' => '69888',
294             'reviewspecificfeedback' => '69888',
295             'reviewgeneralfeedback' => '69888',
296             'reviewrightanswer' => '69888',
297             'reviewoverallfeedback' => '4352',
298         );
299         $attempt = (object) array(
300             'id' => '14',
301             'uniqueid' => '14',
302             'quiz' => '4',
303             'userid' => '4',
304             'attempt' => '2',
305             'sumgrades' => '2.80000',
306             'timestart' => '1305830661',
307             'timefinish' => '1305830729',
308             'timemodified' => '1305830729',
309             'layout' => '16,0,17,0,18,0',
310             'preview' => '0',
311         );
312         $question = (object) array(
313             'id' => '17',
314             'category' => '2',
315             'parent' => '0',
316             'name' => 'Calculated multiple-choice',
317             'questiontext' => '<p>What is {a} + {b}?</p>',
318             'questiontextformat' => '1',
319             'generalfeedback' => '',
320             'generalfeedbackformat' => '1',
321             'defaultmark' => '1.0000000',
322             'penalty' => '0.1',
323             'qtype' => 'calculatedmulti',
324             'length' => '1',
325             'stamp' => 'tjh238.vledev2.open.ac.uk+110519184120+gpbLCv',
326             'version' => 'tjh238.vledev2.open.ac.uk+110519184120+P5jpWJ',
327             'hidden' => '0',
328             'timecreated' => '1305830480',
329             'timemodified' => '1305830480',
330             'createdby' => '2',
331             'modifiedby' => '2',
332             'maxmark' => '1.0000000',
333             'options' => (object) array(
334                 'id' => '1',
335                 'question' => '17',
336                 'synchronize' => '0',
337                 'single' => '1',
338                 'shuffleanswers' => '1',
339                 'correctfeedback' => '',
340                 'correctfeedbackformat' => '1',
341                 'partiallycorrectfeedback' => '',
342                 'partiallycorrectfeedbackformat' => '1',
343                 'incorrectfeedback' => '',
344                 'incorrectfeedbackformat' => '1',
345                 'answernumbering' => 'abc',
346                 'shownumcorrect' => '0',
347                 'answers' => array(
348                     24 => (object) array(
349                         'id' => '24',
350                         'question' => '17',
351                         'answer' => '{={a} - {b}}',
352                         'answerformat' => '0',
353                         'fraction' => '0.0000000',
354                         'feedback' => '',
355                         'feedbackformat' => '1',
356                         'tolerance' => '0.01',
357                         'tolerancetype' => '1',
358                         'correctanswerlength' => '2',
359                         'correctanswerformat' => '1',
360                     ),
361                     25 => (object) array(
362                         'id' => '25',
363                         'question' => '17',
364                         'answer' => '{={a} + {b}}',
365                         'answerformat' => '0',
366                         'fraction' => '1.0000000',
367                         'feedback' => '',
368                         'feedbackformat' => '1',
369                         'tolerance' => '0.01',
370                         'tolerancetype' => '1',
371                         'correctanswerlength' => '2',
372                         'correctanswerformat' => '1',
373                     ),
374                     26 => (object) array(
375                         'id' => '26',
376                         'question' => '17',
377                         'answer' => '{={a} / {b}}',
378                         'answerformat' => '0',
379                         'fraction' => '0.0000000',
380                         'feedback' => '',
381                         'feedbackformat' => '1',
382                         'tolerance' => '0.01',
383                         'tolerancetype' => '1',
384                         'correctanswerlength' => '2',
385                         'correctanswerformat' => '1',
386                     ),
387                     27 => (object) array(
388                         'id' => '27',
389                         'question' => '17',
390                         'answer' => '{={a} * {b}}',
391                         'answerformat' => '0',
392                         'fraction' => '0.0000000',
393                         'feedback' => '',
394                         'feedbackformat' => '1',
395                         'tolerance' => '0.01',
396                         'tolerancetype' => '1',
397                         'correctanswerlength' => '2',
398                         'correctanswerformat' => '1',
399                     ),
400                 ),
401             ),
402             'hints' => array(
403             ),
404         );
405         $qsession = (object) array(
406             'id' => '99',
407             'attemptid' => '14',
408             'questionid' => '17',
409             'newest' => '268',
410             'newgraded' => '268',
411             'sumpenalty' => '0.2000000',
412             'manualcomment' => '',
413             'manualcommentformat' => '1',
414             'flagged' => '0',
415         );
416         $qstates = array(
417             260 => (object) array(
418                 'id' => '260',
419                 'attempt' => '14',
420                 'question' => '17',
421                 'seq_number' => '0',
422                 'answer' => 'dataset8-25,24,27,26:',
423                 'timestamp' => '1305830661',
424                 'event' => '0',
425                 'grade' => '0.0000000',
426                 'raw_grade' => '0.0000000',
427                 'penalty' => '0.0000000',
428             ),
429             264 => (object) array(
430                 'id' => '264',
431                 'attempt' => '14',
432                 'question' => '17',
433                 'seq_number' => '1',
434                 'answer' => 'dataset8-25,24,27,26:25',
435                 'timestamp' => '1305830699',
436                 'event' => '3',
437                 'grade' => '1.0000000',
438                 'raw_grade' => '1.0000000',
439                 'penalty' => '0.1000000',
440             ),
441             268 => (object) array(
442                 'id' => '268',
443                 'attempt' => '14',
444                 'question' => '17',
445                 'seq_number' => '2',
446                 'answer' => 'dataset8-25,24,27,26:25',
447                 'timestamp' => '1305830699',
448                 'event' => '6',
449                 'grade' => '1.0000000',
450                 'raw_grade' => '1.0000000',
451                 'penalty' => '0.1000000',
452             ),
453         );
454         $this->loader->put_dataset_in_cache($question->id, 8, array('a' => '3.7', 'b' => '6.0'));
456         $qa = $this->updater->convert_question_attempt($quiz, $attempt, $question, $qsession, $qstates);
458         $expectedqa = (object) array(
459             'behaviour' => 'adaptive',
460             'questionid' => 17,
461             'variant' => 8,
462             'maxmark' => 1.0000000,
463             'minfraction' => 0,
464             'maxfraction' => 1,
465             'flagged' => 0,
466             'questionsummary' => 'What is 3.7 + 6.0?',
467             'rightanswer' => '9.7',
468             'responsesummary' => '9.7',
469             'timemodified' => 1305830699,
470             'steps' => array(
471                 0 => (object) array(
472                     'sequencenumber' => 0,
473                     'state' => 'todo',
474                     'fraction' => null,
475                     'timecreated' => 1305830661,
476                     'userid' => 4,
477                     'data' => array('_order' => '25,24,27,26', '_var_a' => '3.7', '_var_b' => '6.0'),
478                 ),
479                 1 => (object) array(
480                     'sequencenumber' => 1,
481                     'state' => 'complete',
482                     'fraction' => 1,
483                     'timecreated' => 1305830699,
484                     'userid' => 4,
485                     'data' => array('answer' => '0', '-submit' => 1, '-_try' => 1, '-_rawfraction' => 1),
486                 ),
487                 2 => (object) array(
488                     'sequencenumber' => 2,
489                     'state' => 'gradedright',
490                     'fraction' => 1,
491                     'timecreated' => 1305830699,
492                     'userid' => 4,
493                     'data' => array('answer' => '0', '-finish' => 1, '-_try' => 1, '-_rawfraction' => 1),
494                 ),
495             ),
496         );
498         $this->compare_qas($expectedqa, $qa);
499     }
501     public function test_calculatedmulti_adaptive_qsession102() {
502         $quiz = (object) array(
503             'id' => '4',
504             'course' => '2',
505             'name' => 'Calculated quiz',
506             'intro' => '',
507             'introformat' => '1',
508             'timeopen' => '0',
509             'timeclose' => '0',
510             'attempts' => '0',
511             'attemptonlast' => '0',
512             'grademethod' => '1',
513             'decimalpoints' => '2',
514             'questiondecimalpoints' => '-1',
515             'questionsperpage' => '1',
516             'shufflequestions' => '0',
517             'shuffleanswers' => '1',
518             'sumgrades' => '3.00000',
519             'grade' => '10.00000',
520             'timecreated' => '0',
521             'timemodified' => '1305648351',
522             'timelimit' => '0',
523             'password' => '',
524             'subnet' => '',
525             'popup' => '0',
526             'delay1' => '0',
527             'delay2' => '0',
528             'showuserpicture' => '0',
529             'showblocks' => '0',
530             'preferredbehaviour' => 'adaptive',
531             'reviewattempt' => '69888',
532             'reviewcorrectness' => '69888',
533             'reviewmarks' => '69888',
534             'reviewspecificfeedback' => '69888',
535             'reviewgeneralfeedback' => '69888',
536             'reviewrightanswer' => '69888',
537             'reviewoverallfeedback' => '4352',
538         );
539         $attempt = (object) array(
540             'id' => '15',
541             'uniqueid' => '15',
542             'quiz' => '4',
543             'userid' => '3',
544             'attempt' => '1',
545             'sumgrades' => '0.70000',
546             'timestart' => '1305830744',
547             'timefinish' => '0',
548             'timemodified' => '1305830792',
549             'layout' => '16,0,17,0,18,0',
550             'preview' => '0',
551         );
552         $question = (object) array(
553             'id' => '17',
554             'category' => '2',
555             'parent' => '0',
556             'name' => 'Calculated multiple-choice',
557             'questiontext' => '<p>What is {a} + {b}?</p>',
558             'questiontextformat' => '1',
559             'generalfeedback' => '',
560             'generalfeedbackformat' => '1',
561             'defaultmark' => '1.0000000',
562             'penalty' => '0.1',
563             'qtype' => 'calculatedmulti',
564             'length' => '1',
565             'stamp' => 'tjh238.vledev2.open.ac.uk+110519184120+gpbLCv',
566             'version' => 'tjh238.vledev2.open.ac.uk+110519184120+P5jpWJ',
567             'hidden' => '0',
568             'timecreated' => '1305830480',
569             'timemodified' => '1305830480',
570             'createdby' => '2',
571             'modifiedby' => '2',
572             'maxmark' => '1.0000000',
573             'options' => (object) array(
574                 'id' => '1',
575                 'question' => '17',
576                 'synchronize' => '0',
577                 'single' => '1',
578                 'shuffleanswers' => '1',
579                 'correctfeedback' => '',
580                 'correctfeedbackformat' => '1',
581                 'partiallycorrectfeedback' => '',
582                 'partiallycorrectfeedbackformat' => '1',
583                 'incorrectfeedback' => '',
584                 'incorrectfeedbackformat' => '1',
585                 'answernumbering' => 'abc',
586                 'shownumcorrect' => '0',
587                 'answers' => array(
588                     24 => (object) array(
589                         'id' => '24',
590                         'question' => '17',
591                         'answer' => '{={a} - {b}}',
592                         'answerformat' => '0',
593                         'fraction' => '0.0000000',
594                         'feedback' => '',
595                         'feedbackformat' => '1',
596                         'tolerance' => '0.01',
597                         'tolerancetype' => '1',
598                         'correctanswerlength' => '2',
599                         'correctanswerformat' => '1',
600                     ),
601                     25 => (object) array(
602                         'id' => '25',
603                         'question' => '17',
604                         'answer' => '{={a} + {b}}',
605                         'answerformat' => '0',
606                         'fraction' => '1.0000000',
607                         'feedback' => '',
608                         'feedbackformat' => '1',
609                         'tolerance' => '0.01',
610                         'tolerancetype' => '1',
611                         'correctanswerlength' => '2',
612                         'correctanswerformat' => '1',
613                     ),
614                     26 => (object) array(
615                         'id' => '26',
616                         'question' => '17',
617                         'answer' => '{={a} / {b}}',
618                         'answerformat' => '0',
619                         'fraction' => '0.0000000',
620                         'feedback' => '',
621                         'feedbackformat' => '1',
622                         'tolerance' => '0.01',
623                         'tolerancetype' => '1',
624                         'correctanswerlength' => '2',
625                         'correctanswerformat' => '1',
626                     ),
627                     27 => (object) array(
628                         'id' => '27',
629                         'question' => '17',
630                         'answer' => '{={a} * {b}}',
631                         'answerformat' => '0',
632                         'fraction' => '0.0000000',
633                         'feedback' => '',
634                         'feedbackformat' => '1',
635                         'tolerance' => '0.01',
636                         'tolerancetype' => '1',
637                         'correctanswerlength' => '2',
638                         'correctanswerformat' => '1',
639                     ),
640                 ),
641             ),
642             'hints' => array(
643             ),
644         );
645         $qsession = (object) array(
646             'id' => '102',
647             'attemptid' => '15',
648             'questionid' => '17',
649             'newest' => '278',
650             'newgraded' => '278',
651             'sumpenalty' => '0.5000000',
652             'manualcomment' => '',
653             'manualcommentformat' => '1',
654             'flagged' => '0',
655         );
656         $qstates = array(
657             271 => (object) array(
658                 'id' => '271',
659                 'attempt' => '15',
660                 'question' => '17',
661                 'seq_number' => '0',
662                 'answer' => 'dataset7-26,24,25,27:',
663                 'timestamp' => '1305830744',
664                 'event' => '0',
665                 'grade' => '0.0000000',
666                 'raw_grade' => '0.0000000',
667                 'penalty' => '0.0000000',
668             ),
669             274 => (object) array(
670                 'id' => '274',
671                 'attempt' => '15',
672                 'question' => '17',
673                 'seq_number' => '1',
674                 'answer' => 'dataset7-26,24,25,27:27',
675                 'timestamp' => '1305830759',
676                 'event' => '3',
677                 'grade' => '0.0000000',
678                 'raw_grade' => '0.0000000',
679                 'penalty' => '0.1000000',
680             ),
681             275 => (object) array(
682                 'id' => '275',
683                 'attempt' => '15',
684                 'question' => '17',
685                 'seq_number' => '2',
686                 'answer' => 'dataset7-26,24,25,27:24',
687                 'timestamp' => '1305830761',
688                 'event' => '3',
689                 'grade' => '0.0000000',
690                 'raw_grade' => '0.0000000',
691                 'penalty' => '0.1000000',
692             ),
693             276 => (object) array(
694                 'id' => '276',
695                 'attempt' => '15',
696                 'question' => '17',
697                 'seq_number' => '3',
698                 'answer' => 'dataset7-26,24,25,27:26',
699                 'timestamp' => '1305830764',
700                 'event' => '3',
701                 'grade' => '0.0000000',
702                 'raw_grade' => '0.0000000',
703                 'penalty' => '0.1000000',
704             ),
705             277 => (object) array(
706                 'id' => '277',
707                 'attempt' => '15',
708                 'question' => '17',
709                 'seq_number' => '4',
710                 'answer' => 'dataset7-26,24,25,27:25',
711                 'timestamp' => '1305830766',
712                 'event' => '3',
713                 'grade' => '0.7000000',
714                 'raw_grade' => '1.0000000',
715                 'penalty' => '0.1000000',
716             ),
717             278 => (object) array(
718                 'id' => '278',
719                 'attempt' => '15',
720                 'question' => '17',
721                 'seq_number' => '5',
722                 'answer' => 'dataset7-26,24,25,27:24',
723                 'timestamp' => '1305830768',
724                 'event' => '3',
725                 'grade' => '0.7000000',
726                 'raw_grade' => '0.0000000',
727                 'penalty' => '0.1000000',
728             ),
729         );
730         $this->loader->put_dataset_in_cache($question->id, 7, array('a' => '4.4', 'b' => '8.2'));
732         $qa = $this->updater->convert_question_attempt($quiz, $attempt, $question, $qsession, $qstates);
734         $expectedqa = (object) array(
735             'behaviour' => 'adaptive',
736             'questionid' => 17,
737             'variant' => 7,
738             'maxmark' => 1.0000000,
739             'minfraction' => 0,
740             'maxfraction' => 1,
741             'flagged' => 0,
742             'questionsummary' => 'What is 4.4 + 8.2?',
743             'rightanswer' => '12.6',
744             'responsesummary' => '-3.8',
745             'timemodified' => 1305830768,
746             'steps' => array(
747                 0 => (object) array(
748                     'sequencenumber' => 0,
749                     'state' => 'todo',
750                     'fraction' => null,
751                     'timecreated' => 1305830744,
752                     'userid' => 3,
753                     'data' => array('_order' => '26,24,25,27', '_var_a' => '4.4', '_var_b' => '8.2'),
754                 ),
755                 1 => (object) array(
756                     'sequencenumber' => 1,
757                     'state' => 'todo',
758                     'fraction' => 0,
759                     'timecreated' => 1305830759,
760                     'userid' => 3,
761                     'data' => array('answer' => '3', '-submit' => 1, '-_try' => 1, '-_rawfraction' => 0),
762                 ),
763                 2 => (object) array(
764                     'sequencenumber' => 2,
765                     'state' => 'todo',
766                     'fraction' => 0,
767                     'timecreated' => 1305830761,
768                     'userid' => 3,
769                     'data' => array('answer' => '1', '-submit' => 1, '-_try' => 2, '-_rawfraction' => 0),
770                 ),
771                 3 => (object) array(
772                     'sequencenumber' => 3,
773                     'state' => 'todo',
774                     'fraction' => 0,
775                     'timecreated' => 1305830764,
776                     'userid' => 3,
777                     'data' => array('answer' => '0', '-submit' => 1, '-_try' => 3, '-_rawfraction' => 0),
778                 ),
779                 4 => (object) array(
780                     'sequencenumber' => 4,
781                     'state' => 'todo',
782                     'fraction' => 0.7,
783                     'timecreated' => 1305830766,
784                     'userid' => 3,
785                     'data' => array('answer' => '2', '-submit' => 1, '-_try' => 4, '-_rawfraction' => 1),
786                 ),
787                 5 => (object) array(
788                     'sequencenumber' => 5,
789                     'state' => 'todo',
790                     'fraction' => 0.7,
791                     'timecreated' => 1305830768,
792                     'userid' => 3,
793                     'data' => array('answer' => '1', '-submit' => 1, '-_try' => 5, '-_rawfraction' => 0),
794                 ),
795             ),
796         );
798         $this->compare_qas($expectedqa, $qa);
799     }