Search moodle.org's
Developer Documentation

See Release Notes

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