]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-11703 - escaped *'s in shortanswer answers were not matching properly. Merged...
authortjhunt <tjhunt>
Wed, 10 Oct 2007 15:26:45 +0000 (15:26 +0000)
committertjhunt <tjhunt>
Wed, 10 Oct 2007 15:26:45 +0000 (15:26 +0000)
question/type/shortanswer/questiontype.php
question/type/shortanswer/simpletest/testquestiontype.php [new file with mode: 0644]

index 5637a302712acdc4390a8ff93505629441cdf296..ffa1b40a5189503300ebe37fbca2483386d35166 100644 (file)
@@ -212,9 +212,12 @@ class question_shortanswer_qtype extends default_questiontype {
         // Break the string on non-escaped asterisks.
         $bits = preg_split('/(?<!\\\\)\*/', $pattern);
         // Escape regexp special characters in the bits.
-        $bits = array_map('preg_quote', $bits);
+        $excapedbits = array();
+        foreach ($bits as $bit) {
+            $excapedbits[] = preg_quote(str_replace('\*', '*', $bit));
+        }
         // Put it back together to make the regexp.
-        $regexp = '|^' . implode('.*', $bits) . '$|u';
+        $regexp = '|^' . implode('.*', $excapedbits) . '$|u';
 
         // Make the match insensitive if requested to.
         if ($ignorecase) {
diff --git a/question/type/shortanswer/simpletest/testquestiontype.php b/question/type/shortanswer/simpletest/testquestiontype.php
new file mode 100644 (file)
index 0000000..380a974
--- /dev/null
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Unit tests for (some of) question/type/shortanswer/questiontype.php.
+ *
+ * @copyright &copy; 2007 The Open University
+ * @author T.J.Hunt@open.ac.uk
+ * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
+ * @package question
+ */
+
+if (!defined('MOODLE_INTERNAL')) {
+    die('Direct access to this script is forbidden.');    ///  It must be included from a Moodle page
+}
+
+require_once($CFG->dirroot . '/question/type/questiontype.php');
+
+class question_shortanswer_qtype_test extends UnitTestCase {
+    var $qtype;
+    
+    function setUp() {
+        $this->qtype = new question_shortanswer_qtype();
+    }
+    
+    function tearDown() {
+        $this->qtype = null;   
+    }
+
+    function test_name() {
+        $this->assertEqual($this->qtype->name(), 'shortanswer');
+    }
+
+    function test_compare_string_with_wildcard() {
+        // Test case sensitive literal matches.
+        $this->assertTrue($this->qtype->compare_string_with_wildcard('Frog', 'Frog', false));
+        $this->assertFalse($this->qtype->compare_string_with_wildcard('Frog', 'frog', false));
+        $this->assertTrue($this->qtype->compare_string_with_wildcard('   Frog   ', 'Frog', false));
+        $this->assertFalse($this->qtype->compare_string_with_wildcard('Frogs', 'Frog', false));
+
+        // Test case insensitive literal matches.
+        $this->assertTrue($this->qtype->compare_string_with_wildcard('Frog', 'frog', true));
+        $this->assertTrue($this->qtype->compare_string_with_wildcard('   FROG   ', 'Frog', true));
+        $this->assertFalse($this->qtype->compare_string_with_wildcard('Frogs', 'Frog', true));
+
+        // Test case sensitive wildcard matches.
+        $this->assertTrue($this->qtype->compare_string_with_wildcard('Frog', 'F*og', false));
+        $this->assertTrue($this->qtype->compare_string_with_wildcard('Fog', 'F*og', false));
+        $this->assertTrue($this->qtype->compare_string_with_wildcard('   Fat dog   ', 'F*og', false));
+        $this->assertFalse($this->qtype->compare_string_with_wildcard('Frogs', 'F*og', false));
+        $this->assertFalse($this->qtype->compare_string_with_wildcard('Fg', 'F*og', false));
+        $this->assertFalse($this->qtype->compare_string_with_wildcard('frog', 'F*og', false));
+        $this->assertFalse($this->qtype->compare_string_with_wildcard('   fat dog   ', 'F*og', false));
+
+        // Test case insensitive wildcard matches.
+        $this->assertTrue($this->qtype->compare_string_with_wildcard('Frog', 'F*og', true));
+        $this->assertTrue($this->qtype->compare_string_with_wildcard('Fog', 'F*og', true));
+        $this->assertTrue($this->qtype->compare_string_with_wildcard('   Fat dog   ', 'F*og', true));
+        $this->assertFalse($this->qtype->compare_string_with_wildcard('Frogs', 'F*og', true));
+        $this->assertFalse($this->qtype->compare_string_with_wildcard('Fg', 'F*og', true));
+        $this->assertTrue($this->qtype->compare_string_with_wildcard('frog', 'F*og', true));
+        $this->assertTrue($this->qtype->compare_string_with_wildcard('   fat dog   ', 'F*og', true));
+
+        // Test match using regexp special chars.
+        $this->assertTrue($this->qtype->compare_string_with_wildcard('   *   ', '\*', false));
+        $this->assertTrue($this->qtype->compare_string_with_wildcard('*', '\*', false));
+        $this->assertTrue($this->qtype->compare_string_with_wildcard('Frog*toad', 'Frog\*toad', false));
+        $this->assertfalse($this->qtype->compare_string_with_wildcard('a', '[a-z]', false));
+        $this->assertTrue($this->qtype->compare_string_with_wildcard('[a-z]', '[a-z]', false));
+        $this->assertTrue($this->qtype->compare_string_with_wildcard('\{}/', '\{}/', true));
+    }
+}
+
+?>