MDL-47494 gapselect: More work on the ddwtos and gapselect qtypes.
authorTim Hunt <T.J.Hunt@open.ac.uk>
Mon, 31 Jan 2011 18:07:38 +0000 (18:07 +0000)
committerTim Hunt <T.J.Hunt@open.ac.uk>
Mon, 31 Jan 2011 18:07:38 +0000 (18:07 +0000)
Now there are no longer fatal errors that break other qtypes, but these two qtypes still not work completely. More to come.

question/type/gapselect/questionbase.php
question/type/gapselect/questiontypebase.php
question/type/gapselect/renderer.php
question/type/gapselect/rendererbase.php
question/type/gapselect/simpletest/testquestiontype.php
question/type/gapselect/simpletest/testwalkthrough.php
question/type/gapselect/styles.css

index 21fbf3b..52857ee 100755 (executable)
@@ -17,8 +17,8 @@
 
 
 /**
- * Definition class for embedded element in question text question. Parent of drag and drop and select from
- * drop down list and ?others? *
+ * Definition class for embedded element in question text question. Parent of
+ * gap-select, drag and drop and possibly others.
  *
  * @package qtype
  * @subpackage gapselect
@@ -34,7 +34,7 @@
  * @copyright 2009 The Open University
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
-class qtype_gapselect_question_base extends question_graded_automatically_with_countback {
+abstract class qtype_gapselect_question_base extends question_graded_automatically_with_countback {
     /** @var boolean Whether the question stems should be shuffled. */
     public $shufflechoices;
 
@@ -89,12 +89,12 @@ class qtype_gapselect_question_base extends question_graded_automatically_with_c
     }
 
     public function get_question_summary() {
-        $question = html_to_text($this->format_questiontext(), 0, false);
+        $question = $this->html_to_text($this->questiontext);
         $groups = array();
         foreach ($this->choices as $group => $choices) {
             $cs = array();
             foreach ($choices as $choice) {
-                $cs[] = html_to_text($this->format_text($choice->text), 0, false);
+                $cs[] = $this->html_to_text($choice->text);
             }
             $groups[] = '[[' . $group . ']] -> {' . implode(' / ', $cs) . '}';
         }
@@ -112,8 +112,8 @@ class qtype_gapselect_question_base extends question_graded_automatically_with_c
         foreach ($this->places as $place => $group) {
             if (array_key_exists($this->field($place), $response) &&
                     $response[$this->field($place)]) {
-                $choices[] = '{' . html_to_text($this->format_text($this->get_selected_choice(
-                        $group, $response[$this->field($place)])->text), 0, false) . '}';
+                $choices[] = '{' . $this->html_to_text($this->get_selected_choice(
+                        $group, $response[$this->field($place)])->text) . '}';
                 $allblank = false;
             } else {
                 $choices[] = '{}';
@@ -278,7 +278,7 @@ class qtype_gapselect_question_base extends question_graded_automatically_with_c
             $choiceno = $this->choiceorder[$group][$response[$fieldname]];
             $choice = $this->choices[$group][$choiceno];
             $parts[$place] = new question_classified_response(
-                    $choiceno, html_to_text($this->format_text($choice->text), 0, false),
+                    $choiceno, $this->html_to_text($choice->text),
                     $this->get_right_choice_for($place) == $response[$fieldname]);
         }
         return $parts;
index e0cc3d9..7b3b336 100755 (executable)
@@ -37,7 +37,7 @@ require_once($CFG->dirroot . '/question/format/xml/format.php');
  * @copyright 2009 The Open University
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
-class qtype_gapselect_base extends question_type {
+abstract class qtype_gapselect_base extends question_type {
     /**
      * Choices are stored in the question_answers table, and any options need to
      * be put into the feedback field somehow. This method is responsible for
@@ -93,7 +93,7 @@ class qtype_gapselect_base extends question_type {
         }
 
         $update = true;
-        $options = get_record('question_'.$this->name(), 'questionid', $question->id);
+        $options = get_record('question_' . $this->name(), 'questionid', $question->id);
         if (!$options) {
             $update = false;
             $options = new stdClass;
@@ -152,10 +152,7 @@ class qtype_gapselect_base extends question_type {
 
         $question->shufflechoices = $questiondata->options->shuffleanswers;
 
-        $question->correctfeedback = $questiondata->options->correctfeedback;
-        $question->partiallycorrectfeedback = $questiondata->options->partiallycorrectfeedback;
-        $question->incorrectfeedback = $questiondata->options->incorrectfeedback;
-        $question->shownumcorrect = $questiondata->options->shownumcorrect;
+        $this->initialise_combined_feedback($question, $questiondata, true);
 
         $question->choices = array();
         $choiceindexmap= array();
@@ -235,7 +232,8 @@ class qtype_gapselect_base extends question_type {
         return $answers;
     }
 
-    /* This method gets the choices (answers) and sort them by groups
+    /**
+     * This method gets the choices (answers) and sort them by groups
      * in a 2 dimentional array.
      *
      * @param object $question
@@ -244,10 +242,10 @@ class qtype_gapselect_base extends question_type {
     protected function get_array_of_groups($question, $state) {
         $answers = $this->get_array_of_choices($question);
         $arr = array();
-        for($group=1;$group<count($answers);$group++) {
-            $players = $this->get_group_of_players ($question, $state, $answers, $group);
-            if($players) {
-                $arr [$group]= $players;
+        for ($group=1; $group < count($answers); $group++) {
+            $players = $this->get_group_of_players($question, $state, $answers, $group);
+            if ($players) {
+                $arr[$group]= $players;
             }
         }
         return $arr;
@@ -322,7 +320,7 @@ class qtype_gapselect_base extends question_type {
 
             foreach ($question->choices[$group] as $i => $choice) {
                 $choices[$i] = new question_possible_response(
-                        html_to_text($question->format_text($choice->text), 0, false),
+                        $question->html_to_text($choice->text),
                         $question->rightchoices[$place] == $i);
             }
             $choices[null] = question_possible_response::no_response();
index 62f1447..c5b8a7e 100755 (executable)
@@ -45,8 +45,8 @@ class qtype_gapselect_renderer extends qtype_elements_embedded_in_question_text_
 
         $attributes = array(
             'id' => $this->box_id($qa, 'p' . $place, $group),
-            'class' => 'group' . $group
         );
+        $groupclass = 'group' . $group;
 
         if ($options->readonly) {
             $attributes['disabled'] = 'disabled';
@@ -68,7 +68,8 @@ class qtype_gapselect_renderer extends qtype_elements_embedded_in_question_text_
             }
         }
 
-        return html_writer::select($selectoptions, $qa->get_qt_field_name($fieldname), $value, ' ', $attributes) . ' ' . $feedbackimage;
+        $selecthtml = html_writer::select($selectoptions, $qa->get_qt_field_name($fieldname), $value, ' ', $attributes) . ' ' . $feedbackimage;
+        return html_writer::tag('span', $selecthtml, array('class' => 'control '.$groupclass));
     }
 
 }
index 283b5b5..9d9170d 100755 (executable)
@@ -3,7 +3,7 @@
  * Generates the output for question types where the question includes embedded interactive elements in the
  * question text.
  *
- * @copyright 2010 The Open University
+ * @copyright 2011 The Open University
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 abstract class qtype_elements_embedded_in_question_text_renderer extends qtype_with_combined_feedback_renderer {
@@ -20,9 +20,9 @@ abstract class qtype_elements_embedded_in_question_text_renderer extends qtype_w
             $questiontext .= $fragment;
         }
 
-
         $result = '';
-        $result .= html_writer::tag('div', $question->format_text($questiontext),
+        $result .= html_writer::tag('div', $question->format_text($questiontext,
+                $qa, 'question', 'questiontext', $question->id),
                 array('class' => $this->qtext_classname(), 'id' => $qa->get_qt_field_name('')));
 
         $result .= $this->post_qtext_elements($qa, $options);
index 1cfcfcb..dc8b364 100755 (executable)
@@ -20,7 +20,7 @@
  * Unit tests for the select missing words question question definition class.
  *
  * @package qtype_gapselect
- * @copyright 2010 The Open University
+ * @copyright 2011 The Open University
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
index 26b0cc6..e3dc5d0 100755 (executable)
@@ -32,6 +32,111 @@ require_once($CFG->dirroot . '/question/type/gapselect/simpletest/helper.php');
 
 
 class qtype_gapselect_walkthrough_test extends qbehaviour_walkthrough_test_base {
+    public function test_interactive_behaviour() {
 
+        // Create a gapselect question.
+        $q = qtype_gapselect_test_helper::make_a_gapselect_question();
+        $q->hints = array(
+            new question_hint_with_parts('This is the first hint.', false, false),
+            new question_hint_with_parts('This is the second hint.', true, true),
+        );
+        $ql->shufflechoices = false;
+        $this->start_attempt_at_question($q, 'interactive', 3);
 
+        // Check the initial state.
+        $this->check_current_state(question_state::$todo);
+        $this->check_current_mark(null);
+        $this->check_current_output(
+                $this->get_contains_select_expectation('p1',
+                                array('' => ' ', '1' => 'quick', '2' => 'slow'), null, true),
+                $this->get_contains_select_expectation('p2',
+                                array('' => ' ', '1' => 'fox', '2' => 'dog'), null, true),
+                $this->get_contains_select_expectation('p3',
+                                array('' => ' ', '1' => 'lazy', '2' => 'assiduous'), null, true),
+                $this->get_contains_submit_button_expectation(true),
+                $this->get_does_not_contain_feedback_expectation(),
+                $this->get_tries_remaining_expectation(3),
+                $this->get_no_hint_visible_expectation());
+
+        // Save the wrong answer.
+        $this->process_submission(array('p1' => '2', 'p2' => '2', 'p3' => '2'));
+
+        // Verify.
+        $this->check_current_state(question_state::$todo);
+        $this->check_current_mark(null);
+        $this->check_current_output(
+                $this->get_contains_select_expectation('p1',
+                                array('' => ' ', '1' => 'quick', '2' => 'slow'), 2, true),
+                $this->get_contains_select_expectation('p2',
+                                array('' => ' ', '1' => 'fox', '2' => 'dog'), 2, true),
+                $this->get_contains_select_expectation('p3',
+                                array('' => ' ', '1' => 'lazy', '2' => 'assiduous'), 2, true),
+                $this->get_contains_submit_button_expectation(true),
+                $this->get_does_not_contain_correctness_expectation(),
+                $this->get_does_not_contain_feedback_expectation(),
+                $this->get_tries_remaining_expectation(3),
+                $this->get_no_hint_visible_expectation());
+
+        // Submit the wrong answer.
+        $this->process_submission(array('p1' => '2', 'p2' => '2', 'p3' => '2', '-submit' => 1));
+
+        // Verify.
+        $this->check_current_state(question_state::$todo);
+        $this->check_current_mark(null);
+        $this->check_current_output(
+                $this->get_contains_select_expectation('p1',
+                                array('' => ' ', '1' => 'quick', '2' => 'slow'), 2, false),
+                $this->get_contains_select_expectation('p2',
+                                array('' => ' ', '1' => 'fox', '2' => 'dog'), 2, false),
+                $this->get_contains_select_expectation('p3',
+                                array('' => ' ', '1' => 'lazy', '2' => 'assiduous'), 2, false),
+                        $this->get_contains_submit_button_expectation(false),
+                $this->get_contains_try_again_button_expectation(true),
+                $this->get_does_not_contain_correctness_expectation(),
+                new PatternExpectation('/' . preg_quote(get_string('notcomplete', 'qbehaviour_interactive')) . '/'),
+                $this->get_contains_hint_expectation('This is the first hint'));
+
+        // Do try again.
+        $this->process_submission(array('-tryagain' => 1));
+
+        // Verify.
+        $this->check_current_state(question_state::$todo);
+        $this->check_current_mark(null);
+        $this->check_current_output(
+                $this->get_contains_select_expectation('p1',
+                                array('' => ' ', '1' => 'quick', '2' => 'slow'), 2, true),
+                $this->get_contains_select_expectation('p2',
+                                array('' => ' ', '1' => 'fox', '2' => 'dog'), 2, true),
+                $this->get_contains_select_expectation('p3',
+                                array('' => ' ', '1' => 'lazy', '2' => 'assiduous'), 2, true),
+                $this->get_contains_submit_button_expectation(true),
+                $this->get_does_not_contain_correctness_expectation(),
+                $this->get_does_not_contain_feedback_expectation(),
+                $this->get_tries_remaining_expectation(2),
+                $this->get_no_hint_visible_expectation());
+
+        // Submit the right answer.
+        $this->process_submission(array('p1' => '1', 'p2' => '1', 'p3' => '1', '-submit' => 1));
+
+        // Verify.
+        $this->check_current_state(question_state::$gradedright);
+        $this->check_current_mark(2);
+        $this->check_current_output(
+                $this->get_contains_select_expectation('p1',
+                                array('' => ' ', '1' => 'quick', '2' => 'slow'), 1, false),
+                $this->get_contains_select_expectation('p2',
+                                array('' => ' ', '1' => 'fox', '2' => 'dog'), 1, false),
+                $this->get_contains_select_expectation('p3',
+                                array('' => ' ', '1' => 'lazy', '2' => 'assiduous'), 1, false),
+                $this->get_contains_submit_button_expectation(false),
+                $this->get_contains_correct_expectation(),
+                $this->get_no_hint_visible_expectation());
+
+        // Check regrading does not mess anything up.
+        $this->quba->regrade_all_questions();
+
+        // Verify.
+        $this->check_current_state(question_state::$gradedright);
+        $this->check_current_mark(2);
+    }
 }
index 09f1c14..309b3b2 100755 (executable)
@@ -39,3 +39,6 @@
 .que.gapselect .group8 {
     background-color: #F0E68C;
 }
+.que.sddl .control {
+    padding: 0.2em;
+}