Moodle  2.2.1
http://www.collinsharper.com
C:/xampp/htdocs/moodle/question/engine/simpletest/helpers.php
Go to the documentation of this file.
00001 <?php
00002 // This file is part of Moodle - http://moodle.org/
00003 //
00004 // Moodle is free software: you can redistribute it and/or modify
00005 // it under the terms of the GNU General Public License as published by
00006 // the Free Software Foundation, either version 3 of the License, or
00007 // (at your option) any later version.
00008 //
00009 // Moodle is distributed in the hope that it will be useful,
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012 // GNU General Public License for more details.
00013 //
00014 // You should have received a copy of the GNU General Public License
00015 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
00016 
00027 defined('MOODLE_INTERNAL') || die();
00028 
00029 require_once(dirname(__FILE__) . '/../lib.php');
00030 
00031 
00038 class testable_question_attempt extends question_attempt {
00039     public function add_step($step) {
00040         parent::add_step($step);
00041     }
00042     public function set_min_fraction($fraction) {
00043         $this->minfraction = $fraction;
00044     }
00045     public function set_behaviour(question_behaviour $behaviour) {
00046         $this->behaviour = $behaviour;
00047     }
00048 }
00049 
00050 
00057 abstract class question_test_helper {
00063     abstract public function get_test_questions();
00064 }
00065 
00066 
00074 class test_question_maker {
00075     const STANDARD_OVERALL_CORRECT_FEEDBACK = 'Well done!';
00076     const STANDARD_OVERALL_PARTIALLYCORRECT_FEEDBACK =
00077             'Parts, but only parts, of your response are correct.';
00078     const STANDARD_OVERALL_INCORRECT_FEEDBACK = 'That is not right at all.';
00079 
00081     protected static $testhelpers = array();
00082 
00091     public function get_a_qa($question, $maxmark = 3) {
00092         return new question_attempt($question, 13, null, $maxmark);
00093     }
00094 
00098     public static function initialise_a_question($q) {
00099         global $USER;
00100 
00101         $q->id = 0;
00102         $q->category = 0;
00103         $q->parent = 0;
00104         $q->questiontextformat = FORMAT_HTML;
00105         $q->generalfeedbackformat = FORMAT_HTML;
00106         $q->defaultmark = 1;
00107         $q->penalty = 0.3333333;
00108         $q->length = 1;
00109         $q->stamp = make_unique_id_code();
00110         $q->version = make_unique_id_code();
00111         $q->hidden = 0;
00112         $q->timecreated = time();
00113         $q->timemodified = time();
00114         $q->createdby = $USER->id;
00115         $q->modifiedby = $USER->id;
00116     }
00117 
00118     public static function initialise_question_data($qdata) {
00119         global $USER;
00120 
00121         $qdata->id = 0;
00122         $qdata->category = 0;
00123         $qdata->contextid = 0;
00124         $qdata->parent = 0;
00125         $qdata->questiontextformat = FORMAT_HTML;
00126         $qdata->generalfeedbackformat = FORMAT_HTML;
00127         $qdata->defaultmark = 1;
00128         $qdata->penalty = 0.3333333;
00129         $qdata->length = 1;
00130         $qdata->stamp = make_unique_id_code();
00131         $qdata->version = make_unique_id_code();
00132         $qdata->hidden = 0;
00133         $qdata->timecreated = time();
00134         $qdata->timemodified = time();
00135         $qdata->createdby = $USER->id;
00136         $qdata->modifiedby = $USER->id;
00137         $qdata->hints = array();
00138     }
00139 
00140     public static function initialise_question_form_data($qdata) {
00141         $formdata = new stdClass();
00142         $formdata->id = 0;
00143         $formdata->category = '0,0';
00144         $formdata->usecurrentcat = 1;
00145         $formdata->categorymoveto = '0,0';
00146         $formdata->tags = array();
00147         $formdata->penalty = 0.3333333;
00148         $formdata->questiontextformat = FORMAT_HTML;
00149         $formdata->generalfeedbackformat = FORMAT_HTML;
00150     }
00151 
00157     public static function get_test_helper($qtype) {
00158         global $CFG;
00159 
00160         if (array_key_exists($qtype, self::$testhelpers)) {
00161             return self::$testhelpers[$qtype];
00162         }
00163 
00164         $file = get_plugin_directory('qtype', $qtype) . '/simpletest/helper.php';
00165         if (!is_readable($file)) {
00166             throw new coding_exception('Question type ' . $qtype .
00167                     ' does not have test helper code.');
00168         }
00169         include_once($file);
00170 
00171         $class = 'qtype_' . $qtype . '_test_helper';
00172         if (!class_exists($class)) {
00173             throw new coding_exception('Class ' . $class . ' is not defined in ' . $file);
00174         }
00175 
00176         self::$testhelpers[$qtype] = new $class();
00177         return self::$testhelpers[$qtype];
00178     }
00179 
00189     protected static function call_question_helper_method($methodtemplate, $qtype, $which = null) {
00190         $helper = self::get_test_helper($qtype);
00191 
00192         $available = $helper->get_test_questions();
00193 
00194         if (is_null($which)) {
00195             $which = reset($available);
00196         } else if (!in_array($which, $available)) {
00197             throw new coding_exception('Example question ' . $which . ' of type ' .
00198             $qtype . ' does not exist.');
00199         }
00200 
00201         $method = str_replace(array('{qtype}', '{which}'),
00202                                array($qtype,    $which), $methodtemplate);
00203 
00204         if (!method_exists($helper, $method)) {
00205             throw new coding_exception('Method ' . $method . ' does not exist on the' .
00206             $qtype . ' question type test helper class.');
00207         }
00208 
00209         return $helper->$method();
00210     }
00211 
00223     public static function make_question($qtype, $which = null) {
00224         return self::call_question_helper_method('make_{qtype}_question_{which}',
00225                 $qtype, $which);
00226     }
00227 
00237     public static function get_question_data($qtype, $which = null) {
00238         return self::call_question_helper_method('get_{qtype}_question_data_{which}',
00239                 $qtype, $which);
00240     }
00241 
00251     public static function get_question_form_data($qtype, $which = null) {
00252         return self::call_question_helper_method('get_{qtype}_question_form_data_{which}',
00253                 $qtype, $which);
00254     }
00255 
00261     public static function make_a_multichoice_single_question() {
00262         question_bank::load_question_definition_classes('multichoice');
00263         $mc = new qtype_multichoice_single_question();
00264         self::initialise_a_question($mc);
00265         $mc->name = 'Multi-choice question, single response';
00266         $mc->questiontext = 'The answer is A.';
00267         $mc->generalfeedback = 'You should have selected A.';
00268         $mc->qtype = question_bank::get_qtype('multichoice');
00269 
00270         $mc->shuffleanswers = 1;
00271         $mc->answernumbering = 'abc';
00272 
00273         $mc->answers = array(
00274             13 => new question_answer(13, 'A', 1, 'A is right', FORMAT_HTML),
00275             14 => new question_answer(14, 'B', -0.3333333, 'B is wrong', FORMAT_HTML),
00276             15 => new question_answer(15, 'C', -0.3333333, 'C is wrong', FORMAT_HTML),
00277         );
00278 
00279         return $mc;
00280     }
00281 
00287     public static function make_a_multichoice_multi_question() {
00288         question_bank::load_question_definition_classes('multichoice');
00289         $mc = new qtype_multichoice_multi_question();
00290         self::initialise_a_question($mc);
00291         $mc->name = 'Multi-choice question, multiple response';
00292         $mc->questiontext = 'The answer is A and C.';
00293         $mc->generalfeedback = 'You should have selected A and C.';
00294         $mc->qtype = question_bank::get_qtype('multichoice');
00295 
00296         $mc->shuffleanswers = 1;
00297         $mc->answernumbering = 'abc';
00298 
00299         self::set_standard_combined_feedback_fields($mc);
00300 
00301         $mc->answers = array(
00302             13 => new question_answer(13, 'A', 0.5, 'A is part of the right answer', FORMAT_HTML),
00303             14 => new question_answer(14, 'B', -1, 'B is wrong', FORMAT_HTML),
00304             15 => new question_answer(15, 'C', 0.5, 'C is part of the right answer', FORMAT_HTML),
00305             16 => new question_answer(16, 'D', -1, 'D is wrong', FORMAT_HTML),
00306         );
00307 
00308         return $mc;
00309     }
00310 
00317     public static function make_a_matching_question() {
00318         question_bank::load_question_definition_classes('match');
00319         $match = new qtype_match_question();
00320         self::initialise_a_question($match);
00321         $match->name = 'Matching question';
00322         $match->questiontext = 'Classify the animals.';
00323         $match->generalfeedback = 'Frogs and toads are amphibians, the others are mammals.';
00324         $match->qtype = question_bank::get_qtype('match');
00325 
00326         $match->shufflestems = 1;
00327 
00328         self::set_standard_combined_feedback_fields($match);
00329 
00330         // Using unset to get 1-based arrays.
00331         $match->stems = array('', 'Dog', 'Frog', 'Toad', 'Cat');
00332         $match->stemformat = array('', FORMAT_HTML, FORMAT_HTML, FORMAT_HTML, FORMAT_HTML);
00333         $match->choices = array('', 'Mammal', 'Amphibian', 'Insect');
00334         $match->right = array('', 1, 2, 2, 1);
00335         unset($match->stems[0]);
00336         unset($match->stemformat[0]);
00337         unset($match->choices[0]);
00338         unset($match->right[0]);
00339 
00340         return $match;
00341     }
00342 
00347     public static function make_an_essay_question() {
00348         question_bank::load_question_definition_classes('essay');
00349         $essay = new qtype_essay_question();
00350         self::initialise_a_question($essay);
00351         $essay->name = 'Essay question';
00352         $essay->questiontext = 'Write an essay.';
00353         $essay->generalfeedback = 'I hope you wrote an interesting essay.';
00354         $essay->penalty = 0;
00355         $essay->qtype = question_bank::get_qtype('essay');
00356 
00357         $essay->responseformat = 'editor';
00358         $essay->responsefieldlines = 15;
00359         $essay->attachments = 0;
00360         $essay->graderinfo = '';
00361         $essay->graderinfoformat = FORMAT_MOODLE;
00362 
00363         return $essay;
00364     }
00365 
00372     public static function set_standard_combined_feedback_fields($q) {
00373         $q->correctfeedback = self::STANDARD_OVERALL_CORRECT_FEEDBACK;
00374         $q->correctfeedbackformat = FORMAT_HTML;
00375         $q->partiallycorrectfeedback = self::STANDARD_OVERALL_PARTIALLYCORRECT_FEEDBACK;
00376         $q->partiallycorrectfeedbackformat = FORMAT_HTML;
00377         $q->shownumcorrect = true;
00378         $q->incorrectfeedback = self::STANDARD_OVERALL_INCORRECT_FEEDBACK;
00379         $q->incorrectfeedbackformat = FORMAT_HTML;
00380     }
00381 }
00382 
00383 
00390 abstract class testing_db_record_builder {
00391     public static function build_db_records(array $table) {
00392         $columns = array_shift($table);
00393         $records = array();
00394         foreach ($table as $row) {
00395             if (count($row) != count($columns)) {
00396                 throw new coding_exception("Row contains the wrong number of fields.");
00397             }
00398             $rec = new stdClass();
00399             foreach ($columns as $i => $name) {
00400                 $rec->$name = $row[$i];
00401             }
00402             $records[] = $rec;
00403         }
00404         return $records;
00405     }
00406 }
00407 
00408 
00416 class data_loading_method_test_base extends UnitTestCase {
00417     public function build_db_records(array $table) {
00418         return testing_db_record_builder::build_db_records($table);
00419     }
00420 }
00421 
00422 
00430 class qbehaviour_walkthrough_test_base extends UnitTestCase {
00432     protected $displayoptions;
00434     protected $quba;
00436     protected $slot;
00437 
00438     public function setUp() {
00439         $this->displayoptions = new question_display_options();
00440         $this->quba = question_engine::make_questions_usage_by_activity('unit_test',
00441                 get_context_instance(CONTEXT_SYSTEM));
00442     }
00443 
00444     public function tearDown() {
00445         $this->displayoptions = null;
00446         $this->quba = null;
00447     }
00448 
00449     protected function start_attempt_at_question($question, $preferredbehaviour,
00450             $maxmark = null, $variant = 1) {
00451         $this->quba->set_preferred_behaviour($preferredbehaviour);
00452         $this->slot = $this->quba->add_question($question, $maxmark);
00453         $this->quba->start_question($this->slot, $variant);
00454     }
00455     protected function process_submission($data) {
00456         $this->quba->process_action($this->slot, $data);
00457     }
00458 
00459     protected function manual_grade($comment, $mark) {
00460         $this->quba->manual_grade($this->slot, $comment, $mark);
00461     }
00462 
00463     protected function check_current_state($state) {
00464         $this->assertEqual($this->quba->get_question_state($this->slot), $state,
00465                 'Questions is in the wrong state: %s.');
00466     }
00467 
00468     protected function check_current_mark($mark) {
00469         if (is_null($mark)) {
00470             $this->assertNull($this->quba->get_question_mark($this->slot));
00471         } else {
00472             if ($mark == 0) {
00473                 // PHP will think a null mark and a mark of 0 are equal,
00474                 // so explicity check not null in this case.
00475                 $this->assertNotNull($this->quba->get_question_mark($this->slot));
00476             }
00477             $this->assertWithinMargin($mark, $this->quba->get_question_mark($this->slot),
00478                     0.000001, 'Expected mark and actual mark differ: %s.');
00479         }
00480     }
00481 
00485     protected function check_current_output() {
00486         $html = $this->quba->render_question($this->slot, $this->displayoptions);
00487         foreach (func_get_args() as $condition) {
00488             $this->assert($condition, $html);
00489         }
00490     }
00491 
00492     protected function get_question_attempt() {
00493         return $this->quba->get_question_attempt($this->slot);
00494     }
00495 
00496     protected function get_step_count() {
00497         return $this->get_question_attempt()->get_num_steps();
00498     }
00499 
00500     protected function check_step_count($expectednumsteps) {
00501         $this->assertEqual($expectednumsteps, $this->get_step_count());
00502     }
00503 
00504     protected function get_step($stepnum) {
00505         return $this->get_question_attempt()->get_step($stepnum);
00506     }
00507 
00508     protected function get_contains_question_text_expectation($question) {
00509         return new PatternExpectation('/' . preg_quote($question->questiontext) . '/');
00510     }
00511 
00512     protected function get_contains_general_feedback_expectation($question) {
00513         return new PatternExpectation('/' . preg_quote($question->generalfeedback) . '/');
00514     }
00515 
00516     protected function get_does_not_contain_correctness_expectation() {
00517         return new NoPatternExpectation('/class=\"correctness/');
00518     }
00519 
00520     protected function get_contains_correct_expectation() {
00521         return new PatternExpectation('/' . preg_quote(get_string('correct', 'question')) . '/');
00522     }
00523 
00524     protected function get_contains_partcorrect_expectation() {
00525         return new PatternExpectation('/' .
00526                 preg_quote(get_string('partiallycorrect', 'question')) . '/');
00527     }
00528 
00529     protected function get_contains_incorrect_expectation() {
00530         return new PatternExpectation('/' . preg_quote(get_string('incorrect', 'question')) . '/');
00531     }
00532 
00533     protected function get_contains_standard_correct_combined_feedback_expectation() {
00534         return new PatternExpectation('/' .
00535                 preg_quote(test_question_maker::STANDARD_OVERALL_CORRECT_FEEDBACK) . '/');
00536     }
00537 
00538     protected function get_contains_standard_partiallycorrect_combined_feedback_expectation() {
00539         return new PatternExpectation('/' .
00540                 preg_quote(test_question_maker::STANDARD_OVERALL_PARTIALLYCORRECT_FEEDBACK) . '/');
00541     }
00542 
00543     protected function get_contains_standard_incorrect_combined_feedback_expectation() {
00544         return new PatternExpectation('/' .
00545                 preg_quote(test_question_maker::STANDARD_OVERALL_INCORRECT_FEEDBACK) . '/');
00546     }
00547 
00548     protected function get_does_not_contain_feedback_expectation() {
00549         return new NoPatternExpectation('/class="feedback"/');
00550     }
00551 
00552     protected function get_does_not_contain_num_parts_correct() {
00553         return new NoPatternExpectation('/class="numpartscorrect"/');
00554     }
00555 
00556     protected function get_contains_num_parts_correct($num) {
00557         $a = new stdClass();
00558         $a->num = $num;
00559         return new PatternExpectation('/<div class="numpartscorrect">' .
00560                 preg_quote(get_string('yougotnright', 'question', $a)) . '/');
00561     }
00562 
00563     protected function get_does_not_contain_specific_feedback_expectation() {
00564         return new NoPatternExpectation('/class="specificfeedback"/');
00565     }
00566 
00567     protected function get_contains_validation_error_expectation() {
00568         return new ContainsTagWithAttribute('div', 'class', 'validationerror');
00569     }
00570 
00571     protected function get_does_not_contain_validation_error_expectation() {
00572         return new NoPatternExpectation('/class="validationerror"/');
00573     }
00574 
00575     protected function get_contains_mark_summary($mark) {
00576         $a = new stdClass();
00577         $a->mark = format_float($mark, $this->displayoptions->markdp);
00578         $a->max = format_float($this->quba->get_question_max_mark($this->slot),
00579                 $this->displayoptions->markdp);
00580         return new PatternExpectation('/' .
00581                 preg_quote(get_string('markoutofmax', 'question', $a)) . '/');
00582     }
00583 
00584     protected function get_contains_marked_out_of_summary() {
00585         $max = format_float($this->quba->get_question_max_mark($this->slot),
00586                 $this->displayoptions->markdp);
00587         return new PatternExpectation('/' .
00588                 preg_quote(get_string('markedoutofmax', 'question', $max)) . '/');
00589     }
00590 
00591     protected function get_does_not_contain_mark_summary() {
00592         return new NoPatternExpectation('/<div class="grade">/');
00593     }
00594 
00595     protected function get_contains_checkbox_expectation($baseattr, $enabled, $checked) {
00596         $expectedattributes = $baseattr;
00597         $forbiddenattributes = array();
00598         $expectedattributes['type'] = 'checkbox';
00599         if ($enabled === true) {
00600             $forbiddenattributes['disabled'] = 'disabled';
00601         } else if ($enabled === false) {
00602             $expectedattributes['disabled'] = 'disabled';
00603         }
00604         if ($checked === true) {
00605             $expectedattributes['checked'] = 'checked';
00606         } else if ($checked === false) {
00607             $forbiddenattributes['checked'] = 'checked';
00608         }
00609         return new ContainsTagWithAttributes('input', $expectedattributes, $forbiddenattributes);
00610     }
00611 
00612     protected function get_contains_mc_checkbox_expectation($index, $enabled = null,
00613             $checked = null) {
00614         return $this->get_contains_checkbox_expectation(array(
00615                 'name' => $this->quba->get_field_prefix($this->slot) . $index,
00616                 'value' => 1,
00617                 ), $enabled, $checked);
00618     }
00619 
00620     protected function get_contains_radio_expectation($baseattr, $enabled, $checked) {
00621         $expectedattributes = $baseattr;
00622         $forbiddenattributes = array();
00623         $expectedattributes['type'] = 'radio';
00624         if ($enabled === true) {
00625             $forbiddenattributes['disabled'] = 'disabled';
00626         } else if ($enabled === false) {
00627             $expectedattributes['disabled'] = 'disabled';
00628         }
00629         if ($checked === true) {
00630             $expectedattributes['checked'] = 'checked';
00631         } else if ($checked === false) {
00632             $forbiddenattributes['checked'] = 'checked';
00633         }
00634         return new ContainsTagWithAttributes('input', $expectedattributes, $forbiddenattributes);
00635     }
00636 
00637     protected function get_contains_mc_radio_expectation($index, $enabled = null, $checked = null) {
00638         return $this->get_contains_radio_expectation(array(
00639                 'name' => $this->quba->get_field_prefix($this->slot) . 'answer',
00640                 'value' => $index,
00641                 ), $enabled, $checked);
00642     }
00643 
00644     protected function get_contains_hidden_expectation($name, $value = null) {
00645         $expectedattributes = array('type' => 'hidden', 'name' => s($name));
00646         if (!is_null($value)) {
00647             $expectedattributes['value'] = s($value);
00648         }
00649         return new ContainsTagWithAttributes('input', $expectedattributes);
00650     }
00651 
00652     protected function get_does_not_contain_hidden_expectation($name, $value = null) {
00653         $expectedattributes = array('type' => 'hidden', 'name' => s($name));
00654         if (!is_null($value)) {
00655             $expectedattributes['value'] = s($value);
00656         }
00657         return new DoesNotContainTagWithAttributes('input', $expectedattributes);
00658     }
00659 
00660     protected function get_contains_tf_true_radio_expectation($enabled = null, $checked = null) {
00661         return $this->get_contains_radio_expectation(array(
00662                 'name' => $this->quba->get_field_prefix($this->slot) . 'answer',
00663                 'value' => 1,
00664                 ), $enabled, $checked);
00665     }
00666 
00667     protected function get_contains_tf_false_radio_expectation($enabled = null, $checked = null) {
00668         return $this->get_contains_radio_expectation(array(
00669                 'name' => $this->quba->get_field_prefix($this->slot) . 'answer',
00670                 'value' => 0,
00671                 ), $enabled, $checked);
00672     }
00673 
00674     protected function get_contains_cbm_radio_expectation($certainty, $enabled = null,
00675             $checked = null) {
00676         return $this->get_contains_radio_expectation(array(
00677                 'name' => $this->quba->get_field_prefix($this->slot) . '-certainty',
00678                 'value' => $certainty,
00679                 ), $enabled, $checked);
00680     }
00681 
00682     protected function get_contains_button_expectation($name, $value = null, $enabled = null) {
00683         $expectedattributes = array(
00684             'type' => 'submit',
00685             'name' => $name,
00686         );
00687         $forbiddenattributes = array();
00688         if (!is_null($value)) {
00689             $expectedattributes['value'] = $value;
00690         }
00691         if ($enabled === true) {
00692             $forbiddenattributes['disabled'] = 'disabled';
00693         } else if ($enabled === false) {
00694             $expectedattributes['disabled'] = 'disabled';
00695         }
00696         return new ContainsTagWithAttributes('input', $expectedattributes, $forbiddenattributes);
00697     }
00698 
00699     protected function get_contains_submit_button_expectation($enabled = null) {
00700         return $this->get_contains_button_expectation(
00701                 $this->quba->get_field_prefix($this->slot) . '-submit', null, $enabled);
00702     }
00703 
00704     protected function get_tries_remaining_expectation($n) {
00705         return new PatternExpectation('/' .
00706                 preg_quote(get_string('triesremaining', 'qbehaviour_interactive', $n)) . '/');
00707     }
00708 
00709     protected function get_invalid_answer_expectation() {
00710         return new PatternExpectation('/' .
00711                 preg_quote(get_string('invalidanswer', 'question')) . '/');
00712     }
00713 
00714     protected function get_contains_try_again_button_expectation($enabled = null) {
00715         $expectedattributes = array(
00716             'type' => 'submit',
00717             'name' => $this->quba->get_field_prefix($this->slot) . '-tryagain',
00718         );
00719         $forbiddenattributes = array();
00720         if ($enabled === true) {
00721             $forbiddenattributes['disabled'] = 'disabled';
00722         } else if ($enabled === false) {
00723             $expectedattributes['disabled'] = 'disabled';
00724         }
00725         return new ContainsTagWithAttributes('input', $expectedattributes, $forbiddenattributes);
00726     }
00727 
00728     protected function get_does_not_contain_try_again_button_expectation() {
00729         return new NoPatternExpectation('/name="' .
00730                 $this->quba->get_field_prefix($this->slot) . '-tryagain"/');
00731     }
00732 
00733     protected function get_contains_select_expectation($name, $choices,
00734             $selected = null, $enabled = null) {
00735         $fullname = $this->quba->get_field_prefix($this->slot) . $name;
00736         return new ContainsSelectExpectation($fullname, $choices, $selected, $enabled);
00737     }
00738 
00739     protected function get_mc_right_answer_index($mc) {
00740         $order = $mc->get_order($this->get_question_attempt());
00741         foreach ($order as $i => $ansid) {
00742             if ($mc->answers[$ansid]->fraction == 1) {
00743                 return $i;
00744             }
00745         }
00746         $this->fail('This multiple choice question does not seem to have a right answer!');
00747     }
00748 
00749     protected function get_no_hint_visible_expectation() {
00750         return new NoPatternExpectation('/class="hint"/');
00751     }
00752 
00753     protected function get_contains_hint_expectation($hinttext) {
00754         // Does not currently verify hint text.
00755         return new ContainsTagWithAttribute('div', 'class', 'hint');
00756     }
00757 }
 All Data Structures Namespaces Files Functions Variables Enumerations