Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.

Differences Between: [Versions 310 and 401] [Versions 311 and 401] [Versions 39 and 401]

   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   * Test helpers for the match question type.
  19   *
  20   * @package    qtype_match
  21   * @copyright  2013 The Open University
  22   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  23   */
  24  
  25  
  26  defined('MOODLE_INTERNAL') || die();
  27  
  28  global $CFG;
  29  require_once($CFG->dirroot . '/question/type/match/question.php');
  30  
  31  
  32  /**
  33   * Test helper class for the match question type.
  34   *
  35   * @copyright  2013 The Open University
  36   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  37   */
  38  class qtype_match_test_helper extends question_test_helper {
  39      public function get_test_questions() {
  40          return array('foursubq', 'trickynums');
  41      }
  42  
  43      /**
  44       * Makes a match question about completing two blanks in some text.
  45       * @return object the question definition data, as it might be returned from
  46       * get_question_options.
  47       */
  48      public function get_match_question_data_foursubq() {
  49          global $USER;
  50          $q = new stdClass();
  51          test_question_maker::initialise_question_data($q);
  52          $q->name = 'Matching question';
  53          $q->qtype = 'match';
  54          $q->parent = 0;
  55          $q->questiontext = 'Classify the animals.';
  56          $q->questiontextformat = FORMAT_HTML;
  57          $q->generalfeedback = 'General feedback.';
  58          $q->generalfeedbackformat = FORMAT_HTML;
  59          $q->defaultmark = 1;
  60          $q->penalty = 0.3333333;
  61          $q->length = 1;
  62          $q->status = \core_question\local\bank\question_version_status::QUESTION_STATUS_READY;
  63          $q->versionid = 0;
  64          $q->version = 1;
  65          $q->questionbankentryid = 0;
  66          $q->createdby = $USER->id;
  67          $q->modifiedby = $USER->id;
  68  
  69          $q->options = new stdClass();
  70          $q->options->shuffleanswers = 1;
  71          test_question_maker::set_standard_combined_feedback_fields($q->options);
  72  
  73          $q->options->subquestions = array(
  74              14 => (object) array(
  75                  'id' => 14,
  76                  'questiontext' => 'frog',
  77                  'questiontextformat' => FORMAT_HTML,
  78                  'answertext' => 'amphibian'),
  79              15 => (object) array(
  80                  'id' => 15,
  81                  'questiontext' => 'cat',
  82                  'questiontextformat' => FORMAT_HTML,
  83                  'answertext' => 'mammal'),
  84              16 => (object) array(
  85                  'id' => 16,
  86                  'questiontext' => 'newt',
  87                  'questiontextformat' => FORMAT_HTML,
  88                  'answertext' => 'amphibian'),
  89              17 => (object) array(
  90                  'id' => 17,
  91                  'questiontext' => '',
  92                  'questiontextformat' => FORMAT_HTML,
  93                  'answertext' => 'insect'),
  94          );
  95  
  96          return $q;
  97      }
  98  
  99      /**
 100       * Makes a match question about completing two blanks in some text.
 101       * @return object the question definition data, as it might be returned from
 102       *      the question editing form.
 103       */
 104      public function get_match_question_form_data_foursubq() {
 105          $q = new stdClass();
 106          $q->name = 'Matching question';
 107          $q->questiontext = array('text' => 'Classify the animals.', 'format' => FORMAT_HTML);
 108          $q->generalfeedback = array('text' => 'General feedback.', 'format' => FORMAT_HTML);
 109          $q->defaultmark = 1;
 110          $q->penalty = 0.3333333;
 111          $q->status = \core_question\local\bank\question_version_status::QUESTION_STATUS_READY;
 112          $q->versionid = 0;
 113          $q->version = 1;
 114          $q->questionbankentryid = 0;
 115  
 116          $q->shuffleanswers = 1;
 117          test_question_maker::set_standard_combined_feedback_form_data($q);
 118  
 119          $q->subquestions = array(
 120              0 => array('text' => 'frog', 'format' => FORMAT_HTML),
 121              1 => array('text' => 'cat', 'format' => FORMAT_HTML),
 122              2 => array('text' => 'newt', 'format' => FORMAT_HTML),
 123              3 => array('text' => '', 'format' => FORMAT_HTML));
 124  
 125          $q->subanswers = array(
 126              0 => 'amphibian',
 127              1 => 'mammal',
 128              2 => 'amphibian',
 129              3 => 'insect'
 130          );
 131  
 132          $q->noanswers = 4;
 133  
 134          return $q;
 135      }
 136  
 137      /**
 138       * Makes a matching question to classify 'Dog', 'Frog', 'Toad' and 'Cat' as
 139       * 'Mammal', 'Amphibian' or 'Insect'.
 140       * defaultmark 1. Stems are shuffled by default.
 141       * @return qtype_match_question
 142       */
 143      public static function make_match_question_foursubq() {
 144          question_bank::load_question_definition_classes('match');
 145          $match = new qtype_match_question();
 146          test_question_maker::initialise_a_question($match);
 147          $match->name = 'Matching question';
 148          $match->questiontext = 'Classify the animals.';
 149          $match->generalfeedback = 'Frogs and toads are amphibians, the others are mammals.';
 150          $match->qtype = question_bank::get_qtype('match');
 151  
 152          $match->shufflestems = 1;
 153  
 154          test_question_maker::set_standard_combined_feedback_fields($match);
 155  
 156          // Using unset to get 1-based arrays.
 157          $match->stems = array('', 'Dog', 'Frog', 'Toad', 'Cat');
 158          $match->stemformat = array('', FORMAT_HTML, FORMAT_HTML, FORMAT_HTML, FORMAT_HTML);
 159          $match->choices = array('', 'Mammal', 'Amphibian', 'Insect');
 160          $match->right = array('', 1, 2, 2, 1);
 161          unset($match->stems[0]);
 162          unset($match->stemformat[0]);
 163          unset($match->choices[0]);
 164          unset($match->right[0]);
 165  
 166          return $match;
 167      }
 168  
 169      /**
 170       * Makes a matching question with choices including '0' and '0.0'.
 171       *
 172       * @return object the question definition data, as it might be returned from
 173       * get_question_options.
 174       */
 175      public function get_match_question_data_trickynums() {
 176          global $USER;
 177  
 178          $q = new stdClass();
 179          test_question_maker::initialise_question_data($q);
 180          $q->name = 'Java matching';
 181          $q->qtype = 'match';
 182          $q->parent = 0;
 183          $q->questiontext = 'What is the output of each of these lines of code?';
 184          $q->questiontextformat = FORMAT_HTML;
 185          $q->generalfeedback = 'Java has some advantages over PHP I guess!';
 186          $q->generalfeedbackformat = FORMAT_HTML;
 187          $q->defaultmark = 1;
 188          $q->penalty = 0.3333333;
 189          $q->length = 1;
 190          $q->status = \core_question\local\bank\question_version_status::QUESTION_STATUS_READY;
 191          $q->versionid = 0;
 192          $q->version = 1;
 193          $q->questionbankentryid = 0;
 194          $q->createdby = $USER->id;
 195          $q->modifiedby = $USER->id;
 196  
 197          $q->options = new stdClass();
 198          $q->options->shuffleanswers = 1;
 199          test_question_maker::set_standard_combined_feedback_fields($q->options);
 200  
 201          $q->options->subquestions = array(
 202                  14 => (object) array(
 203                          'id' => 14,
 204                          'questiontext' => 'System.out.println(0);',
 205                          'questiontextformat' => FORMAT_HTML,
 206                          'answertext' => '0'),
 207                  15 => (object) array(
 208                          'id' => 15,
 209                          'questiontext' => 'System.out.println(0.0);',
 210                          'questiontextformat' => FORMAT_HTML,
 211                          'answertext' => '0.0'),
 212                  16 => (object) array(
 213                          'id' => 16,
 214                          'questiontext' => '',
 215                          'questiontextformat' => FORMAT_HTML,
 216                          'answertext' => 'NULL'),
 217          );
 218  
 219          return $q;
 220      }
 221  
 222      /**
 223       * Makes a match question about completing two blanks in some text.
 224       * @return object the question definition data, as it might be returned from
 225       *      the question editing form.
 226       */
 227      public function get_match_question_form_data_trickynums() {
 228          $q = new stdClass();
 229          $q->name = 'Java matching';
 230          $q->questiontext = ['text' => 'What is the output of each of these lines of code?', 'format' => FORMAT_HTML];
 231          $q->generalfeedback = ['text' => 'Java has some advantages over PHP I guess!', 'format' => FORMAT_HTML];
 232          $q->defaultmark = 1;
 233          $q->penalty = 0.3333333;
 234          $q->status = \core_question\local\bank\question_version_status::QUESTION_STATUS_READY;
 235          $q->versionid = 0;
 236          $q->version = 1;
 237          $q->questionbankentryid = 0;
 238  
 239          $q->shuffleanswers = 1;
 240          test_question_maker::set_standard_combined_feedback_form_data($q);
 241  
 242          $q->subquestions = array(
 243              0 => array('text' => 'System.out.println(0);', 'format' => FORMAT_HTML),
 244              1 => array('text' => 'System.out.println(0.0);', 'format' => FORMAT_HTML),
 245              2 => array('text' => '', 'format' => FORMAT_HTML),
 246          );
 247  
 248          $q->subanswers = array(
 249              0 => '0',
 250              1 => '0.0',
 251              2 => 'NULL',
 252          );
 253  
 254          $q->noanswers = 3;
 255  
 256          return $q;
 257      }
 258  
 259      /**
 260       * Makes a matching question with choices including '0' and '0.0'.
 261       *
 262       * @return qtype_match_question
 263       */
 264      public static function make_match_question_trickynums() {
 265          question_bank::load_question_definition_classes('match');
 266          $match = new qtype_match_question();
 267          test_question_maker::initialise_a_question($match);
 268          $match->name = 'Java matching';
 269          $match->questiontext = 'What is the output of each of these lines of code?';
 270          $match->generalfeedback = 'Java has some advantages over PHP I guess!';
 271          $match->qtype = question_bank::get_qtype('match');
 272  
 273          $match->shufflestems = 1;
 274  
 275          test_question_maker::set_standard_combined_feedback_fields($match);
 276  
 277          // Using unset to get 1-based arrays.
 278          $match->stems = array('', 'System.out.println(0);', 'System.out.println(0.0);');
 279          $match->stemformat = array('', FORMAT_HTML, FORMAT_HTML);
 280          $match->choices = array('', '0', '0.0', 'NULL');
 281          $match->right = array('', 1, 2);
 282          unset($match->stems[0]);
 283          unset($match->stemformat[0]);
 284          unset($match->choices[0]);
 285          unset($match->right[0]);
 286  
 287          return $match;
 288      }
 289  }