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 311 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   * Unit tests for the select missing words question edit form.
  19   *
  20   * @package   qtype_gapselect
  21   * @copyright 2012 The Open University
  22   * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  23   */
  24  
  25  namespace qtype_gapselect\form;
  26  
  27  defined('MOODLE_INTERNAL') || die();
  28  global $CFG;
  29  
  30  require_once($CFG->dirroot . '/question/engine/tests/helpers.php');
  31  require_once($CFG->dirroot . '/question/type/edit_question_form.php');
  32  require_once($CFG->dirroot . '/question/type/gapselect/edit_gapselect_form.php');
  33  
  34  
  35  /**
  36   * Subclass of qtype_gapselect_edit_form_base that is easier to used in unit tests.
  37   *
  38   * @copyright 2012 The Open University
  39   * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  40   */
  41  class qtype_gapselect_edit_form_base_testable extends \qtype_gapselect_edit_form_base {
  42      public function get_illegal_tag_error($text) {
  43          return parent::get_illegal_tag_error($text);
  44      }
  45  
  46      /**
  47       * Set the list of allowed tags.
  48       * @param array $allowed
  49       */
  50      public function set_allowed_tags(array $allowed) {
  51          $this->allowedhtmltags = $allowed;
  52      }
  53  
  54      public function qtype() {
  55          return 'gapselect';
  56      }
  57  }
  58  
  59  
  60  /**
  61   * Unit tests for select missing words question edit form.
  62   *
  63   * @package    qtype_gapselect
  64   * @copyright  2012 The Open University
  65   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  66   */
  67  class edit_form_test extends \advanced_testcase {
  68  
  69      /**
  70       * Helper method.
  71       *
  72       * @param string $classname the question form class to instantiate.
  73       *
  74       *
  75       * @return array with two elements:
  76       *      question_edit_form great a question form instance that can be tested.
  77       *      stdClass the question category.
  78       */
  79      protected function get_form($classname) {
  80          $this->setAdminUser();
  81          $this->resetAfterTest();
  82  
  83          $syscontext = \context_system::instance();
  84          $category = question_make_default_categories(array($syscontext));
  85          $fakequestion = new \stdClass();
  86          $fakequestion->qtype = 'gapselect'; // Does not actually matter if this is wrong.
  87          $fakequestion->contextid = $syscontext->id;
  88          $fakequestion->createdby = 2;
  89          $fakequestion->category = $category->id;
  90          $fakequestion->questiontext = 'Test [[1]] question [[2]]';
  91          $fakequestion->options = new \stdClass();
  92          $fakequestion->options->answers = array();
  93          $fakequestion->formoptions = new \stdClass();
  94          $fakequestion->formoptions->movecontext = null;
  95          $fakequestion->formoptions->repeatelements = true;
  96          $fakequestion->inputs = null;
  97  
  98          $form = new $classname(new \moodle_url('/'), $fakequestion, $category,
  99                  new \core_question\local\bank\question_edit_contexts($syscontext));
 100  
 101          return [$form, $category];
 102      }
 103  
 104      public function test_get_illegal_tag_error() {
 105          list($form) = $this->get_form('\qtype_gapselect\form\qtype_gapselect_edit_form_base_testable');
 106  
 107          $this->assertEquals('', $form->get_illegal_tag_error('frog'));
 108          $this->assertEquals('', $form->get_illegal_tag_error('<i>toad</i>'));
 109  
 110          $a = new \stdClass();
 111          $a->tag = '&lt;ijk&gt;';
 112          $a->allowed = '&lt;sub&gt;, &lt;sup&gt;, &lt;b&gt;, &lt;i&gt;, &lt;em&gt;, &lt;strong&gt;, &lt;span&gt;';
 113          $this->assertEquals(get_string('tagsnotallowed', 'qtype_gapselect', $a), $form->get_illegal_tag_error('<ijk>'));
 114  
 115          $a->tag = '&lt;/cat&gt;';
 116          $this->assertEquals(get_string('tagsnotallowed', 'qtype_gapselect', $a), $form->get_illegal_tag_error('</cat>'));
 117  
 118          $a->tag = '&lt;br /&gt;';
 119          $this->assertEquals(get_string('tagsnotallowed', 'qtype_gapselect', $a), $form->get_illegal_tag_error('<i><br /></i>'));
 120  
 121          $form->set_allowed_tags(array());
 122  
 123          $this->assertEquals('', $form->get_illegal_tag_error('frog'));
 124  
 125          $a->tag = '&lt;i&gt;';
 126          $this->assertEquals(get_string('tagsnotallowedatall', 'qtype_gapselect', $a),
 127                  $form->get_illegal_tag_error('<i>toad</i>'));
 128  
 129          $a->tag = '&lt;ijk&gt;';
 130          $this->assertEquals(get_string('tagsnotallowedatall', 'qtype_gapselect', $a),
 131                  $form->get_illegal_tag_error('<ijk>'));
 132  
 133          $a->tag = '&lt;/cat&gt;';
 134          $this->assertEquals(get_string('tagsnotallowedatall', 'qtype_gapselect', $a),
 135                  $form->get_illegal_tag_error('</cat>'));
 136  
 137          $a->tag = '&lt;i&gt;';
 138          $this->assertEquals(get_string('tagsnotallowedatall', 'qtype_gapselect', $a),
 139                  $form->get_illegal_tag_error('<i><br /></i>'));
 140      }
 141  
 142      /**
 143       * Test the form shows the right number of groups of choices.
 144       */
 145      public function test_number_of_choice_groups() {
 146          list($form) = $this->get_form('qtype_gapselect_edit_form');
 147          // Use reflection to get the protected property we need.
 148          $property = new \ReflectionProperty('qtype_gapselect_edit_form', '_form');
 149          $property->setAccessible(true);
 150          $mform = $property->getValue($form);
 151          $choices = $mform->getElement('choices[0]');
 152          $groupoptions = $choices->_elements[1];
 153          $this->assertCount(20, $groupoptions->_options);
 154      }
 155  
 156      /**
 157       * Test the form correctly validates the HTML allowed in choices.
 158       */
 159      public function test_choices_validation() {
 160          list($form, $category) = $this->get_form('qtype_gapselect_edit_form');
 161  
 162          $submitteddata = [
 163                  'category' => $category->id,
 164                  'questiontext' => ['text' => 'Test [[1]] question [[2]]', 'format' => FORMAT_HTML],
 165                  'choices' => [
 166                          ['answer' => 'frog'],
 167                          ['answer' => '<b>toad</b>'],
 168                  ],
 169          ];
 170  
 171          $errors = $form->validation($submitteddata, []);
 172  
 173          $this->assertArrayNotHasKey('choices[0]', $errors);
 174          $this->assertEquals('&lt;b&gt; is not allowed. (No HTML is allowed here.)',
 175                  $errors['choices[1]']);
 176      }
 177  }