Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.11.x will end 14 Nov 2022 (12 months plus 6 months extension).
  • Bug fixes for security issues in 3.11.x will end 13 Nov 2023 (18 months plus 12 months extension).
  • PHP version: minimum PHP 7.3.0 Note: minimum PHP version has increased since Moodle 3.10. PHP 7.4.x is supported too.
   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/>.
  16  
  17  namespace qtype_multianswer;
  18  
  19  defined('MOODLE_INTERNAL') || die();
  20  
  21  global $CFG;
  22  require_once($CFG->dirroot . '/question/engine/upgrade/tests/helper.php');
  23  
  24  
  25  /**
  26   * Testing the upgrade of multianswer question attempts.
  27   *
  28   * @package    qtype_multianswer
  29   * @copyright  2011 The Open University
  30   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  31   */
  32  class upgrade_old_attempt_data_test extends \question_attempt_upgrader_test_base {
  33      public function test_multianswer_adaptivenopenalty_qsession104() {
  34          $quiz = (object) array(
  35              'id' => '5',
  36              'course' => '2',
  37              'name' => 'Multianswer quiz',
  38              'intro' => '',
  39              'introformat' => '1',
  40              'timeopen' => '0',
  41              'timeclose' => '0',
  42              'attempts' => '0',
  43              'attemptonlast' => '0',
  44              'grademethod' => '1',
  45              'decimalpoints' => '2',
  46              'questiondecimalpoints' => '-1',
  47              'review' => '4459503',
  48              'questionsperpage' => '1',
  49              'shufflequestions' => '0',
  50              'shuffleanswers' => '1',
  51              'sumgrades' => '14.00000',
  52              'grade' => '10.00000',
  53              'timecreated' => '0',
  54              'timemodified' => '1306424728',
  55              'timelimit' => '0',
  56              'password' => '',
  57              'subnet' => '',
  58              'popup' => '0',
  59              'delay1' => '0',
  60              'delay2' => '0',
  61              'showuserpicture' => '0',
  62              'showblocks' => '0',
  63              'preferredbehaviour' => 'adaptivenopenalty',
  64          );
  65          $attempt = (object) array(
  66              'id' => '16',
  67              'uniqueid' => '16',
  68              'quiz' => '5',
  69              'userid' => '4',
  70              'attempt' => '1',
  71              'sumgrades' => '6.00000',
  72              'timestart' => '1306425691',
  73              'timefinish' => '1306425746',
  74              'timemodified' => '1306425746',
  75              'layout' => '28,19,0',
  76              'preview' => '0',
  77          );
  78          $question = (object) array(
  79              'id' => '28',
  80              'category' => '2',
  81              'parent' => '0',
  82              'name' => 'Very simple cloze',
  83              'questiontext' => '<p>An answer {#1}.</p>',
  84              'questiontextformat' => '1',
  85              'generalfeedback' => '',
  86              'generalfeedbackformat' => '1',
  87              'penalty' => '0.1000000',
  88              'qtype' => 'multianswer',
  89              'length' => '1',
  90              'stamp' => 'tjh238.vledev2.open.ac.uk+110526154631+XQLcXi',
  91              'version' => 'tjh238.vledev2.open.ac.uk+110526154631+T8hPiI',
  92              'hidden' => '0',
  93              'timecreated' => '1306424791',
  94              'timemodified' => '1306424791',
  95              'createdby' => '2',
  96              'modifiedby' => '2',
  97              'maxmark' => '1.0000000',
  98              'options' => (object) array(
  99                  'questions' => array(
 100                      1 => (object) array(
 101                          'id' => '29',
 102                          'category' => '2',
 103                          'parent' => '28',
 104                          'name' => 'Very simple cloze',
 105                          'questiontext' => '{1:SHORTANSWER:=frog#Yay!}',
 106                          'questiontextformat' => '0',
 107                          'generalfeedback' => '',
 108                          'generalfeedbackformat' => '1',
 109                          'defaultgrade' => '1.0000000',
 110                          'penalty' => '0.0000000',
 111                          'qtype' => 'shortanswer',
 112                          'length' => '1',
 113                          'stamp' => 'tjh238.vledev2.open.ac.uk+110526154631+j3BYTL',
 114                          'version' => 'tjh238.vledev2.open.ac.uk+110526154631+lxNwQv',
 115                          'hidden' => '0',
 116                          'timecreated' => '1306424791',
 117                          'timemodified' => '1306424791',
 118                          'createdby' => '2',
 119                          'modifiedby' => '2',
 120                          'options' => (object) array(
 121                              'answers' => array(
 122                                  52 => (object) array(
 123                                      'id' => '52',
 124                                      'question' => '29',
 125                                      'answer' => 'frog',
 126                                      'answerformat' => '0',
 127                                      'fraction' => '1.0000000',
 128                                      'feedback' => 'Yay!',
 129                                      'feedbackformat' => '1',
 130                                  ),
 131                              ),
 132                              'usecase' => '0',
 133                          ),
 134                          'maxgrade' => '1.0000000',
 135                      ),
 136                  ),
 137              ),
 138              'defaultmark' => '1.0000000',
 139          );
 140          $qsession = (object) array(
 141              'id' => '104',
 142              'attemptid' => '16',
 143              'questionid' => '28',
 144              'newest' => '285',
 145              'newgraded' => '285',
 146              'sumpenalty' => '0.1000000',
 147              'manualcomment' => '',
 148              'manualcommentformat' => '1',
 149              'flagged' => '0',
 150          );
 151          $qstates = array(
 152              281 => (object) array(
 153                  'id' => '281',
 154                  'attempt' => '16',
 155                  'question' => '28',
 156                  'seq_number' => '0',
 157                  'answer' => '1-',
 158                  'timestamp' => '1306425691',
 159                  'event' => '0',
 160                  'grade' => '0.0000000',
 161                  'raw_grade' => '0.0000000',
 162                  'penalty' => '0.0000000',
 163              ),
 164              283 => (object) array(
 165                  'id' => '283',
 166                  'attempt' => '16',
 167                  'question' => '28',
 168                  'seq_number' => '1',
 169                  'answer' => '1-frog',
 170                  'timestamp' => '1306425739',
 171                  'event' => '2',
 172                  'grade' => '0.0000000',
 173                  'raw_grade' => '1.0000000',
 174                  'penalty' => '0.1000000',
 175              ),
 176              285 => (object) array(
 177                  'id' => '285',
 178                  'attempt' => '16',
 179                  'question' => '28',
 180                  'seq_number' => '2',
 181                  'answer' => '1-frog',
 182                  'timestamp' => '1306425739',
 183                  'event' => '6',
 184                  'grade' => '1.0000000',
 185                  'raw_grade' => '1.0000000',
 186                  'penalty' => '0.1000000',
 187              ),
 188          );
 189  
 190          $qa = $this->updater->convert_question_attempt($quiz, $attempt, $question, $qsession, $qstates);
 191  
 192          $expectedqa = (object) array(
 193              'behaviour' => 'adaptivenopenalty',
 194              'questionid' => 28,
 195              'variant' => 1,
 196              'maxmark' => 1.0000000,
 197              'minfraction' => 0,
 198              'maxfraction' => 1,
 199              'flagged' => 0,
 200              'questionsummary' => 'An answer _____.',
 201              'rightanswer' => 'part 1: frog',
 202              'responsesummary' => 'part 1: frog',
 203              'timemodified' => 1306425739,
 204              'steps' => array(
 205                  0 => (object) array(
 206                      'sequencenumber' => 0,
 207                      'state' => 'todo',
 208                      'fraction' => null,
 209                      'timecreated' => 1306425691,
 210                      'userid' => 4,
 211                      'data' => array(),
 212                  ),
 213                  1 => (object) array(
 214                      'sequencenumber' => 1,
 215                      'state' => 'complete',
 216                      'fraction' => null,
 217                      'timecreated' => 1306425739,
 218                      'userid' => 4,
 219                      'data' => array('sub1_answer' => 'frog'),
 220                  ),
 221                  2 => (object) array(
 222                      'sequencenumber' => 2,
 223                      'state' => 'gradedright',
 224                      'fraction' => 1.0,
 225                      'timecreated' => 1306425739,
 226                      'userid' => 4,
 227                      'data' => array('sub1_answer' => 'frog', '-finish' => '1',
 228                              '-_try' => '1', '-_rawfraction' => 1.0),
 229                  ),
 230              ),
 231          );
 232  
 233          $this->compare_qas($expectedqa, $qa);
 234      }
 235  
 236      public function test_multianswer_adaptivenopenalty_qsession106() {
 237          $quiz = (object) array(
 238              'id' => '5',
 239              'course' => '2',
 240              'name' => 'Multianswer quiz',
 241              'intro' => '',
 242              'introformat' => '1',
 243              'timeopen' => '0',
 244              'timeclose' => '0',
 245              'attempts' => '0',
 246              'attemptonlast' => '0',
 247              'grademethod' => '1',
 248              'decimalpoints' => '2',
 249              'questiondecimalpoints' => '-1',
 250              'review' => '4459503',
 251              'questionsperpage' => '1',
 252              'shufflequestions' => '0',
 253              'shuffleanswers' => '1',
 254              'sumgrades' => '14.00000',
 255              'grade' => '10.00000',
 256              'timecreated' => '0',
 257              'timemodified' => '1306424728',
 258              'timelimit' => '0',
 259              'password' => '',
 260              'subnet' => '',
 261              'popup' => '0',
 262              'delay1' => '0',
 263              'delay2' => '0',
 264              'showuserpicture' => '0',
 265              'showblocks' => '0',
 266              'preferredbehaviour' => 'adaptivenopenalty',
 267          );
 268          $attempt = (object) array(
 269              'id' => '17',
 270              'uniqueid' => '17',
 271              'quiz' => '5',
 272              'userid' => '4',
 273              'attempt' => '2',
 274              'sumgrades' => '0.00000',
 275              'timestart' => '1306425757',
 276              'timefinish' => '1306425762',
 277              'timemodified' => '1306425762',
 278              'layout' => '28,19,0',
 279              'preview' => '0',
 280          );
 281          $question = (object) array(
 282              'id' => '28',
 283              'category' => '2',
 284              'parent' => '0',
 285              'name' => 'Very simple cloze',
 286              'questiontext' => '<p>An answer {#1}.</p>',
 287              'questiontextformat' => '1',
 288              'generalfeedback' => '',
 289              'generalfeedbackformat' => '1',
 290              'penalty' => '0.1000000',
 291              'qtype' => 'multianswer',
 292              'length' => '1',
 293              'stamp' => 'tjh238.vledev2.open.ac.uk+110526154631+XQLcXi',
 294              'version' => 'tjh238.vledev2.open.ac.uk+110526154631+T8hPiI',
 295              'hidden' => '0',
 296              'timecreated' => '1306424791',
 297              'timemodified' => '1306424791',
 298              'createdby' => '2',
 299              'modifiedby' => '2',
 300              'maxmark' => '1.0000000',
 301              'options' => (object) array(
 302                  'questions' => array(
 303                      1 => (object) array(
 304                          'id' => '29',
 305                          'category' => '2',
 306                          'parent' => '28',
 307                          'name' => 'Very simple cloze',
 308                          'questiontext' => '{1:SHORTANSWER:=frog#Yay!}',
 309                          'questiontextformat' => '0',
 310                          'generalfeedback' => '',
 311                          'generalfeedbackformat' => '1',
 312                          'defaultgrade' => '1.0000000',
 313                          'penalty' => '0.0000000',
 314                          'qtype' => 'shortanswer',
 315                          'length' => '1',
 316                          'stamp' => 'tjh238.vledev2.open.ac.uk+110526154631+j3BYTL',
 317                          'version' => 'tjh238.vledev2.open.ac.uk+110526154631+lxNwQv',
 318                          'hidden' => '0',
 319                          'timecreated' => '1306424791',
 320                          'timemodified' => '1306424791',
 321                          'createdby' => '2',
 322                          'modifiedby' => '2',
 323                          'options' => (object) array(
 324                              'answers' => array(
 325                                  52 => (object) array(
 326                                      'id' => '52',
 327                                      'question' => '29',
 328                                      'answer' => 'frog',
 329                                      'answerformat' => '0',
 330                                      'fraction' => '1.0000000',
 331                                      'feedback' => 'Yay!',
 332                                      'feedbackformat' => '1',
 333                                  ),
 334                              ),
 335                              'usecase' => '0',
 336                          ),
 337                          'maxgrade' => '1.0000000',
 338                      ),
 339                  ),
 340              ),
 341              'defaultmark' => '1.0000000',
 342          );
 343          $qsession = (object) array(
 344              'id' => '106',
 345              'attemptid' => '17',
 346              'questionid' => '28',
 347              'newest' => '289',
 348              'newgraded' => '289',
 349              'sumpenalty' => '0.1000000',
 350              'manualcomment' => '',
 351              'manualcommentformat' => '1',
 352              'flagged' => '0',
 353          );
 354          $qstates = array(
 355              287 => (object) array(
 356                  'id' => '287',
 357                  'attempt' => '17',
 358                  'question' => '28',
 359                  'seq_number' => '0',
 360                  'answer' => '1-',
 361                  'timestamp' => '1306425757',
 362                  'event' => '0',
 363                  'grade' => '0.0000000',
 364                  'raw_grade' => '0.0000000',
 365                  'penalty' => '0.0000000',
 366              ),
 367              289 => (object) array(
 368                  'id' => '289',
 369                  'attempt' => '17',
 370                  'question' => '28',
 371                  'seq_number' => '1',
 372                  'answer' => '1-',
 373                  'timestamp' => '1306425757',
 374                  'event' => '6',
 375                  'grade' => '0.0000000',
 376                  'raw_grade' => '0.0000000',
 377                  'penalty' => '0.1000000',
 378              ),
 379          );
 380  
 381          $qa = $this->updater->convert_question_attempt($quiz, $attempt, $question, $qsession, $qstates);
 382  
 383          $expectedqa = (object) array(
 384              'behaviour' => 'adaptivenopenalty',
 385              'questionid' => 28,
 386              'variant' => 1,
 387              'maxmark' => 1.0000000,
 388              'minfraction' => 0,
 389              'maxfraction' => 1,
 390              'flagged' => 0,
 391              'questionsummary' => 'An answer _____.',
 392              'rightanswer' => 'part 1: frog',
 393              'responsesummary' => 'part 1: ',
 394              'timemodified' => 1306425757,
 395              'steps' => array(
 396                  0 => (object) array(
 397                      'sequencenumber' => 0,
 398                      'state' => 'todo',
 399                      'fraction' => null,
 400                      'timecreated' => 1306425757,
 401                      'userid' => 4,
 402                      'data' => array(),
 403                  ),
 404                  1 => (object) array(
 405                      'sequencenumber' => 1,
 406                      'state' => 'gradedwrong',
 407                      'fraction' => 0.0,
 408                      'timecreated' => 1306425757,
 409                      'userid' => 4,
 410                      'data' => array('-finish' => '1', '-_try' => '1', '-_rawfraction' => 0.0),
 411                  ),
 412              ),
 413          );
 414  
 415          $this->compare_qas($expectedqa, $qa);
 416      }
 417  
 418      public function test_multianswer_adaptivenopenalty_qsession108() {
 419          $quiz = (object) array(
 420              'id' => '5',
 421              'course' => '2',
 422              'name' => 'Multianswer quiz',
 423              'intro' => '',
 424              'introformat' => '1',
 425              'timeopen' => '0',
 426              'timeclose' => '0',
 427              'attempts' => '0',
 428              'attemptonlast' => '0',
 429              'grademethod' => '1',
 430              'decimalpoints' => '2',
 431              'questiondecimalpoints' => '-1',
 432              'review' => '4459503',
 433              'questionsperpage' => '1',
 434              'shufflequestions' => '0',
 435              'shuffleanswers' => '1',
 436              'sumgrades' => '14.00000',
 437              'grade' => '10.00000',
 438              'timecreated' => '0',
 439              'timemodified' => '1306424728',
 440              'timelimit' => '0',
 441              'password' => '',
 442              'subnet' => '',
 443              'popup' => '0',
 444              'delay1' => '0',
 445              'delay2' => '0',
 446              'showuserpicture' => '0',
 447              'showblocks' => '0',
 448              'preferredbehaviour' => 'adaptivenopenalty',
 449          );
 450          $attempt = (object) array(
 451              'id' => '18',
 452              'uniqueid' => '18',
 453              'quiz' => '5',
 454              'userid' => '3',
 455              'attempt' => '1',
 456              'sumgrades' => '10.40000',
 457              'timestart' => '1306425784',
 458              'timefinish' => '1306425931',
 459              'timemodified' => '1306425931',
 460              'layout' => '28,19,0',
 461              'preview' => '0',
 462          );
 463          $question = (object) array(
 464              'id' => '28',
 465              'category' => '2',
 466              'parent' => '0',
 467              'name' => 'Very simple cloze',
 468              'questiontext' => '<p>An answer {#1}.</p>',
 469              'questiontextformat' => '1',
 470              'generalfeedback' => '',
 471              'generalfeedbackformat' => '1',
 472              'penalty' => '0.1000000',
 473              'qtype' => 'multianswer',
 474              'length' => '1',
 475              'stamp' => 'tjh238.vledev2.open.ac.uk+110526154631+XQLcXi',
 476              'version' => 'tjh238.vledev2.open.ac.uk+110526154631+T8hPiI',
 477              'hidden' => '0',
 478              'timecreated' => '1306424791',
 479              'timemodified' => '1306424791',
 480              'createdby' => '2',
 481              'modifiedby' => '2',
 482              'maxmark' => '1.0000000',
 483              'options' => (object) array(
 484                  'questions' => array(
 485                      1 => (object) array(
 486                          'id' => '29',
 487                          'category' => '2',
 488                          'parent' => '28',
 489                          'name' => 'Very simple cloze',
 490                          'questiontext' => '{1:SHORTANSWER:=frog#Yay!}',
 491                          'questiontextformat' => '0',
 492                          'generalfeedback' => '',
 493                          'generalfeedbackformat' => '1',
 494                          'defaultgrade' => '1.0000000',
 495                          'penalty' => '0.0000000',
 496                          'qtype' => 'shortanswer',
 497                          'length' => '1',
 498                          'stamp' => 'tjh238.vledev2.open.ac.uk+110526154631+j3BYTL',
 499                          'version' => 'tjh238.vledev2.open.ac.uk+110526154631+lxNwQv',
 500                          'hidden' => '0',
 501                          'timecreated' => '1306424791',
 502                          'timemodified' => '1306424791',
 503                          'createdby' => '2',
 504                          'modifiedby' => '2',
 505                          'options' => (object) array(
 506                              'answers' => array(
 507                                  52 => (object) array(
 508                                      'id' => '52',
 509                                      'question' => '29',
 510                                      'answer' => 'frog',
 511                                      'answerformat' => '0',
 512                                      'fraction' => '1.0000000',
 513                                      'feedback' => 'Yay!',
 514                                      'feedbackformat' => '1',
 515                                  ),
 516                              ),
 517                              'usecase' => '0',
 518                          ),
 519                          'maxgrade' => '1.0000000',
 520                      ),
 521                  ),
 522              ),
 523              'defaultmark' => '1.0000000',
 524          );
 525          $qsession = (object) array(
 526              'id' => '108',
 527              'attemptid' => '18',
 528              'questionid' => '28',
 529              'newest' => '298',
 530              'newgraded' => '298',
 531              'sumpenalty' => '0.2000000',
 532              'manualcomment' => '',
 533              'manualcommentformat' => '1',
 534              'flagged' => '0',
 535          );
 536          $qstates = array(
 537              291 => (object) array(
 538                  'id' => '291',
 539                  'attempt' => '18',
 540                  'question' => '28',
 541                  'seq_number' => '0',
 542                  'answer' => '1-',
 543                  'timestamp' => '1306425784',
 544                  'event' => '0',
 545                  'grade' => '0.0000000',
 546                  'raw_grade' => '0.0000000',
 547                  'penalty' => '0.0000000',
 548              ),
 549              293 => (object) array(
 550                  'id' => '293',
 551                  'attempt' => '18',
 552                  'question' => '28',
 553                  'seq_number' => '1',
 554                  'answer' => '1-ds&#0044;&#0045;afg',
 555                  'timestamp' => '1306425801',
 556                  'event' => '2',
 557                  'grade' => '0.0000000',
 558                  'raw_grade' => '0.0000000',
 559                  'penalty' => '0.1000000',
 560              ),
 561              297 => (object) array(
 562                  'id' => '297',
 563                  'attempt' => '18',
 564                  'question' => '28',
 565                  'seq_number' => '2',
 566                  'answer' => '1-frog',
 567                  'timestamp' => '1306425917',
 568                  'event' => '3',
 569                  'grade' => '1.0000000',
 570                  'raw_grade' => '1.0000000',
 571                  'penalty' => '0.1000000',
 572              ),
 573              298 => (object) array(
 574                  'id' => '298',
 575                  'attempt' => '18',
 576                  'question' => '28',
 577                  'seq_number' => '3',
 578                  'answer' => '1-frog',
 579                  'timestamp' => '1306425917',
 580                  'event' => '6',
 581                  'grade' => '1.0000000',
 582                  'raw_grade' => '1.0000000',
 583                  'penalty' => '0.1000000',
 584              ),
 585          );
 586  
 587          $qa = $this->updater->convert_question_attempt($quiz, $attempt, $question, $qsession, $qstates);
 588  
 589          $expectedqa = (object) array(
 590              'behaviour' => 'adaptivenopenalty',
 591              'questionid' => 28,
 592              'variant' => 1,
 593              'maxmark' => 1.0000000,
 594              'minfraction' => 0,
 595              'maxfraction' => 1,
 596              'flagged' => 0,
 597              'questionsummary' => 'An answer _____.',
 598              'rightanswer' => 'part 1: frog',
 599              'responsesummary' => 'part 1: frog',
 600              'timemodified' => 1306425917,
 601              'steps' => array(
 602                  0 => (object) array(
 603                      'sequencenumber' => 0,
 604                      'state' => 'todo',
 605                      'fraction' => null,
 606                      'timecreated' => 1306425784,
 607                      'userid' => 3,
 608                      'data' => array(),
 609                  ),
 610                  1 => (object) array(
 611                      'sequencenumber' => 1,
 612                      'state' => 'complete',
 613                      'fraction' => null,
 614                      'timecreated' => 1306425801,
 615                      'userid' => 3,
 616                      'data' => array('sub1_answer' => 'ds,-afg'),
 617                  ),
 618                  2 => (object) array(
 619                      'sequencenumber' => 2,
 620                      'state' => 'complete',
 621                      'fraction' => 1,
 622                      'timecreated' => 1306425917,
 623                      'userid' => 3,
 624                      'data' => array('sub1_answer' => 'frog', '-_try' => 1,
 625                              '-_rawfraction' => 1.0, '-submit' => 1),
 626                  ),
 627                  3 => (object) array(
 628                      'sequencenumber' => 3,
 629                      'state' => 'gradedright',
 630                      'fraction' => 1,
 631                      'timecreated' => 1306425917,
 632                      'userid' => 3,
 633                      'data' => array('sub1_answer' => 'frog', '-_try' => 1,
 634                              '-_rawfraction' => 1.0, '-finish' => 1),
 635                  ),
 636              ),
 637          );
 638  
 639          $this->compare_qas($expectedqa, $qa);
 640      }
 641  
 642      public function test_multianswer_adaptivenopenalty_qsession105() {
 643          $quiz = (object) array(
 644              'id' => '5',
 645              'course' => '2',
 646              'name' => 'Multianswer quiz',
 647              'intro' => '',
 648              'introformat' => '1',
 649              'timeopen' => '0',
 650              'timeclose' => '0',
 651              'attempts' => '0',
 652              'attemptonlast' => '0',
 653              'grademethod' => '1',
 654              'decimalpoints' => '2',
 655              'questiondecimalpoints' => '-1',
 656              'review' => '4459503',
 657              'questionsperpage' => '1',
 658              'shufflequestions' => '0',
 659              'shuffleanswers' => '1',
 660              'sumgrades' => '14.00000',
 661              'grade' => '10.00000',
 662              'timecreated' => '0',
 663              'timemodified' => '1306424728',
 664              'timelimit' => '0',
 665              'password' => '',
 666              'subnet' => '',
 667              'popup' => '0',
 668              'delay1' => '0',
 669              'delay2' => '0',
 670              'showuserpicture' => '0',
 671              'showblocks' => '0',
 672              'preferredbehaviour' => 'adaptivenopenalty',
 673          );
 674          $attempt = (object) array(
 675              'id' => '16',
 676              'uniqueid' => '16',
 677              'quiz' => '5',
 678              'userid' => '4',
 679              'attempt' => '1',
 680              'sumgrades' => '6.00000',
 681              'timestart' => '1306425691',
 682              'timefinish' => '1306425746',
 683              'timemodified' => '1306425746',
 684              'layout' => '28,19,0',
 685              'preview' => '0',
 686          );
 687          $question = (object) array(
 688              'id' => '19',
 689              'category' => '2',
 690              'parent' => '0',
 691              'name' => 'Cloze',
 692              'questiontext' => '<p>This question consists of some text with an answer embedded right  here {#1}</p>
 693          <p>and right after that you will have to deal with this short answer  {#2}</p>
 694          <p>and finally we have a floating point number  {#3}.</p>
 695          <p>The  multichoice question can also be shown in the vertical  display of the standard moodle multiple choice. {#4}</p>
 696          <p>Or in an horizontal display that is included here in a table {#5}</p>
 697          <p>A shortanswer question where case must match. Write moodle in  upper case letters {#6}</p>
 698          <p>Note that addresses like www.moodle.org and smileys :-) all work as normal:</p>
 699          <p>a) How good is this? {#7}</p>
 700          <p>b) What grade would you give it? {#8}</p>',
 701              'questiontextformat' => '1',
 702              'generalfeedback' => '',
 703              'generalfeedbackformat' => '1',
 704              'penalty' => '0.1000000',
 705              'qtype' => 'multianswer',
 706              'length' => '1',
 707              'stamp' => 'tjh238.vledev2.open.ac.uk+110525164438+iwiint',
 708              'version' => 'tjh238.vledev2.open.ac.uk+110525164441+AAjnIy',
 709              'hidden' => '0',
 710              'timecreated' => '1306341878',
 711              'timemodified' => '1306341879',
 712              'createdby' => '2',
 713              'modifiedby' => '2',
 714              'maxmark' => '13.0000000',
 715              'options' => (object) array(
 716                  'questions' => array(
 717                      1 => (object) array(
 718                          'id' => '20',
 719                          'category' => '2',
 720                          'parent' => '19',
 721                          'name' => 'Cloze',
 722                          '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}',
 723                          'questiontextformat' => '0',
 724                          'generalfeedback' => '',
 725                          'generalfeedbackformat' => '1',
 726                          'defaultgrade' => '1.0000000',
 727                          'penalty' => '0.0000000',
 728                          'qtype' => 'multichoice',
 729                          'length' => '1',
 730                          'stamp' => 'tjh238.vledev2.open.ac.uk+110525164439+cAuJ4r',
 731                          'version' => 'tjh238.vledev2.open.ac.uk+110525164439+5bnnys',
 732                          'hidden' => '0',
 733                          'timecreated' => '1306341879',
 734                          'timemodified' => '1306341879',
 735                          'createdby' => '2',
 736                          'modifiedby' => '2',
 737                          'options' => (object) array(
 738                              'id' => '3',
 739                              'question' => '20',
 740                              'layout' => '0',
 741                              'answers' => array(
 742                                  29 => (object) array(
 743                                      'id' => '29',
 744                                      'question' => '20',
 745                                      'answer' => 'Wrong answer',
 746                                      'answerformat' => '1',
 747                                      'fraction' => '0.0000000',
 748                                      'feedback' => 'Feedback for this wrong answer',
 749                                      'feedbackformat' => '1',
 750                                  ),
 751                                  30 => (object) array(
 752                                      'id' => '30',
 753                                      'question' => '20',
 754                                      'answer' => 'Another  wrong answer',
 755                                      'answerformat' => '1',
 756                                      'fraction' => '0.0000000',
 757                                      'feedback' => 'Feedback for the other wrong answer',
 758                                      'feedbackformat' => '1',
 759                                  ),
 760                                  31 => (object) array(
 761                                      'id' => '31',
 762                                      'question' => '20',
 763                                      'answer' => 'Correct  answer',
 764                                      'answerformat' => '1',
 765                                      'fraction' => '1.0000000',
 766                                      'feedback' => 'Feedback for correct answer',
 767                                      'feedbackformat' => '1',
 768                                  ),
 769                                  32 => (object) array(
 770                                      'id' => '32',
 771                                      'question' => '20',
 772                                      'answer' => 'Answer that gives half the  credit',
 773                                      'answerformat' => '1',
 774                                      'fraction' => '0.5000000',
 775                                      'feedback' => 'Feedback for half credit answer',
 776                                      'feedbackformat' => '1',
 777                                  ),
 778                              ),
 779                              'single' => '1',
 780                              'shuffleanswers' => '1',
 781                              'correctfeedback' => '',
 782                              'correctfeedbackformat' => '1',
 783                              'partiallycorrectfeedback' => '',
 784                              'partiallycorrectfeedbackformat' => '1',
 785                              'incorrectfeedback' => '',
 786                              'incorrectfeedbackformat' => '1',
 787                              'answernumbering' => '0',
 788                          ),
 789                          'maxgrade' => '1.0000000',
 790                      ),
 791                      2 => (object) array(
 792                          'id' => '21',
 793                          'category' => '2',
 794                          'parent' => '19',
 795                          'name' => 'Cloze',
 796                          '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}',
 797                          'questiontextformat' => '0',
 798                          'generalfeedback' => '',
 799                          'generalfeedbackformat' => '1',
 800                          'defaultgrade' => '1.0000000',
 801                          'penalty' => '0.0000000',
 802                          'qtype' => 'shortanswer',
 803                          'length' => '1',
 804                          'stamp' => 'tjh238.vledev2.open.ac.uk+110525164440+EN6wCk',
 805                          'version' => 'tjh238.vledev2.open.ac.uk+110525164440+bQzatI',
 806                          'hidden' => '0',
 807                          'timecreated' => '1306341880',
 808                          'timemodified' => '1306341880',
 809                          'createdby' => '2',
 810                          'modifiedby' => '2',
 811                          'options' => (object) array(
 812                              'answers' => array(
 813                                  33 => (object) array(
 814                                      'id' => '33',
 815                                      'question' => '21',
 816                                      'answer' => 'Wrong answer',
 817                                      'answerformat' => '0',
 818                                      'fraction' => '0.0000000',
 819                                      'feedback' => 'Feedback for this wrong answer',
 820                                      'feedbackformat' => '1',
 821                                  ),
 822                                  34 => (object) array(
 823                                      'id' => '34',
 824                                      'question' => '21',
 825                                      'answer' => 'Correct  answer',
 826                                      'answerformat' => '0',
 827                                      'fraction' => '1.0000000',
 828                                      'feedback' => 'Feedback for correct answer',
 829                                      'feedbackformat' => '1',
 830                                  ),
 831                                  35 => (object) array(
 832                                      'id' => '35',
 833                                      'question' => '21',
 834                                      'answer' => 'Answer that gives half the  credit',
 835                                      'answerformat' => '0',
 836                                      'fraction' => '0.5000000',
 837                                      'feedback' => 'Feedback for half credit answer',
 838                                      'feedbackformat' => '1',
 839                                  ),
 840                              ),
 841                              'usecase' => '0',
 842                          ),
 843                          'maxgrade' => '1.0000000',
 844                      ),
 845                      3 => (object) array(
 846                          'id' => '22',
 847                          'category' => '2',
 848                          'parent' => '19',
 849                          'name' => 'Cloze',
 850                          '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}',
 851                          'questiontextformat' => '0',
 852                          'generalfeedback' => '',
 853                          'generalfeedbackformat' => '1',
 854                          'defaultgrade' => '2.0000000',
 855                          'penalty' => '0.0000000',
 856                          'qtype' => 'numerical',
 857                          'length' => '1',
 858                          'stamp' => 'tjh238.vledev2.open.ac.uk+110525164440+Xr29c2',
 859                          'version' => 'tjh238.vledev2.open.ac.uk+110525164441+QTwsGM',
 860                          'hidden' => '0',
 861                          'timecreated' => '1306341880',
 862                          'timemodified' => '1306341880',
 863                          'createdby' => '2',
 864                          'modifiedby' => '2',
 865                          'options' => (object) array(
 866                              'answers' => array(
 867                                  36 => (object) array(
 868                                      'id' => '36',
 869                                      'question' => '22',
 870                                      'answer' => '23.8',
 871                                      'answerformat' => '0',
 872                                      'fraction' => '1.0000000',
 873                                      'feedback' => 'Feedback for correct answer  23.8',
 874                                      'feedbackformat' => '1',
 875                                      'tolerance' => '0.1',
 876                                  ),
 877                                  37 => (object) array(
 878                                      'id' => '37',
 879                                      'question' => '22',
 880                                      'answer' => '23.8',
 881                                      'answerformat' => '0',
 882                                      'fraction' => '0.5000000',
 883                                      'feedback' => 'Feedback for half credit answer in the nearby region of  the correct answer',
 884                                      'feedbackformat' => '1',
 885                                      'tolerance' => '2',
 886                                  ),
 887                              ),
 888                              'units' => array(
 889                              ),
 890                              'unitgradingtype' => '0',
 891                              'unitpenalty' => '1.0000000',
 892                              'showunits' => '3',
 893                              'unitsleft' => '0',
 894                              'instructions' => '',
 895                              'instructionsformat' => '1',
 896                          ),
 897                          'maxgrade' => '2.0000000',
 898                      ),
 899                      4 => (object) array(
 900                          'id' => '23',
 901                          'category' => '2',
 902                          'parent' => '19',
 903                          'name' => 'Cloze',
 904                          '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}',
 905                          'questiontextformat' => '0',
 906                          'generalfeedback' => '',
 907                          'generalfeedbackformat' => '1',
 908                          'defaultgrade' => '2.0000000',
 909                          'penalty' => '0.0000000',
 910                          'qtype' => 'multichoice',
 911                          'length' => '1',
 912                          'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+7R55HA',
 913                          'version' => 'tjh238.vledev2.open.ac.uk+110525164441+uCMoQc',
 914                          'hidden' => '0',
 915                          'timecreated' => '1306341881',
 916                          'timemodified' => '1306341881',
 917                          'createdby' => '2',
 918                          'modifiedby' => '2',
 919                          'options' => (object) array(
 920                              'id' => '4',
 921                              'question' => '23',
 922                              'layout' => '1',
 923                              'answers' => array(
 924                                  38 => (object) array(
 925                                      'id' => '38',
 926                                      'question' => '23',
 927                                      'answer' => '1. Wrong answer',
 928                                      'answerformat' => '1',
 929                                      'fraction' => '0.0000000',
 930                                      'feedback' => 'Feedback for this wrong answer',
 931                                      'feedbackformat' => '1',
 932                                  ),
 933                                  39 => (object) array(
 934                                      'id' => '39',
 935                                      'question' => '23',
 936                                      'answer' => '2. Another wrong  answer',
 937                                      'answerformat' => '1',
 938                                      'fraction' => '0.0000000',
 939                                      'feedback' => 'Feedback for the other wrong answer',
 940                                      'feedbackformat' => '1',
 941                                  ),
 942                                  40 => (object) array(
 943                                      'id' => '40',
 944                                      'question' => '23',
 945                                      'answer' => '3. Correct answer',
 946                                      'answerformat' => '1',
 947                                      'fraction' => '1.0000000',
 948                                      'feedback' => 'Feedback  for correct answer',
 949                                      'feedbackformat' => '1',
 950                                  ),
 951                                  41 => (object) array(
 952                                      'id' => '41',
 953                                      'question' => '23',
 954                                      'answer' => '4. Answer that gives half the credit',
 955                                      'answerformat' => '1',
 956                                      'fraction' => '0.5000000',
 957                                      'feedback' => 'Feedback for  half credit answer',
 958                                      'feedbackformat' => '1',
 959                                  ),
 960                              ),
 961                              'single' => '1',
 962                              'shuffleanswers' => '1',
 963                              'correctfeedback' => '',
 964                              'correctfeedbackformat' => '1',
 965                              'partiallycorrectfeedback' => '',
 966                              'partiallycorrectfeedbackformat' => '1',
 967                              'incorrectfeedback' => '',
 968                              'incorrectfeedbackformat' => '1',
 969                              'answernumbering' => '0',
 970                          ),
 971                          'maxgrade' => '2.0000000',
 972                      ),
 973                      5 => (object) array(
 974                          'id' => '24',
 975                          'category' => '2',
 976                          'parent' => '19',
 977                          'name' => 'Cloze',
 978                          '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}',
 979                          'questiontextformat' => '0',
 980                          'generalfeedback' => '',
 981                          'generalfeedbackformat' => '1',
 982                          'defaultgrade' => '2.0000000',
 983                          'penalty' => '0.0000000',
 984                          'qtype' => 'multichoice',
 985                          'length' => '1',
 986                          'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+QGvRpd',
 987                          'version' => 'tjh238.vledev2.open.ac.uk+110525164441+03GsSs',
 988                          'hidden' => '0',
 989                          'timecreated' => '1306341881',
 990                          'timemodified' => '1306341881',
 991                          'createdby' => '2',
 992                          'modifiedby' => '2',
 993                          'options' => (object) array(
 994                              'id' => '5',
 995                              'question' => '24',
 996                              'layout' => '2',
 997                              'answers' => array(
 998                                  42 => (object) array(
 999                                      'id' => '42',
1000                                      'question' => '24',
1001                                      'answer' => 'a. Wrong answer',
1002                                      'answerformat' => '1',
1003                                      'fraction' => '0.0000000',
1004                                      'feedback' => 'Feedback for this wrong answer',
1005                                      'feedbackformat' => '1',
1006                                  ),
1007                                  43 => (object) array(
1008                                      'id' => '43',
1009                                      'question' => '24',
1010                                      'answer' => 'b. Another wrong  answer',
1011                                      'answerformat' => '1',
1012                                      'fraction' => '0.0000000',
1013                                      'feedback' => 'Feedback for the other wrong answer',
1014                                      'feedbackformat' => '1',
1015                                  ),
1016                                  44 => (object) array(
1017                                      'id' => '44',
1018                                      'question' => '24',
1019                                      'answer' => 'c. Correct answer',
1020                                      'answerformat' => '1',
1021                                      'fraction' => '1.0000000',
1022                                      'feedback' => 'Feedback  for correct answer',
1023                                      'feedbackformat' => '1',
1024                                  ),
1025                                  45 => (object) array(
1026                                      'id' => '45',
1027                                      'question' => '24',
1028                                      'answer' => 'd. Answer that gives half the credit',
1029                                      'answerformat' => '1',
1030                                      'fraction' => '0.5000000',
1031                                      'feedback' => 'Feedback for  half credit answer',
1032                                      'feedbackformat' => '1',
1033                                  ),
1034                              ),
1035                              'single' => '1',
1036                              'shuffleanswers' => '1',
1037                              'correctfeedback' => '',
1038                              'correctfeedbackformat' => '1',
1039                              'partiallycorrectfeedback' => '',
1040                              'partiallycorrectfeedbackformat' => '1',
1041                              'incorrectfeedback' => '',
1042                              'incorrectfeedbackformat' => '1',
1043                              'answernumbering' => '0',
1044                          ),
1045                          'maxgrade' => '2.0000000',
1046                      ),
1047                      6 => (object) array(
1048                          'id' => '25',
1049                          'category' => '2',
1050                          'parent' => '19',
1051                          'name' => 'Cloze',
1052                          '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}',
1053                          'questiontextformat' => '0',
1054                          'generalfeedback' => '',
1055                          'generalfeedbackformat' => '1',
1056                          'defaultgrade' => '1.0000000',
1057                          'penalty' => '0.0000000',
1058                          'qtype' => 'shortanswer',
1059                          'length' => '1',
1060                          'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+n9ETJC',
1061                          'version' => 'tjh238.vledev2.open.ac.uk+110525164441+Bvqo6c',
1062                          'hidden' => '0',
1063                          'timecreated' => '1306341881',
1064                          'timemodified' => '1306341881',
1065                          'createdby' => '2',
1066                          'modifiedby' => '2',
1067                          'options' => (object) array(
1068                              'answers' => array(
1069                                  46 => (object) array(
1070                                      'id' => '46',
1071                                      'question' => '25',
1072                                      'answer' => 'moodle',
1073                                      'answerformat' => '0',
1074                                      'fraction' => '0.0000000',
1075                                      'feedback' => 'Feedback for moodle in lower  case',
1076                                      'feedbackformat' => '1',
1077                                  ),
1078                                  47 => (object) array(
1079                                      'id' => '47',
1080                                      'question' => '25',
1081                                      'answer' => 'MOODLE',
1082                                      'answerformat' => '0',
1083                                      'fraction' => '1.0000000',
1084                                      'feedback' => 'Feedback for MOODLE in upper case',
1085                                      'feedbackformat' => '1',
1086                                  ),
1087                                  48 => (object) array(
1088                                      'id' => '48',
1089                                      'question' => '25',
1090                                      'answer' => 'Moodle',
1091                                      'answerformat' => '0',
1092                                      'fraction' => '0.5000000',
1093                                      'feedback' => 'Feedback for  only first letter in upper case',
1094                                      'feedbackformat' => '1',
1095                                  ),
1096                              ),
1097                              'usecase' => '1',
1098                          ),
1099                          'maxgrade' => '1.0000000',
1100                      ),
1101                      7 => (object) array(
1102                          'id' => '26',
1103                          'category' => '2',
1104                          'parent' => '19',
1105                          'name' => 'Cloze',
1106                          'questiontext' => '{:MULTICHOICE:=Yes#Correct~No#We have a different opinion}',
1107                          'questiontextformat' => '0',
1108                          'generalfeedback' => '',
1109                          'generalfeedbackformat' => '1',
1110                          'defaultgrade' => '1.0000000',
1111                          'penalty' => '0.0000000',
1112                          'qtype' => 'multichoice',
1113                          'length' => '1',
1114                          'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+0YjnZ7',
1115                          'version' => 'tjh238.vledev2.open.ac.uk+110525164441+1giLRX',
1116                          'hidden' => '0',
1117                          'timecreated' => '1306341881',
1118                          'timemodified' => '1306341881',
1119                          'createdby' => '2',
1120                          'modifiedby' => '2',
1121                          'options' => (object) array(
1122                              'id' => '6',
1123                              'question' => '26',
1124                              'layout' => '0',
1125                              'answers' => array(
1126                                  49 => (object) array(
1127                                      'id' => '49',
1128                                      'question' => '26',
1129                                      'answer' => 'Yes',
1130                                      'answerformat' => '1',
1131                                      'fraction' => '1.0000000',
1132                                      'feedback' => 'Correct',
1133                                      'feedbackformat' => '1',
1134                                  ),
1135                                  50 => (object) array(
1136                                      'id' => '50',
1137                                      'question' => '26',
1138                                      'answer' => 'No',
1139                                      'answerformat' => '1',
1140                                      'fraction' => '0.0000000',
1141                                      'feedback' => 'We have a different opinion',
1142                                      'feedbackformat' => '1',
1143                                  ),
1144                              ),
1145                              'single' => '1',
1146                              'shuffleanswers' => '1',
1147                              'correctfeedback' => '',
1148                              'correctfeedbackformat' => '1',
1149                              'partiallycorrectfeedback' => '',
1150                              'partiallycorrectfeedbackformat' => '1',
1151                              'incorrectfeedback' => '',
1152                              'incorrectfeedbackformat' => '1',
1153                              'answernumbering' => '0',
1154                          ),
1155                          'maxgrade' => '1.0000000',
1156                      ),
1157                      8 => (object) array(
1158                          'id' => '27',
1159                          'category' => '2',
1160                          'parent' => '19',
1161                          'name' => 'Cloze',
1162                          'questiontext' => '{3:NUMERICAL:=3:2}',
1163                          'questiontextformat' => '0',
1164                          'generalfeedback' => '',
1165                          'generalfeedbackformat' => '1',
1166                          'defaultgrade' => '3.0000000',
1167                          'penalty' => '0.0000000',
1168                          'qtype' => 'numerical',
1169                          'length' => '1',
1170                          'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+glbCBN',
1171                          'version' => 'tjh238.vledev2.open.ac.uk+110525164441+xWusxR',
1172                          'hidden' => '0',
1173                          'timecreated' => '1306341881',
1174                          'timemodified' => '1306341881',
1175                          'createdby' => '2',
1176                          'modifiedby' => '2',
1177                          'options' => (object) array(
1178                              'answers' => array(
1179                                  51 => (object) array(
1180                                      'id' => '51',
1181                                      'question' => '27',
1182                                      'answer' => '3',
1183                                      'answerformat' => '0',
1184                                      'fraction' => '1.0000000',
1185                                      'feedback' => '',
1186                                      'feedbackformat' => '1',
1187                                      'tolerance' => '2',
1188                                  ),
1189                              ),
1190                              'units' => array(
1191                              ),
1192                              'unitgradingtype' => '0',
1193                              'unitpenalty' => '1.0000000',
1194                              'showunits' => '3',
1195                              'unitsleft' => '0',
1196                              'instructions' => '',
1197                              'instructionsformat' => '1',
1198                          ),
1199                          'maxgrade' => '3.0000000',
1200                      ),
1201                  ),
1202              ),
1203              'defaultmark' => '13.0000000',
1204          );
1205          $qsession = (object) array(
1206              'id' => '105',
1207              'attemptid' => '16',
1208              'questionid' => '19',
1209              'newest' => '286',
1210              'newgraded' => '286',
1211              'sumpenalty' => '2.6000000',
1212              'manualcomment' => '',
1213              'manualcommentformat' => '1',
1214              'flagged' => '0',
1215          );
1216          $qstates = array(
1217              282 => (object) array(
1218                  'id' => '282',
1219                  'attempt' => '16',
1220                  'question' => '19',
1221                  'seq_number' => '0',
1222                  'answer' => '1-,2-,3-,4-,5-,6-,7-,8-',
1223                  'timestamp' => '1306425691',
1224                  'event' => '0',
1225                  'grade' => '0.0000000',
1226                  'raw_grade' => '0.0000000',
1227                  'penalty' => '0.0000000',
1228              ),
1229              284 => (object) array(
1230                  'id' => '284',
1231                  'attempt' => '16',
1232                  'question' => '19',
1233                  'seq_number' => '1',
1234                  'answer' => '1-31,2-dsf,3-sadf,4-39,5-44,6-MOODLE,7-49,8-100%',
1235                  'timestamp' => '1306425739',
1236                  'event' => '3',
1237                  'grade' => '5.0000000',
1238                  'raw_grade' => '5.0000000',
1239                  'penalty' => '1.3000000',
1240              ),
1241              286 => (object) array(
1242                  'id' => '286',
1243                  'attempt' => '16',
1244                  'question' => '19',
1245                  'seq_number' => '2',
1246                  'answer' => '1-31,2-dsf,3-sadf,4-39,5-44,6-MOODLE,7-49,8-100%',
1247                  'timestamp' => '1306425739',
1248                  'event' => '6',
1249                  'grade' => '5.0000000',
1250                  'raw_grade' => '5.0000000',
1251                  'penalty' => '1.3000000',
1252              ),
1253          );
1254  
1255          $qa = $this->updater->convert_question_attempt($quiz, $attempt, $question, $qsession, $qstates);
1256  
1257          $expectedqa = (object) array(
1258              'behaviour' => 'adaptivenopenalty',
1259              'questionid' => '19',
1260              'variant' => 1,
1261              'maxmark' => '13.0000000',
1262              'minfraction' => 0,
1263              'maxfraction' => 1,
1264              'flagged' => 0,
1265              '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}
1266  
1267  and right after that you will have to deal with this short answer _____
1268  
1269  and finally we have a floating point number _____.
1270  
1271  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}
1272  
1273  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}
1274  
1275  A shortanswer question where case must match. Write moodle in upper case letters _____
1276  
1277  Note that addresses like www.moodle.org and smileys :-) all work as normal:
1278  
1279  a) How good is this? {Yes; No}
1280  
1281  b) What grade would you give it? _____',
1282              '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',
1283              '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%',
1284              'timemodified' => '1306425739',
1285              'steps' => array(
1286                  0 => (object) array(
1287                      'data' => array('_sub1_order' => '29,30,31,32',
1288                          '_sub3_separators' => '.$,', '_sub4_order' => '38,39,40,41',
1289                          '_sub5_order' => '42,43,44,45', '_sub7_order' => '49,50',
1290                          '_sub8_separators' => '.$,'),
1291                      'fraction' => null,
1292                      'timecreated' => 1306425691,
1293                      'userid' => 4,
1294                      'state' => 'todo',
1295                      'sequencenumber' => 0,
1296                  ),
1297                  1 => (object) array(
1298                      'data' => array('sub1_answer' => 2, 'sub2_answer' => 'dsf',
1299                          'sub3_answer' => 'sadf', 'sub4_answer' => 1,
1300                          'sub5_answer' => 2, 'sub6_answer' => 'MOODLE',
1301                          'sub7_answer' => 0, 'sub8_answer' => '100%', '-_try' => 1,
1302                          '-_rawfraction' => 0.38461538461538466, '-submit' => 1),
1303                      'fraction' => 0.38461538461538466,
1304                      'timecreated' => '1306425739',
1305                      'userid' => '4',
1306                      'state' => 'todo',
1307                      'sequencenumber' => 1,
1308                  ),
1309                  2 => (object) array(
1310                      'data' => array('sub1_answer' => 2, 'sub2_answer' => 'dsf',
1311                          'sub3_answer' => 'sadf', 'sub4_answer' => 1,
1312                          'sub5_answer' => 2, 'sub6_answer' => 'MOODLE',
1313                          'sub7_answer' => 0, 'sub8_answer' => '100%', '-finish' => 1,
1314                          '-_try' => 1, '-_rawfraction' => 0.38461538461538466),
1315                      'fraction' => 0.38461538461538466,
1316                      'timecreated' => '1306425739',
1317                      'userid' => '4',
1318                      'state' => 'gradedpartial',
1319                      'sequencenumber' => 2,
1320                  ),
1321              ),
1322          );
1323  
1324          $this->compare_qas($expectedqa, $qa);
1325      }
1326  
1327      public function test_multianswer_adaptivenopenalty_qsession107() {
1328          $quiz = (object) array(
1329              'id' => '5',
1330              'course' => '2',
1331              'name' => 'Multianswer quiz',
1332              'intro' => '',
1333              'introformat' => '1',
1334              'timeopen' => '0',
1335              'timeclose' => '0',
1336              'attempts' => '0',
1337              'attemptonlast' => '0',
1338              'grademethod' => '1',
1339              'decimalpoints' => '2',
1340              'questiondecimalpoints' => '-1',
1341              'review' => '4459503',
1342              'questionsperpage' => '1',
1343              'shufflequestions' => '0',
1344              'shuffleanswers' => '1',
1345              'sumgrades' => '14.00000',
1346              'grade' => '10.00000',
1347              'timecreated' => '0',
1348              'timemodified' => '1306424728',
1349              'timelimit' => '0',
1350              'password' => '',
1351              'subnet' => '',
1352              'popup' => '0',
1353              'delay1' => '0',
1354              'delay2' => '0',
1355              'showuserpicture' => '0',
1356              'showblocks' => '0',
1357              'preferredbehaviour' => 'adaptivenopenalty',
1358          );
1359          $attempt = (object) array(
1360              'id' => '17',
1361              'uniqueid' => '17',
1362              'quiz' => '5',
1363              'userid' => '4',
1364              'attempt' => '2',
1365              'sumgrades' => '0.00000',
1366              'timestart' => '1306425757',
1367              'timefinish' => '1306425762',
1368              'timemodified' => '1306425762',
1369              'layout' => '28,19,0',
1370              'preview' => '0',
1371          );
1372          $question = (object) array(
1373              'id' => '19',
1374              'category' => '2',
1375              'parent' => '0',
1376              'name' => 'Cloze',
1377              'questiontext' => '<p>This question consists of some text with an answer embedded right  here {#1}</p>
1378          <p>and right after that you will have to deal with this short answer  {#2}</p>
1379          <p>and finally we have a floating point number  {#3}.</p>
1380          <p>The  multichoice question can also be shown in the vertical  display of the standard moodle multiple choice. {#4}</p>
1381          <p>Or in an horizontal display that is included here in a table {#5}</p>
1382          <p>A shortanswer question where case must match. Write moodle in  upper case letters {#6}</p>
1383          <p>Note that addresses like www.moodle.org and smileys :-) all work as normal:</p>
1384          <p>a) How good is this? {#7}</p>
1385          <p>b) What grade would you give it? {#8}</p>',
1386              'questiontextformat' => '1',
1387              'generalfeedback' => '',
1388              'generalfeedbackformat' => '1',
1389              'penalty' => '0.1000000',
1390              'qtype' => 'multianswer',
1391              'length' => '1',
1392              'stamp' => 'tjh238.vledev2.open.ac.uk+110525164438+iwiint',
1393              'version' => 'tjh238.vledev2.open.ac.uk+110525164441+AAjnIy',
1394              'hidden' => '0',
1395              'timecreated' => '1306341878',
1396              'timemodified' => '1306341879',
1397              'createdby' => '2',
1398              'modifiedby' => '2',
1399              'maxmark' => '13.0000000',
1400              'options' => (object) array(
1401                  'questions' => array(
1402                      1 => (object) array(
1403                          'id' => '20',
1404                          'category' => '2',
1405                          'parent' => '19',
1406                          'name' => 'Cloze',
1407                          '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}',
1408                          'questiontextformat' => '0',
1409                          'generalfeedback' => '',
1410                          'generalfeedbackformat' => '1',
1411                          'defaultgrade' => '1.0000000',
1412                          'penalty' => '0.0000000',
1413                          'qtype' => 'multichoice',
1414                          'length' => '1',
1415                          'stamp' => 'tjh238.vledev2.open.ac.uk+110525164439+cAuJ4r',
1416                          'version' => 'tjh238.vledev2.open.ac.uk+110525164439+5bnnys',
1417                          'hidden' => '0',
1418                          'timecreated' => '1306341879',
1419                          'timemodified' => '1306341879',
1420                          'createdby' => '2',
1421                          'modifiedby' => '2',
1422                          'options' => (object) array(
1423                              'id' => '3',
1424                              'question' => '20',
1425                              'layout' => '0',
1426                              'answers' => array(
1427                                  29 => (object) array(
1428                                      'id' => '29',
1429                                      'question' => '20',
1430                                      'answer' => 'Wrong answer',
1431                                      'answerformat' => '1',
1432                                      'fraction' => '0.0000000',
1433                                      'feedback' => 'Feedback for this wrong answer',
1434                                      'feedbackformat' => '1',
1435                                  ),
1436                                  30 => (object) array(
1437                                      'id' => '30',
1438                                      'question' => '20',
1439                                      'answer' => 'Another  wrong answer',
1440                                      'answerformat' => '1',
1441                                      'fraction' => '0.0000000',
1442                                      'feedback' => 'Feedback for the other wrong answer',
1443                                      'feedbackformat' => '1',
1444                                  ),
1445                                  31 => (object) array(
1446                                      'id' => '31',
1447                                      'question' => '20',
1448                                      'answer' => 'Correct  answer',
1449                                      'answerformat' => '1',
1450                                      'fraction' => '1.0000000',
1451                                      'feedback' => 'Feedback for correct answer',
1452                                      'feedbackformat' => '1',
1453                                  ),
1454                                  32 => (object) array(
1455                                      'id' => '32',
1456                                      'question' => '20',
1457                                      'answer' => 'Answer that gives half the  credit',
1458                                      'answerformat' => '1',
1459                                      'fraction' => '0.5000000',
1460                                      'feedback' => 'Feedback for half credit answer',
1461                                      'feedbackformat' => '1',
1462                                  ),
1463                              ),
1464                              'single' => '1',
1465                              'shuffleanswers' => '1',
1466                              'correctfeedback' => '',
1467                              'correctfeedbackformat' => '1',
1468                              'partiallycorrectfeedback' => '',
1469                              'partiallycorrectfeedbackformat' => '1',
1470                              'incorrectfeedback' => '',
1471                              'incorrectfeedbackformat' => '1',
1472                              'answernumbering' => '0',
1473                          ),
1474                          'maxgrade' => '1.0000000',
1475                      ),
1476                      2 => (object) array(
1477                          'id' => '21',
1478                          'category' => '2',
1479                          'parent' => '19',
1480                          'name' => 'Cloze',
1481                          '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}',
1482                          'questiontextformat' => '0',
1483                          'generalfeedback' => '',
1484                          'generalfeedbackformat' => '1',
1485                          'defaultgrade' => '1.0000000',
1486                          'penalty' => '0.0000000',
1487                          'qtype' => 'shortanswer',
1488                          'length' => '1',
1489                          'stamp' => 'tjh238.vledev2.open.ac.uk+110525164440+EN6wCk',
1490                          'version' => 'tjh238.vledev2.open.ac.uk+110525164440+bQzatI',
1491                          'hidden' => '0',
1492                          'timecreated' => '1306341880',
1493                          'timemodified' => '1306341880',
1494                          'createdby' => '2',
1495                          'modifiedby' => '2',
1496                          'options' => (object) array(
1497                              'answers' => array(
1498                                  33 => (object) array(
1499                                      'id' => '33',
1500                                      'question' => '21',
1501                                      'answer' => 'Wrong answer',
1502                                      'answerformat' => '0',
1503                                      'fraction' => '0.0000000',
1504                                      'feedback' => 'Feedback for this wrong answer',
1505                                      'feedbackformat' => '1',
1506                                  ),
1507                                  34 => (object) array(
1508                                      'id' => '34',
1509                                      'question' => '21',
1510                                      'answer' => 'Correct  answer',
1511                                      'answerformat' => '0',
1512                                      'fraction' => '1.0000000',
1513                                      'feedback' => 'Feedback for correct answer',
1514                                      'feedbackformat' => '1',
1515                                  ),
1516                                  35 => (object) array(
1517                                      'id' => '35',
1518                                      'question' => '21',
1519                                      'answer' => 'Answer that gives half the  credit',
1520                                      'answerformat' => '0',
1521                                      'fraction' => '0.5000000',
1522                                      'feedback' => 'Feedback for half credit answer',
1523                                      'feedbackformat' => '1',
1524                                  ),
1525                              ),
1526                              'usecase' => '0',
1527                          ),
1528                          'maxgrade' => '1.0000000',
1529                      ),
1530                      3 => (object) array(
1531                          'id' => '22',
1532                          'category' => '2',
1533                          'parent' => '19',
1534                          'name' => 'Cloze',
1535                          '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}',
1536                          'questiontextformat' => '0',
1537                          'generalfeedback' => '',
1538                          'generalfeedbackformat' => '1',
1539                          'defaultgrade' => '2.0000000',
1540                          'penalty' => '0.0000000',
1541                          'qtype' => 'numerical',
1542                          'length' => '1',
1543                          'stamp' => 'tjh238.vledev2.open.ac.uk+110525164440+Xr29c2',
1544                          'version' => 'tjh238.vledev2.open.ac.uk+110525164441+QTwsGM',
1545                          'hidden' => '0',
1546                          'timecreated' => '1306341880',
1547                          'timemodified' => '1306341880',
1548                          'createdby' => '2',
1549                          'modifiedby' => '2',
1550                          'options' => (object) array(
1551                              'answers' => array(
1552                                  36 => (object) array(
1553                                      'id' => '36',
1554                                      'question' => '22',
1555                                      'answer' => '23.8',
1556                                      'answerformat' => '0',
1557                                      'fraction' => '1.0000000',
1558                                      'feedback' => 'Feedback for correct answer  23.8',
1559                                      'feedbackformat' => '1',
1560                                      'tolerance' => '0.1',
1561                                  ),
1562                                  37 => (object) array(
1563                                      'id' => '37',
1564                                      'question' => '22',
1565                                      'answer' => '23.8',
1566                                      'answerformat' => '0',
1567                                      'fraction' => '0.5000000',
1568                                      'feedback' => 'Feedback for half credit answer in the nearby region of  the correct answer',
1569                                      'feedbackformat' => '1',
1570                                      'tolerance' => '2',
1571                                  ),
1572                              ),
1573                              'units' => array(
1574                              ),
1575                              'unitgradingtype' => '0',
1576                              'unitpenalty' => '1.0000000',
1577                              'showunits' => '3',
1578                              'unitsleft' => '0',
1579                              'instructions' => '',
1580                              'instructionsformat' => '1',
1581                          ),
1582                          'maxgrade' => '2.0000000',
1583                      ),
1584                      4 => (object) array(
1585                          'id' => '23',
1586                          'category' => '2',
1587                          'parent' => '19',
1588                          'name' => 'Cloze',
1589                          '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}',
1590                          'questiontextformat' => '0',
1591                          'generalfeedback' => '',
1592                          'generalfeedbackformat' => '1',
1593                          'defaultgrade' => '2.0000000',
1594                          'penalty' => '0.0000000',
1595                          'qtype' => 'multichoice',
1596                          'length' => '1',
1597                          'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+7R55HA',
1598                          'version' => 'tjh238.vledev2.open.ac.uk+110525164441+uCMoQc',
1599                          'hidden' => '0',
1600                          'timecreated' => '1306341881',
1601                          'timemodified' => '1306341881',
1602                          'createdby' => '2',
1603                          'modifiedby' => '2',
1604                          'options' => (object) array(
1605                              'id' => '4',
1606                              'question' => '23',
1607                              'layout' => '1',
1608                              'answers' => array(
1609                                  38 => (object) array(
1610                                      'id' => '38',
1611                                      'question' => '23',
1612                                      'answer' => '1. Wrong answer',
1613                                      'answerformat' => '1',
1614                                      'fraction' => '0.0000000',
1615                                      'feedback' => 'Feedback for this wrong answer',
1616                                      'feedbackformat' => '1',
1617                                  ),
1618                                  39 => (object) array(
1619                                      'id' => '39',
1620                                      'question' => '23',
1621                                      'answer' => '2. Another wrong  answer',
1622                                      'answerformat' => '1',
1623                                      'fraction' => '0.0000000',
1624                                      'feedback' => 'Feedback for the other wrong answer',
1625                                      'feedbackformat' => '1',
1626                                  ),
1627                                  40 => (object) array(
1628                                      'id' => '40',
1629                                      'question' => '23',
1630                                      'answer' => '3. Correct answer',
1631                                      'answerformat' => '1',
1632                                      'fraction' => '1.0000000',
1633                                      'feedback' => 'Feedback  for correct answer',
1634                                      'feedbackformat' => '1',
1635                                  ),
1636                                  41 => (object) array(
1637                                      'id' => '41',
1638                                      'question' => '23',
1639                                      'answer' => '4. Answer that gives half the credit',
1640                                      'answerformat' => '1',
1641                                      'fraction' => '0.5000000',
1642                                      'feedback' => 'Feedback for  half credit answer',
1643                                      'feedbackformat' => '1',
1644                                  ),
1645                              ),
1646                              'single' => '1',
1647                              'shuffleanswers' => '1',
1648                              'correctfeedback' => '',
1649                              'correctfeedbackformat' => '1',
1650                              'partiallycorrectfeedback' => '',
1651                              'partiallycorrectfeedbackformat' => '1',
1652                              'incorrectfeedback' => '',
1653                              'incorrectfeedbackformat' => '1',
1654                              'answernumbering' => '0',
1655                          ),
1656                          'maxgrade' => '2.0000000',
1657                      ),
1658                      5 => (object) array(
1659                          'id' => '24',
1660                          'category' => '2',
1661                          'parent' => '19',
1662                          'name' => 'Cloze',
1663                          '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}',
1664                          'questiontextformat' => '0',
1665                          'generalfeedback' => '',
1666                          'generalfeedbackformat' => '1',
1667                          'defaultgrade' => '2.0000000',
1668                          'penalty' => '0.0000000',
1669                          'qtype' => 'multichoice',
1670                          'length' => '1',
1671                          'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+QGvRpd',
1672                          'version' => 'tjh238.vledev2.open.ac.uk+110525164441+03GsSs',
1673                          'hidden' => '0',
1674                          'timecreated' => '1306341881',
1675                          'timemodified' => '1306341881',
1676                          'createdby' => '2',
1677                          'modifiedby' => '2',
1678                          'options' => (object) array(
1679                              'id' => '5',
1680                              'question' => '24',
1681                              'layout' => '2',
1682                              'answers' => array(
1683                                  42 => (object) array(
1684                                      'id' => '42',
1685                                      'question' => '24',
1686                                      'answer' => 'a. Wrong answer',
1687                                      'answerformat' => '1',
1688                                      'fraction' => '0.0000000',
1689                                      'feedback' => 'Feedback for this wrong answer',
1690                                      'feedbackformat' => '1',
1691                                  ),
1692                                  43 => (object) array(
1693                                      'id' => '43',
1694                                      'question' => '24',
1695                                      'answer' => 'b. Another wrong  answer',
1696                                      'answerformat' => '1',
1697                                      'fraction' => '0.0000000',
1698                                      'feedback' => 'Feedback for the other wrong answer',
1699                                      'feedbackformat' => '1',
1700                                  ),
1701                                  44 => (object) array(
1702                                      'id' => '44',
1703                                      'question' => '24',
1704                                      'answer' => 'c. Correct answer',
1705                                      'answerformat' => '1',
1706                                      'fraction' => '1.0000000',
1707                                      'feedback' => 'Feedback  for correct answer',
1708                                      'feedbackformat' => '1',
1709                                  ),
1710                                  45 => (object) array(
1711                                      'id' => '45',
1712                                      'question' => '24',
1713                                      'answer' => 'd. Answer that gives half the credit',
1714                                      'answerformat' => '1',
1715                                      'fraction' => '0.5000000',
1716                                      'feedback' => 'Feedback for  half credit answer',
1717                                      'feedbackformat' => '1',
1718                                  ),
1719                              ),
1720                              'single' => '1',
1721                              'shuffleanswers' => '1',
1722                              'correctfeedback' => '',
1723                              'correctfeedbackformat' => '1',
1724                              'partiallycorrectfeedback' => '',
1725                              'partiallycorrectfeedbackformat' => '1',
1726                              'incorrectfeedback' => '',
1727                              'incorrectfeedbackformat' => '1',
1728                              'answernumbering' => '0',
1729                          ),
1730                          'maxgrade' => '2.0000000',
1731                      ),
1732                      6 => (object) array(
1733                          'id' => '25',
1734                          'category' => '2',
1735                          'parent' => '19',
1736                          'name' => 'Cloze',
1737                          '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}',
1738                          'questiontextformat' => '0',
1739                          'generalfeedback' => '',
1740                          'generalfeedbackformat' => '1',
1741                          'defaultgrade' => '1.0000000',
1742                          'penalty' => '0.0000000',
1743                          'qtype' => 'shortanswer',
1744                          'length' => '1',
1745                          'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+n9ETJC',
1746                          'version' => 'tjh238.vledev2.open.ac.uk+110525164441+Bvqo6c',
1747                          'hidden' => '0',
1748                          'timecreated' => '1306341881',
1749                          'timemodified' => '1306341881',
1750                          'createdby' => '2',
1751                          'modifiedby' => '2',
1752                          'options' => (object) array(
1753                              'answers' => array(
1754                                  46 => (object) array(
1755                                      'id' => '46',
1756                                      'question' => '25',
1757                                      'answer' => 'moodle',
1758                                      'answerformat' => '0',
1759                                      'fraction' => '0.0000000',
1760                                      'feedback' => 'Feedback for moodle in lower  case',
1761                                      'feedbackformat' => '1',
1762                                  ),
1763                                  47 => (object) array(
1764                                      'id' => '47',
1765                                      'question' => '25',
1766                                      'answer' => 'MOODLE',
1767                                      'answerformat' => '0',
1768                                      'fraction' => '1.0000000',
1769                                      'feedback' => 'Feedback for MOODLE in upper case',
1770                                      'feedbackformat' => '1',
1771                                  ),
1772                                  48 => (object) array(
1773                                      'id' => '48',
1774                                      'question' => '25',
1775                                      'answer' => 'Moodle',
1776                                      'answerformat' => '0',
1777                                      'fraction' => '0.5000000',
1778                                      'feedback' => 'Feedback for  only first letter in upper case',
1779                                      'feedbackformat' => '1',
1780                                  ),
1781                              ),
1782                              'usecase' => '1',
1783                          ),
1784                          'maxgrade' => '1.0000000',
1785                      ),
1786                      7 => (object) array(
1787                          'id' => '26',
1788                          'category' => '2',
1789                          'parent' => '19',
1790                          'name' => 'Cloze',
1791                          'questiontext' => '{:MULTICHOICE:=Yes#Correct~No#We have a different opinion}',
1792                          'questiontextformat' => '0',
1793                          'generalfeedback' => '',
1794                          'generalfeedbackformat' => '1',
1795                          'defaultgrade' => '1.0000000',
1796                          'penalty' => '0.0000000',
1797                          'qtype' => 'multichoice',
1798                          'length' => '1',
1799                          'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+0YjnZ7',
1800                          'version' => 'tjh238.vledev2.open.ac.uk+110525164441+1giLRX',
1801                          'hidden' => '0',
1802                          'timecreated' => '1306341881',
1803                          'timemodified' => '1306341881',
1804                          'createdby' => '2',
1805                          'modifiedby' => '2',
1806                          'options' => (object) array(
1807                              'id' => '6',
1808                              'question' => '26',
1809                              'layout' => '0',
1810                              'answers' => array(
1811                                  49 => (object) array(
1812                                      'id' => '49',
1813                                      'question' => '26',
1814                                      'answer' => 'Yes',
1815                                      'answerformat' => '1',
1816                                      'fraction' => '1.0000000',
1817                                      'feedback' => 'Correct',
1818                                      'feedbackformat' => '1',
1819                                  ),
1820                                  50 => (object) array(
1821                                      'id' => '50',
1822                                      'question' => '26',
1823                                      'answer' => 'No',
1824                                      'answerformat' => '1',
1825                                      'fraction' => '0.0000000',
1826                                      'feedback' => 'We have a different opinion',
1827                                      'feedbackformat' => '1',
1828                                  ),
1829                              ),
1830                              'single' => '1',
1831                              'shuffleanswers' => '1',
1832                              'correctfeedback' => '',
1833                              'correctfeedbackformat' => '1',
1834                              'partiallycorrectfeedback' => '',
1835                              'partiallycorrectfeedbackformat' => '1',
1836                              'incorrectfeedback' => '',
1837                              'incorrectfeedbackformat' => '1',
1838                              'answernumbering' => '0',
1839                          ),
1840                          'maxgrade' => '1.0000000',
1841                      ),
1842                      8 => (object) array(
1843                          'id' => '27',
1844                          'category' => '2',
1845                          'parent' => '19',
1846                          'name' => 'Cloze',
1847                          'questiontext' => '{3:NUMERICAL:=3:2}',
1848                          'questiontextformat' => '0',
1849                          'generalfeedback' => '',
1850                          'generalfeedbackformat' => '1',
1851                          'defaultgrade' => '3.0000000',
1852                          'penalty' => '0.0000000',
1853                          'qtype' => 'numerical',
1854                          'length' => '1',
1855                          'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+glbCBN',
1856                          'version' => 'tjh238.vledev2.open.ac.uk+110525164441+xWusxR',
1857                          'hidden' => '0',
1858                          'timecreated' => '1306341881',
1859                          'timemodified' => '1306341881',
1860                          'createdby' => '2',
1861                          'modifiedby' => '2',
1862                          'options' => (object) array(
1863                              'answers' => array(
1864                                  51 => (object) array(
1865                                      'id' => '51',
1866                                      'question' => '27',
1867                                      'answer' => '3',
1868                                      'answerformat' => '0',
1869                                      'fraction' => '1.0000000',
1870                                      'feedback' => '',
1871                                      'feedbackformat' => '1',
1872                                      'tolerance' => '2',
1873                                  ),
1874                              ),
1875                              'units' => array(
1876                              ),
1877                              'unitgradingtype' => '0',
1878                              'unitpenalty' => '1.0000000',
1879                              'showunits' => '3',
1880                              'unitsleft' => '0',
1881                              'instructions' => '',
1882                              'instructionsformat' => '1',
1883                          ),
1884                          'maxgrade' => '3.0000000',
1885                      ),
1886                  ),
1887              ),
1888              'defaultmark' => '13.0000000',
1889          );
1890          $qsession = (object) array(
1891              'id' => '107',
1892              'attemptid' => '17',
1893              'questionid' => '19',
1894              'newest' => '290',
1895              'newgraded' => '290',
1896              'sumpenalty' => '1.3000000',
1897              'manualcomment' => '',
1898              'manualcommentformat' => '1',
1899              'flagged' => '0',
1900          );
1901          $qstates = array(
1902              288 => (object) array(
1903                  'id' => '288',
1904                  'attempt' => '17',
1905                  'question' => '19',
1906                  'seq_number' => '0',
1907                  'answer' => '1-,2-,3-,4-,5-,6-,7-,8-',
1908                  'timestamp' => '1306425757',
1909                  'event' => '0',
1910                  'grade' => '0.0000000',
1911                  'raw_grade' => '0.0000000',
1912                  'penalty' => '0.0000000',
1913              ),
1914              290 => (object) array(
1915                  'id' => '290',
1916                  'attempt' => '17',
1917                  'question' => '19',
1918                  'seq_number' => '1',
1919                  'answer' => '1-,2-,3-,4-,5-,6-,7-,8-',
1920                  'timestamp' => '1306425757',
1921                  'event' => '6',
1922                  'grade' => '0.0000000',
1923                  'raw_grade' => '0.0000000',
1924                  'penalty' => '1.3000000',
1925              ),
1926          );
1927  
1928          $qa = $this->updater->convert_question_attempt($quiz, $attempt, $question, $qsession, $qstates);
1929  
1930          $expectedqa = (object) array(
1931              'behaviour' => 'adaptivenopenalty',
1932              'questionid' => 19,
1933              'variant' => 1,
1934              'maxmark' => 13.0000000,
1935              'minfraction' => 0,
1936              'maxfraction' => 1,
1937              'flagged' => 0,
1938              '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}
1939  
1940  and right after that you will have to deal with this short answer _____
1941  
1942  and finally we have a floating point number _____.
1943  
1944  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}
1945  
1946  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}
1947  
1948  A shortanswer question where case must match. Write moodle in upper case letters _____
1949  
1950  Note that addresses like www.moodle.org and smileys :-) all work as normal:
1951  
1952  a) How good is this? {Yes; No}
1953  
1954  b) What grade would you give it? _____',
1955              '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',
1956              'responsesummary' => 'part 1: ; part 2: ; part 3: ; part 4: ; part 5: ; part 6: ; part 7: ; part 8: ',
1957              'timemodified' => 1306425757,
1958              'steps' => array(
1959                  0 => (object) array(
1960                      'sequencenumber' => 0,
1961                      'state' => 'todo',
1962                      'fraction' => null,
1963                      'timecreated' => 1306425757,
1964                      'userid' => 4,
1965                      'data' => array('_sub1_order' => '29,30,31,32',
1966                              '_sub3_separators' => '.$,', '_sub4_order' => '38,39,40,41',
1967                              '_sub5_order' => '42,43,44,45', '_sub7_order' => '49,50',
1968                              '_sub8_separators' => '.$,'),
1969                  ),
1970                  1 => (object) array(
1971                      'sequencenumber' => 1,
1972                      'state' => 'gradedwrong',
1973                      'fraction' => 0.0,
1974                      'timecreated' => 1306425757,
1975                      'userid' => 4,
1976                      'data' => array('-finish' => '1', '-_try' => '1', '-_rawfraction' => 0.0),
1977                  ),
1978              ),
1979          );
1980  
1981          $this->compare_qas($expectedqa, $qa);
1982      }
1983  
1984      public function test_multianswer_adaptivenopenalty_qsession109() {
1985          $quiz = (object) array(
1986              'id' => '5',
1987              'course' => '2',
1988              'name' => 'Multianswer quiz',
1989              'intro' => '',
1990              'introformat' => '1',
1991              'timeopen' => '0',
1992              'timeclose' => '0',
1993              'attempts' => '0',
1994              'attemptonlast' => '0',
1995              'grademethod' => '1',
1996              'decimalpoints' => '2',
1997              'questiondecimalpoints' => '-1',
1998              'review' => '4459503',
1999              'questionsperpage' => '1',
2000              'shufflequestions' => '0',
2001              'shuffleanswers' => '1',
2002              'sumgrades' => '14.00000',
2003              'grade' => '10.00000',
2004              'timecreated' => '0',
2005              'timemodified' => '1306424728',
2006              'timelimit' => '0',
2007              'password' => '',
2008              'subnet' => '',
2009              'popup' => '0',
2010              'delay1' => '0',
2011              'delay2' => '0',
2012              'showuserpicture' => '0',
2013              'showblocks' => '0',
2014              'preferredbehaviour' => 'adaptivenopenalty',
2015          );
2016          $attempt = (object) array(
2017              'id' => '18',
2018              'uniqueid' => '18',
2019              'quiz' => '5',
2020              'userid' => '3',
2021              'attempt' => '1',
2022              'sumgrades' => '10.40000',
2023              'timestart' => '1306425784',
2024              'timefinish' => '1306425931',
2025              'timemodified' => '1306425931',
2026              'layout' => '28,19,0',
2027              'preview' => '0',
2028          );
2029          $question = (object) array(
2030              'id' => '19',
2031              'category' => '2',
2032              'parent' => '0',
2033              'name' => 'Cloze',
2034              'questiontext' => '<p>This question consists of some text with an answer embedded right  here {#1}</p>
2035          <p>and right after that you will have to deal with this short answer  {#2}</p>
2036          <p>and finally we have a floating point number  {#3}.</p>
2037          <p>The  multichoice question can also be shown in the vertical  display of the standard moodle multiple choice. {#4}</p>
2038          <p>Or in an horizontal display that is included here in a table {#5}</p>
2039          <p>A shortanswer question where case must match. Write moodle in  upper case letters {#6}</p>
2040          <p>Note that addresses like www.moodle.org and smileys :-) all work as normal:</p>
2041          <p>a) How good is this? {#7}</p>
2042          <p>b) What grade would you give it? {#8}</p>',
2043              'questiontextformat' => '1',
2044              'generalfeedback' => '',
2045              'generalfeedbackformat' => '1',
2046              'penalty' => '0.1000000',
2047              'qtype' => 'multianswer',
2048              'length' => '1',
2049              'stamp' => 'tjh238.vledev2.open.ac.uk+110525164438+iwiint',
2050              'version' => 'tjh238.vledev2.open.ac.uk+110525164441+AAjnIy',
2051              'hidden' => '0',
2052              'timecreated' => '1306341878',
2053              'timemodified' => '1306341879',
2054              'createdby' => '2',
2055              'modifiedby' => '2',
2056              'maxmark' => '13.0000000',
2057              'options' => (object) array(
2058                  'questions' => array(
2059                      1 => (object) array(
2060                          'id' => '20',
2061                          'category' => '2',
2062                          'parent' => '19',
2063                          'name' => 'Cloze',
2064                          '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}',
2065                          'questiontextformat' => '0',
2066                          'generalfeedback' => '',
2067                          'generalfeedbackformat' => '1',
2068                          'defaultgrade' => '1.0000000',
2069                          'penalty' => '0.0000000',
2070                          'qtype' => 'multichoice',
2071                          'length' => '1',
2072                          'stamp' => 'tjh238.vledev2.open.ac.uk+110525164439+cAuJ4r',
2073                          'version' => 'tjh238.vledev2.open.ac.uk+110525164439+5bnnys',
2074                          'hidden' => '0',
2075                          'timecreated' => '1306341879',
2076                          'timemodified' => '1306341879',
2077                          'createdby' => '2',
2078                          'modifiedby' => '2',
2079                          'options' => (object) array(
2080                              'id' => '3',
2081                              'question' => '20',
2082                              'layout' => '0',
2083                              'answers' => array(
2084                                  29 => (object) array(
2085                                      'id' => '29',
2086                                      'question' => '20',
2087                                      'answer' => 'Wrong answer',
2088                                      'answerformat' => '1',
2089                                      'fraction' => '0.0000000',
2090                                      'feedback' => 'Feedback for this wrong answer',
2091                                      'feedbackformat' => '1',
2092                                  ),
2093                                  30 => (object) array(
2094                                      'id' => '30',
2095                                      'question' => '20',
2096                                      'answer' => 'Another  wrong answer',
2097                                      'answerformat' => '1',
2098                                      'fraction' => '0.0000000',
2099                                      'feedback' => 'Feedback for the other wrong answer',
2100                                      'feedbackformat' => '1',
2101                                  ),
2102                                  31 => (object) array(
2103                                      'id' => '31',
2104                                      'question' => '20',
2105                                      'answer' => 'Correct  answer',
2106                                      'answerformat' => '1',
2107                                      'fraction' => '1.0000000',
2108                                      'feedback' => 'Feedback for correct answer',
2109                                      'feedbackformat' => '1',
2110                                  ),
2111                                  32 => (object) array(
2112                                      'id' => '32',
2113                                      'question' => '20',
2114                                      'answer' => 'Answer that gives half the  credit',
2115                                      'answerformat' => '1',
2116                                      'fraction' => '0.5000000',
2117                                      'feedback' => 'Feedback for half credit answer',
2118                                      'feedbackformat' => '1',
2119                                  ),
2120                              ),
2121                              'single' => '1',
2122                              'shuffleanswers' => '1',
2123                              'correctfeedback' => '',
2124                              'correctfeedbackformat' => '1',
2125                              'partiallycorrectfeedback' => '',
2126                              'partiallycorrectfeedbackformat' => '1',
2127                              'incorrectfeedback' => '',
2128                              'incorrectfeedbackformat' => '1',
2129                              'answernumbering' => '0',
2130                          ),
2131                          'maxgrade' => '1.0000000',
2132                      ),
2133                      2 => (object) array(
2134                          'id' => '21',
2135                          'category' => '2',
2136                          'parent' => '19',
2137                          'name' => 'Cloze',
2138                          '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}',
2139                          'questiontextformat' => '0',
2140                          'generalfeedback' => '',
2141                          'generalfeedbackformat' => '1',
2142                          'defaultgrade' => '1.0000000',
2143                          'penalty' => '0.0000000',
2144                          'qtype' => 'shortanswer',
2145                          'length' => '1',
2146                          'stamp' => 'tjh238.vledev2.open.ac.uk+110525164440+EN6wCk',
2147                          'version' => 'tjh238.vledev2.open.ac.uk+110525164440+bQzatI',
2148                          'hidden' => '0',
2149                          'timecreated' => '1306341880',
2150                          'timemodified' => '1306341880',
2151                          'createdby' => '2',
2152                          'modifiedby' => '2',
2153                          'options' => (object) array(
2154                              'answers' => array(
2155                                  33 => (object) array(
2156                                      'id' => '33',
2157                                      'question' => '21',
2158                                      'answer' => 'Wrong answer',
2159                                      'answerformat' => '0',
2160                                      'fraction' => '0.0000000',
2161                                      'feedback' => 'Feedback for this wrong answer',
2162                                      'feedbackformat' => '1',
2163                                  ),
2164                                  34 => (object) array(
2165                                      'id' => '34',
2166                                      'question' => '21',
2167                                      'answer' => 'Correct  answer',
2168                                      'answerformat' => '0',
2169                                      'fraction' => '1.0000000',
2170                                      'feedback' => 'Feedback for correct answer',
2171                                      'feedbackformat' => '1',
2172                                  ),
2173                                  35 => (object) array(
2174                                      'id' => '35',
2175                                      'question' => '21',
2176                                      'answer' => 'Answer that gives half the  credit',
2177                                      'answerformat' => '0',
2178                                      'fraction' => '0.5000000',
2179                                      'feedback' => 'Feedback for half credit answer',
2180                                      'feedbackformat' => '1',
2181                                  ),
2182                              ),
2183                              'usecase' => '0',
2184                          ),
2185                          'maxgrade' => '1.0000000',
2186                      ),
2187                      3 => (object) array(
2188                          'id' => '22',
2189                          'category' => '2',
2190                          'parent' => '19',
2191                          'name' => 'Cloze',
2192                          '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}',
2193                          'questiontextformat' => '0',
2194                          'generalfeedback' => '',
2195                          'generalfeedbackformat' => '1',
2196                          'defaultgrade' => '2.0000000',
2197                          'penalty' => '0.0000000',
2198                          'qtype' => 'numerical',
2199                          'length' => '1',
2200                          'stamp' => 'tjh238.vledev2.open.ac.uk+110525164440+Xr29c2',
2201                          'version' => 'tjh238.vledev2.open.ac.uk+110525164441+QTwsGM',
2202                          'hidden' => '0',
2203                          'timecreated' => '1306341880',
2204                          'timemodified' => '1306341880',
2205                          'createdby' => '2',
2206                          'modifiedby' => '2',
2207                          'options' => (object) array(
2208                              'answers' => array(
2209                                  36 => (object) array(
2210                                      'id' => '36',
2211                                      'question' => '22',
2212                                      'answer' => '23.8',
2213                                      'answerformat' => '0',
2214                                      'fraction' => '1.0000000',
2215                                      'feedback' => 'Feedback for correct answer  23.8',
2216                                      'feedbackformat' => '1',
2217                                      'tolerance' => '0.1',
2218                                  ),
2219                                  37 => (object) array(
2220                                      'id' => '37',
2221                                      'question' => '22',
2222                                      'answer' => '23.8',
2223                                      'answerformat' => '0',
2224                                      'fraction' => '0.5000000',
2225                                      'feedback' => 'Feedback for half credit answer in the nearby region of  the correct answer',
2226                                      'feedbackformat' => '1',
2227                                      'tolerance' => '2',
2228                                  ),
2229                              ),
2230                              'units' => array(
2231                              ),
2232                              'unitgradingtype' => '0',
2233                              'unitpenalty' => '1.0000000',
2234                              'showunits' => '3',
2235                              'unitsleft' => '0',
2236                              'instructions' => '',
2237                              'instructionsformat' => '1',
2238                          ),
2239                          'maxgrade' => '2.0000000',
2240                      ),
2241                      4 => (object) array(
2242                          'id' => '23',
2243                          'category' => '2',
2244                          'parent' => '19',
2245                          'name' => 'Cloze',
2246                          '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}',
2247                          'questiontextformat' => '0',
2248                          'generalfeedback' => '',
2249                          'generalfeedbackformat' => '1',
2250                          'defaultgrade' => '2.0000000',
2251                          'penalty' => '0.0000000',
2252                          'qtype' => 'multichoice',
2253                          'length' => '1',
2254                          'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+7R55HA',
2255                          'version' => 'tjh238.vledev2.open.ac.uk+110525164441+uCMoQc',
2256                          'hidden' => '0',
2257                          'timecreated' => '1306341881',
2258                          'timemodified' => '1306341881',
2259                          'createdby' => '2',
2260                          'modifiedby' => '2',
2261                          'options' => (object) array(
2262                              'id' => '4',
2263                              'question' => '23',
2264                              'layout' => '1',
2265                              'answers' => array(
2266                                  38 => (object) array(
2267                                      'id' => '38',
2268                                      'question' => '23',
2269                                      'answer' => '1. Wrong answer',
2270                                      'answerformat' => '1',
2271                                      'fraction' => '0.0000000',
2272                                      'feedback' => 'Feedback for this wrong answer',
2273                                      'feedbackformat' => '1',
2274                                  ),
2275                                  39 => (object) array(
2276                                      'id' => '39',
2277                                      'question' => '23',
2278                                      'answer' => '2. Another wrong  answer',
2279                                      'answerformat' => '1',
2280                                      'fraction' => '0.0000000',
2281                                      'feedback' => 'Feedback for the other wrong answer',
2282                                      'feedbackformat' => '1',
2283                                  ),
2284                                  40 => (object) array(
2285                                      'id' => '40',
2286                                      'question' => '23',
2287                                      'answer' => '3. Correct answer',
2288                                      'answerformat' => '1',
2289                                      'fraction' => '1.0000000',
2290                                      'feedback' => 'Feedback  for correct answer',
2291                                      'feedbackformat' => '1',
2292                                  ),
2293                                  41 => (object) array(
2294                                      'id' => '41',
2295                                      'question' => '23',
2296                                      'answer' => '4. Answer that gives half the credit',
2297                                      'answerformat' => '1',
2298                                      'fraction' => '0.5000000',
2299                                      'feedback' => 'Feedback for  half credit answer',
2300                                      'feedbackformat' => '1',
2301                                  ),
2302                              ),
2303                              'single' => '1',
2304                              'shuffleanswers' => '1',
2305                              'correctfeedback' => '',
2306                              'correctfeedbackformat' => '1',
2307                              'partiallycorrectfeedback' => '',
2308                              'partiallycorrectfeedbackformat' => '1',
2309                              'incorrectfeedback' => '',
2310                              'incorrectfeedbackformat' => '1',
2311                              'answernumbering' => '0',
2312                          ),
2313                          'maxgrade' => '2.0000000',
2314                      ),
2315                      5 => (object) array(
2316                          'id' => '24',
2317                          'category' => '2',
2318                          'parent' => '19',
2319                          'name' => 'Cloze',
2320                          '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}',
2321                          'questiontextformat' => '0',
2322                          'generalfeedback' => '',
2323                          'generalfeedbackformat' => '1',
2324                          'defaultgrade' => '2.0000000',
2325                          'penalty' => '0.0000000',
2326                          'qtype' => 'multichoice',
2327                          'length' => '1',
2328                          'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+QGvRpd',
2329                          'version' => 'tjh238.vledev2.open.ac.uk+110525164441+03GsSs',
2330                          'hidden' => '0',
2331                          'timecreated' => '1306341881',
2332                          'timemodified' => '1306341881',
2333                          'createdby' => '2',
2334                          'modifiedby' => '2',
2335                          'options' => (object) array(
2336                              'id' => '5',
2337                              'question' => '24',
2338                              'layout' => '2',
2339                              'answers' => array(
2340                                  42 => (object) array(
2341                                      'id' => '42',
2342                                      'question' => '24',
2343                                      'answer' => 'a. Wrong answer',
2344                                      'answerformat' => '1',
2345                                      'fraction' => '0.0000000',
2346                                      'feedback' => 'Feedback for this wrong answer',
2347                                      'feedbackformat' => '1',
2348                                  ),
2349                                  43 => (object) array(
2350                                      'id' => '43',
2351                                      'question' => '24',
2352                                      'answer' => 'b. Another wrong  answer',
2353                                      'answerformat' => '1',
2354                                      'fraction' => '0.0000000',
2355                                      'feedback' => 'Feedback for the other wrong answer',
2356                                      'feedbackformat' => '1',
2357                                  ),
2358                                  44 => (object) array(
2359                                      'id' => '44',
2360                                      'question' => '24',
2361                                      'answer' => 'c. Correct answer',
2362                                      'answerformat' => '1',
2363                                      'fraction' => '1.0000000',
2364                                      'feedback' => 'Feedback  for correct answer',
2365                                      'feedbackformat' => '1',
2366                                  ),
2367                                  45 => (object) array(
2368                                      'id' => '45',
2369                                      'question' => '24',
2370                                      'answer' => 'd. Answer that gives half the credit',
2371                                      'answerformat' => '1',
2372                                      'fraction' => '0.5000000',
2373                                      'feedback' => 'Feedback for  half credit answer',
2374                                      'feedbackformat' => '1',
2375                                  ),
2376                              ),
2377                              'single' => '1',
2378                              'shuffleanswers' => '1',
2379                              'correctfeedback' => '',
2380                              'correctfeedbackformat' => '1',
2381                              'partiallycorrectfeedback' => '',
2382                              'partiallycorrectfeedbackformat' => '1',
2383                              'incorrectfeedback' => '',
2384                              'incorrectfeedbackformat' => '1',
2385                              'answernumbering' => '0',
2386                          ),
2387                          'maxgrade' => '2.0000000',
2388                      ),
2389                      6 => (object) array(
2390                          'id' => '25',
2391                          'category' => '2',
2392                          'parent' => '19',
2393                          'name' => 'Cloze',
2394                          '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}',
2395                          'questiontextformat' => '0',
2396                          'generalfeedback' => '',
2397                          'generalfeedbackformat' => '1',
2398                          'defaultgrade' => '1.0000000',
2399                          'penalty' => '0.0000000',
2400                          'qtype' => 'shortanswer',
2401                          'length' => '1',
2402                          'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+n9ETJC',
2403                          'version' => 'tjh238.vledev2.open.ac.uk+110525164441+Bvqo6c',
2404                          'hidden' => '0',
2405                          'timecreated' => '1306341881',
2406                          'timemodified' => '1306341881',
2407                          'createdby' => '2',
2408                          'modifiedby' => '2',
2409                          'options' => (object) array(
2410                              'answers' => array(
2411                                  46 => (object) array(
2412                                      'id' => '46',
2413                                      'question' => '25',
2414                                      'answer' => 'moodle',
2415                                      'answerformat' => '0',
2416                                      'fraction' => '0.0000000',
2417                                      'feedback' => 'Feedback for moodle in lower  case',
2418                                      'feedbackformat' => '1',
2419                                  ),
2420                                  47 => (object) array(
2421                                      'id' => '47',
2422                                      'question' => '25',
2423                                      'answer' => 'MOODLE',
2424                                      'answerformat' => '0',
2425                                      'fraction' => '1.0000000',
2426                                      'feedback' => 'Feedback for MOODLE in upper case',
2427                                      'feedbackformat' => '1',
2428                                  ),
2429                                  48 => (object) array(
2430                                      'id' => '48',
2431                                      'question' => '25',
2432                                      'answer' => 'Moodle',
2433                                      'answerformat' => '0',
2434                                      'fraction' => '0.5000000',
2435                                      'feedback' => 'Feedback for  only first letter in upper case',
2436                                      'feedbackformat' => '1',
2437                                  ),
2438                              ),
2439                              'usecase' => '1',
2440                          ),
2441                          'maxgrade' => '1.0000000',
2442                      ),
2443                      7 => (object) array(
2444                          'id' => '26',
2445                          'category' => '2',
2446                          'parent' => '19',
2447                          'name' => 'Cloze',
2448                          'questiontext' => '{:MULTICHOICE:=Yes#Correct~No#We have a different opinion}',
2449                          'questiontextformat' => '0',
2450                          'generalfeedback' => '',
2451                          'generalfeedbackformat' => '1',
2452                          'defaultgrade' => '1.0000000',
2453                          'penalty' => '0.0000000',
2454                          'qtype' => 'multichoice',
2455                          'length' => '1',
2456                          'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+0YjnZ7',
2457                          'version' => 'tjh238.vledev2.open.ac.uk+110525164441+1giLRX',
2458                          'hidden' => '0',
2459                          'timecreated' => '1306341881',
2460                          'timemodified' => '1306341881',
2461                          'createdby' => '2',
2462                          'modifiedby' => '2',
2463                          'options' => (object) array(
2464                              'id' => '6',
2465                              'question' => '26',
2466                              'layout' => '0',
2467                              'answers' => array(
2468                                  49 => (object) array(
2469                                      'id' => '49',
2470                                      'question' => '26',
2471                                      'answer' => 'Yes',
2472                                      'answerformat' => '1',
2473                                      'fraction' => '1.0000000',
2474                                      'feedback' => 'Correct',
2475                                      'feedbackformat' => '1',
2476                                  ),
2477                                  50 => (object) array(
2478                                      'id' => '50',
2479                                      'question' => '26',
2480                                      'answer' => 'No',
2481                                      'answerformat' => '1',
2482                                      'fraction' => '0.0000000',
2483                                      'feedback' => 'We have a different opinion',
2484                                      'feedbackformat' => '1',
2485                                  ),
2486                              ),
2487                              'single' => '1',
2488                              'shuffleanswers' => '1',
2489                              'correctfeedback' => '',
2490                              'correctfeedbackformat' => '1',
2491                              'partiallycorrectfeedback' => '',
2492                              'partiallycorrectfeedbackformat' => '1',
2493                              'incorrectfeedback' => '',
2494                              'incorrectfeedbackformat' => '1',
2495                              'answernumbering' => '0',
2496                          ),
2497                          'maxgrade' => '1.0000000',
2498                      ),
2499                      8 => (object) array(
2500                          'id' => '27',
2501                          'category' => '2',
2502                          'parent' => '19',
2503                          'name' => 'Cloze',
2504                          'questiontext' => '{3:NUMERICAL:=3:2}',
2505                          'questiontextformat' => '0',
2506                          'generalfeedback' => '',
2507                          'generalfeedbackformat' => '1',
2508                          'defaultgrade' => '3.0000000',
2509                          'penalty' => '0.0000000',
2510                          'qtype' => 'numerical',
2511                          'length' => '1',
2512                          'stamp' => 'tjh238.vledev2.open.ac.uk+110525164441+glbCBN',
2513                          'version' => 'tjh238.vledev2.open.ac.uk+110525164441+xWusxR',
2514                          'hidden' => '0',
2515                          'timecreated' => '1306341881',
2516                          'timemodified' => '1306341881',
2517                          'createdby' => '2',
2518                          'modifiedby' => '2',
2519                          'options' => (object) array(
2520                              'answers' => array(
2521                                  51 => (object) array(
2522                                      'id' => '51',
2523                                      'question' => '27',
2524                                      'answer' => '3',
2525                                      'answerformat' => '0',
2526                                      'fraction' => '1.0000000',
2527                                      'feedback' => '',
2528                                      'feedbackformat' => '1',
2529                                      'tolerance' => '2',
2530                                  ),
2531                              ),
2532                              'units' => array(
2533                              ),
2534                              'unitgradingtype' => '0',
2535                              'unitpenalty' => '1.0000000',
2536                              'showunits' => '3',
2537                              'unitsleft' => '0',
2538                              'instructions' => '',
2539                              'instructionsformat' => '1',
2540                          ),
2541                          'maxgrade' => '3.0000000',
2542                      ),
2543                  ),
2544              ),
2545              'defaultmark' => '13.0000000',
2546          );
2547          $qsession = (object) array(
2548              'id' => '109',
2549              'attemptid' => '18',
2550              'questionid' => '19',
2551              'newest' => '299',
2552              'newgraded' => '299',
2553              'sumpenalty' => '5.2000000',
2554              'manualcomment' => '',
2555              'manualcommentformat' => '1',
2556              'flagged' => '0',
2557          );
2558          $qstates = array(
2559              292 => (object) array(
2560                  'id' => '292',
2561                  'attempt' => '18',
2562                  'question' => '19',
2563                  'seq_number' => '0',
2564                  'answer' => '1-,2-,3-,4-,5-,6-,7-,8-',
2565                  'timestamp' => '1306425784',
2566                  'event' => '0',
2567                  'grade' => '0.0000000',
2568                  'raw_grade' => '0.0000000',
2569                  'penalty' => '0.0000000',
2570              ),
2571              294 => (object) array(
2572                  'id' => '294',
2573                  'attempt' => '18',
2574                  'question' => '19',
2575                  'seq_number' => '1',
2576                  'answer' => '1-32,2-asdgf,3-saedf,4-39,5-43,6-sadf,7-,8-',
2577                  'timestamp' => '1306425801',
2578                  'event' => '3',
2579                  'grade' => '0.5000000',
2580                  'raw_grade' => '0.5000000',
2581                  'penalty' => '1.3000000',
2582              ),
2583              295 => (object) array(
2584                  'id' => '295',
2585                  'attempt' => '18',
2586                  'question' => '19',
2587                  'seq_number' => '2',
2588                  'answer' => '1-31,2-asdgf,3-28.3,4-40,5-44,6-MOODLE,7-49,8-13',
2589                  'timestamp' => '1306425836',
2590                  'event' => '3',
2591                  'grade' => '5.7000000',
2592                  'raw_grade' => '7.0000000',
2593                  'penalty' => '1.3000000',
2594              ),
2595              296 => (object) array(
2596                  'id' => '296',
2597                  'attempt' => '18',
2598                  'question' => '19',
2599                  'seq_number' => '3',
2600                  'answer' => '1-31,2-Correct answer,3-23.8,4-40,5-44,6-MOODLE,7-49,8-3',
2601                  'timestamp' => '1306425886',
2602                  'event' => '3',
2603                  'grade' => '9.4000000',
2604                  'raw_grade' => '12.0000000',
2605                  'penalty' => '1.3000000',
2606              ),
2607              299 => (object) array(
2608                  'id' => '299',
2609                  'attempt' => '18',
2610                  'question' => '19',
2611                  'seq_number' => '4',
2612                  'answer' => '1-31,2-Correct answer,3-23.8,4-40,5-44,6-MOODLE,7-49,8-3',
2613                  'timestamp' => '1306425886',
2614                  'event' => '6',
2615                  'grade' => '9.4000000',
2616                  'raw_grade' => '12.0000000',
2617                  'penalty' => '1.3000000',
2618              ),
2619          );
2620  
2621          $qa = $this->updater->convert_question_attempt($quiz, $attempt, $question, $qsession, $qstates);
2622  
2623          $expectedqa = (object) array(
2624              'behaviour' => 'adaptivenopenalty',
2625              'questionid' => '19',
2626              'variant' => 1,
2627              'maxmark' => '13.0000000',
2628              'minfraction' => 0,
2629              'maxfraction' => 1,
2630              'flagged' => 0,
2631              '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}
2632  
2633  and right after that you will have to deal with this short answer _____
2634  
2635  and finally we have a floating point number _____.
2636  
2637  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}
2638  
2639  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}
2640  
2641  A shortanswer question where case must match. Write moodle in upper case letters _____
2642  
2643  Note that addresses like www.moodle.org and smileys :-) all work as normal:
2644  
2645  a) How good is this? {Yes; No}
2646  
2647  b) What grade would you give it? _____',
2648              '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',
2649              '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',
2650              'timemodified' => '1306425886',
2651              'steps' => array(
2652                  0 => (object) array(
2653                      'sequencenumber' => 0,
2654                      'state' => 'todo',
2655                      'fraction' => null,
2656                      'timecreated' => 1306425784,
2657                      'userid' => 3,
2658                      'data' => array('_sub1_order' => '29,30,31,32',
2659                              '_sub3_separators' => '.$,', '_sub4_order' => '38,39,40,41',
2660                              '_sub5_order' => '42,43,44,45', '_sub7_order' => '49,50',
2661                              '_sub8_separators' => '.$,'),
2662                  ),
2663                  1 => (object) array(
2664                      'sequencenumber' => 1,
2665                      'state' => 'todo',
2666                      'fraction' => 0.038461538461538464,
2667                      'timecreated' => '1306425801',
2668                      'userid' => '3',
2669                      'data' => array('sub1_answer' => '3', 'sub2_answer' => 'asdgf',
2670                              'sub3_answer' => 'saedf', 'sub4_answer' => '1',
2671                              'sub5_answer' => '1', 'sub6_answer' => 'sadf',
2672                              '-_try' => '1',
2673                              '-_rawfraction' => '0.038461538461538464', '-submit' => '1'),
2674                  ),
2675                  2 => (object) array(
2676                      'sequencenumber' => 2,
2677                      'state' => 'todo',
2678                      'fraction' => 0.43846153846153845,
2679                      'timecreated' => 1306425836,
2680                      'userid' => 3,
2681                      'data' => array('sub1_answer' => '2', 'sub2_answer' => 'asdgf',
2682                              'sub3_answer' => '28.3', 'sub4_answer' => '2',
2683                              'sub5_answer' => '2', 'sub6_answer' => 'MOODLE',
2684                              'sub7_answer' => '0', 'sub8_answer' => '13', '-_try' => 2,
2685                              '-_rawfraction' => 0.53846153846153845, '-submit' => 1),
2686                  ),
2687                  3 => (object) array(
2688                      'sequencenumber' => 3,
2689                      'state' => 'todo',
2690                      'fraction' => 0.72307692307692311,
2691                      'timecreated' => 1306425886,
2692                      'userid' => 3,
2693                      'data' => array('sub1_answer' => '2', 'sub2_answer' => 'Correct answer',
2694                              'sub3_answer' => '23.8', 'sub4_answer' => '2',
2695                              'sub5_answer' => '2', 'sub6_answer' => 'MOODLE',
2696                              'sub7_answer' => '0', 'sub8_answer' => '3', '-_try' => 3,
2697                              '-_rawfraction' => 0.92307692307692311, '-submit' => 1),
2698                  ),
2699                  4 => (object) array(
2700                      'sequencenumber' => 4,
2701                      'state' => 'gradedpartial',
2702                      'fraction' => 0.72307692307692311,
2703                      'timecreated' => 1306425886,
2704                      'userid' => 3,
2705                      'data' => array('sub1_answer' => '2', 'sub2_answer' => 'Correct answer',
2706                              'sub3_answer' => '23.8', 'sub4_answer' => '2',
2707                              'sub5_answer' => '2', 'sub6_answer' => 'MOODLE',
2708                              'sub7_answer' => '0', 'sub8_answer' => '3', '-_try' => 3,
2709                              '-_rawfraction' => 0.92307692307692311, '-finish' => 1),
2710                  ),
2711              ),
2712          );
2713  
2714          $this->compare_qas($expectedqa, $qa);
2715      }
2716  }