From 2a040c2839c71643617d635bcb10f176f3d822e7 Mon Sep 17 00:00:00 2001 From: Tim Hunt Date: Tue, 17 Jan 2012 15:38:14 +0000 Subject: [PATCH] MDL-31065 qtype shortanswer: refactor the unit tests to use a proper helper. Conflicts: question/behaviour/adaptive/simpletest/testwalkthrough.php --- .../adaptive/simpletest/testwalkthrough.php | 8 +- .../simpletest/testwalkthrough.php | 2 +- .../simpletest/testwalkthrough.php | 6 +- question/engine/simpletest/helpers.php | 23 --- .../type/shortanswer/simpletest/helper.php | 133 ++++++++++++++++++ .../shortanswer/simpletest/testquestion.php | 16 +-- .../simpletest/testquestiontype.php | 21 ++- .../truefalse/simpletest/testquestiontype.php | 2 +- 8 files changed, 160 insertions(+), 51 deletions(-) create mode 100644 question/type/shortanswer/simpletest/helper.php diff --git a/question/behaviour/adaptive/simpletest/testwalkthrough.php b/question/behaviour/adaptive/simpletest/testwalkthrough.php index 6c49915990e..1ef956fee17 100644 --- a/question/behaviour/adaptive/simpletest/testwalkthrough.php +++ b/question/behaviour/adaptive/simpletest/testwalkthrough.php @@ -223,7 +223,7 @@ class qbehaviour_adaptive_walkthrough_test extends qbehaviour_walkthrough_test_b public function test_adaptive_shortanswer_partially_right() { // Create a short answer question - $sa = test_question_maker::make_a_shortanswer_question(); + $sa = test_question_maker::make_question('shortanswer'); $this->start_attempt_at_question($sa, 'adaptive'); // Check the initial state. @@ -289,7 +289,7 @@ class qbehaviour_adaptive_walkthrough_test extends qbehaviour_walkthrough_test_b public function test_adaptive_shortanswer_wrong_right_wrong() { // Create a short answer question - $sa = test_question_maker::make_a_shortanswer_question(); + $sa = test_question_maker::make_question('shortanswer'); $this->start_attempt_at_question($sa, 'adaptive'); // Check the initial state. @@ -368,7 +368,7 @@ class qbehaviour_adaptive_walkthrough_test extends qbehaviour_walkthrough_test_b public function test_adaptive_shortanswer_invalid_after_complete() { // Create a short answer question - $sa = test_question_maker::make_a_shortanswer_question(); + $sa = test_question_maker::make_question('shortanswer'); $this->start_attempt_at_question($sa, 'adaptive'); // Check the initial state. @@ -446,7 +446,7 @@ class qbehaviour_adaptive_walkthrough_test extends qbehaviour_walkthrough_test_b public function test_adaptive_shortanswer_try_to_submit_blank() { // Create a short answer question with correct answer true. - $sa = test_question_maker::make_a_shortanswer_question(); + $sa = test_question_maker::make_question('shortanswer'); $this->start_attempt_at_question($sa, 'adaptive'); // Check the initial state. diff --git a/question/behaviour/immediatecbm/simpletest/testwalkthrough.php b/question/behaviour/immediatecbm/simpletest/testwalkthrough.php index 7724a84de80..0cf3d5e480c 100644 --- a/question/behaviour/immediatecbm/simpletest/testwalkthrough.php +++ b/question/behaviour/immediatecbm/simpletest/testwalkthrough.php @@ -188,7 +188,7 @@ class qbehaviour_immediatecbm_walkthrough_test extends qbehaviour_walkthrough_te public function test_immediatecbm_feedback_shortanswer_try_to_submit_no_certainty() { // Create a short answer question with correct answer true. - $sa = test_question_maker::make_a_shortanswer_question(); + $sa = test_question_maker::make_question('shortanswer'); $this->start_attempt_at_question($sa, 'immediatecbm'); // Check the initial state. diff --git a/question/behaviour/interactive/simpletest/testwalkthrough.php b/question/behaviour/interactive/simpletest/testwalkthrough.php index 7f7f2e14bcb..4a4bea560b6 100644 --- a/question/behaviour/interactive/simpletest/testwalkthrough.php +++ b/question/behaviour/interactive/simpletest/testwalkthrough.php @@ -244,7 +244,7 @@ class qbehaviour_interactive_walkthrough_test extends qbehaviour_walkthrough_tes public function test_interactive_shortanswer_try_to_submit_blank() { // Create a short answer question. - $sa = test_question_maker::make_a_shortanswer_question(); + $sa = test_question_maker::make_question('shortanswer'); $sa->hints = array( new question_hint(0, 'This is the first hint.', FORMAT_HTML), new question_hint(0, 'This is the second hint.', FORMAT_HTML), @@ -420,7 +420,7 @@ class qbehaviour_interactive_walkthrough_test extends qbehaviour_walkthrough_tes public function test_interactive_regrade_changing_num_tries_leaving_open() { // Create a multichoice multiple question. - $q = test_question_maker::make_a_shortanswer_question(); + $q = test_question_maker::make_question('shortanswer'); $q->hints = array( new question_hint_with_parts(0, 'This is the first hint.', FORMAT_HTML, true, true), new question_hint_with_parts(0, 'This is the second hint.', FORMAT_HTML, true, true), @@ -453,7 +453,7 @@ class qbehaviour_interactive_walkthrough_test extends qbehaviour_walkthrough_tes public function test_interactive_regrade_changing_num_tries_finished() { // Create a multichoice multiple question. - $q = test_question_maker::make_a_shortanswer_question(); + $q = test_question_maker::make_question('shortanswer'); $q->hints = array( new question_hint_with_parts(0, 'This is the first hint.', FORMAT_HTML, true, true), new question_hint_with_parts(0, 'This is the second hint.', FORMAT_HTML, true, true), diff --git a/question/engine/simpletest/helpers.php b/question/engine/simpletest/helpers.php index 86b744425be..6b43ba35574 100644 --- a/question/engine/simpletest/helpers.php +++ b/question/engine/simpletest/helpers.php @@ -340,29 +340,6 @@ class test_question_maker { return $match; } - /** - * Makes a shortanswer question with correct ansewer 'frog', partially - * correct answer 'toad' and defaultmark 1. - * @return qtype_shortanswer_question - */ - public static function make_a_shortanswer_question() { - question_bank::load_question_definition_classes('shortanswer'); - $sa = new qtype_shortanswer_question(); - self::initialise_a_question($sa); - $sa->name = 'Short answer question'; - $sa->questiontext = 'Name an amphibian: __________'; - $sa->generalfeedback = 'Generalfeedback: frog or toad would have been OK.'; - $sa->usecase = false; - $sa->answers = array( - 13 => new question_answer(13, 'frog', 1.0, 'Frog is a very good answer.', FORMAT_HTML), - 14 => new question_answer(14, 'toad', 0.8, 'Toad is an OK good answer.', FORMAT_HTML), - 15 => new question_answer(15, '*', 0.0, 'That is a bad answer.', FORMAT_HTML), - ); - $sa->qtype = question_bank::get_qtype('shortanswer'); - - return $sa; - } - /** * Makes a truefalse question with correct ansewer true, defaultmark 1. * @return qtype_essay_question diff --git a/question/type/shortanswer/simpletest/helper.php b/question/type/shortanswer/simpletest/helper.php new file mode 100644 index 00000000000..71a0f409111 --- /dev/null +++ b/question/type/shortanswer/simpletest/helper.php @@ -0,0 +1,133 @@ +. + +/** + * Test helpers for the shortanswer question type. + * + * @package qtype_shortanswer + * @copyright 2012 The Open University + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + + +defined('MOODLE_INTERNAL') || die(); + + +/** + * Test helper class for the shortanswer question type. + * + * @copyright 2011 The Open University + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class qtype_shortanswer_test_helper extends question_test_helper { + public function get_test_questions() { + return array('frogtoad', 'frogonly'); + } + + /** + * Makes a shortanswer question with correct ansewer 'frog', partially + * correct answer 'toad' and defaultmark 1. This question also has a + * '*' match anything answer. + * @return qtype_shortanswer_question + */ + public function make_shortanswer_question_frogtoad() { + question_bank::load_question_definition_classes('shortanswer'); + $sa = new qtype_shortanswer_question(); + test_question_maker::initialise_a_question($sa); + $sa->name = 'Short answer question'; + $sa->questiontext = 'Name an amphibian: __________'; + $sa->generalfeedback = 'Generalfeedback: frog or toad would have been OK.'; + $sa->usecase = false; + $sa->answers = array( + 13 => new question_answer(13, 'frog', 1.0, 'Frog is a very good answer.', FORMAT_HTML), + 14 => new question_answer(14, 'toad', 0.8, 'Toad is an OK good answer.', FORMAT_HTML), + 15 => new question_answer(15, '*', 0.0, 'That is a bad answer.', FORMAT_HTML), + ); + $sa->qtype = question_bank::get_qtype('shortanswer'); + + return $sa; + } + + /** + * Gets the question data for a shortanswer question with with correct + * ansewer 'frog', partially correct answer 'toad' and defaultmark 1. + * This question also has a '*' match anything answer. + * @return stdClass + */ + public function get_shortanswer_question_data_frogtoad() { + $qdata = new stdClass(); + test_question_maker::initialise_question_data($qdata); + + $qdata->qtype = 'shortanswer'; + $qdata->name = 'Short answer question'; + $qdata->questiontext = 'Name an amphibian: __________'; + $qdata->generalfeedback = 'Generalfeedback: frog or toad would have been OK.'; + + $qdata->options = new stdClass(); + $qdata->options->usecase = false; + $qdata->options->answers = array( + 13 => new question_answer(13, 'frog', 1.0, 'Frog is a very good answer.', FORMAT_HTML), + 14 => new question_answer(14, 'toad', 0.8, 'Toad is an OK good answer.', FORMAT_HTML), + 15 => new question_answer(15, '*', 0.0, 'That is a bad answer.', FORMAT_HTML), + ); + + return $qdata; + } + + /** + * Makes a shortanswer question with just the correct ansewer 'frog', and + * no other answer matching. + * @return qtype_shortanswer_question + */ + public function make_shortanswer_question_frogonly() { + question_bank::load_question_definition_classes('shortanswer'); + $sa = new qtype_shortanswer_question(); + test_question_maker::initialise_a_question($sa); + $sa->name = 'Short answer question'; + $sa->questiontext = 'Name the best amphibian: __________'; + $sa->generalfeedback = 'Generalfeedback: you should have said frog.'; + $sa->usecase = false; + $sa->answers = array( + 13 => new question_answer(13, 'frog', 1.0, 'Frog is right.', FORMAT_HTML), + ); + $sa->qtype = question_bank::get_qtype('shortanswer'); + + return $sa; + } + + /** + * Gets the question data for a shortanswer questionwith just the correct + * ansewer 'frog', and no other answer matching. + * @return stdClass + */ + public function get_shortanswer_question_data_frogonly() { + $qdata = new stdClass(); + test_question_maker::initialise_question_data($qdata); + + $qdata->qtype = 'shortanswer'; + $qdata->name = 'Short answer question'; + $qdata->questiontext = 'Name the best amphibian: __________'; + $qdata->generalfeedback = 'Generalfeedback: you should have said frog.'; + + $qdata->options = new stdClass(); + $qdata->options->usecase = false; + $qdata->options->answers = array( + 13 => new question_answer(13, 'frog', 1.0, 'Frog is right.', FORMAT_HTML), + ); + + return $qdata; + } +} diff --git a/question/type/shortanswer/simpletest/testquestion.php b/question/type/shortanswer/simpletest/testquestion.php index afd66efb5fa..5585b5a7dd3 100644 --- a/question/type/shortanswer/simpletest/testquestion.php +++ b/question/type/shortanswer/simpletest/testquestion.php @@ -26,8 +26,8 @@ defined('MOODLE_INTERNAL') || die(); -require_once($CFG->dirroot . '/question/type/shortanswer/question.php'); require_once($CFG->dirroot . '/question/engine/simpletest/helpers.php'); +require_once($CFG->dirroot . '/question/type/shortanswer/question.php'); /** @@ -108,7 +108,7 @@ class qtype_shortanswer_question_test extends UnitTestCase { } public function test_is_complete_response() { - $question = test_question_maker::make_a_shortanswer_question(); + $question = test_question_maker::make_question('shortanswer'); $this->assertFalse($question->is_complete_response(array())); $this->assertFalse($question->is_complete_response(array('answer' => ''))); @@ -118,7 +118,7 @@ class qtype_shortanswer_question_test extends UnitTestCase { } public function test_is_gradable_response() { - $question = test_question_maker::make_a_shortanswer_question(); + $question = test_question_maker::make_question('shortanswer'); $this->assertFalse($question->is_gradable_response(array())); $this->assertFalse($question->is_gradable_response(array('answer' => ''))); @@ -128,7 +128,7 @@ class qtype_shortanswer_question_test extends UnitTestCase { } public function test_grading() { - $question = test_question_maker::make_a_shortanswer_question(); + $question = test_question_maker::make_question('shortanswer'); $this->assertEqual(array(0, question_state::$gradedwrong), $question->grade_response(array('answer' => 'x'))); @@ -139,26 +139,26 @@ class qtype_shortanswer_question_test extends UnitTestCase { } public function test_get_correct_response() { - $question = test_question_maker::make_a_shortanswer_question(); + $question = test_question_maker::make_question('shortanswer'); $this->assertEqual(array('answer' => 'frog'), $question->get_correct_response()); } public function test_get_question_summary() { - $sa = test_question_maker::make_a_shortanswer_question(); + $sa = test_question_maker::make_question('shortanswer'); $qsummary = $sa->get_question_summary(); $this->assertEqual('Name an amphibian: __________', $qsummary); } public function test_summarise_response() { - $sa = test_question_maker::make_a_shortanswer_question(); + $sa = test_question_maker::make_question('shortanswer'); $summary = $sa->summarise_response(array('answer' => 'dog')); $this->assertEqual('dog', $summary); } public function test_classify_response() { - $sa = test_question_maker::make_a_shortanswer_question(); + $sa = test_question_maker::make_question('shortanswer'); $sa->start_attempt(new question_attempt_step(), 1); $this->assertEqual(array( diff --git a/question/type/shortanswer/simpletest/testquestiontype.php b/question/type/shortanswer/simpletest/testquestiontype.php index 711dc751afd..ce554d563cd 100644 --- a/question/type/shortanswer/simpletest/testquestiontype.php +++ b/question/type/shortanswer/simpletest/testquestiontype.php @@ -27,6 +27,7 @@ defined('MOODLE_INTERNAL') || die(); require_once($CFG->dirroot . '/question/type/shortanswer/questiontype.php'); +require_once($CFG->dirroot . '/question/engine/simpletest/helpers.php'); /** @@ -52,12 +53,7 @@ class qtype_shortanswer_test extends UnitTestCase { } protected function get_test_question_data() { - $q = new stdClass(); - $q->id = 1; - $q->options->answers[1] = (object) array('answer' => 'frog', 'fraction' => 1); - $q->options->answers[2] = (object) array('answer' => '*', 'fraction' => 0.1); - - return $q; + return test_question_maker::get_question_data('shortanswer'); } public function test_name() { @@ -69,18 +65,21 @@ class qtype_shortanswer_test extends UnitTestCase { } public function test_get_random_guess_score() { - $q = $this->get_test_question_data(); + $q = test_question_maker::get_question_data('shortanswer'); + $q->options->answers[15]->fraction = 0.1; $this->assertEqual(0.1, $this->qtype->get_random_guess_score($q)); } public function test_get_possible_responses() { - $q = $this->get_test_question_data(); + $q = test_question_maker::get_question_data('shortanswer'); $this->assertEqual(array( $q->id => array( - 1 => new question_possible_response('frog', 1), - 2 => new question_possible_response('*', 0.1), - null => question_possible_response::no_response()), + 13 => new question_possible_response('frog', 1), + 14 => new question_possible_response('toad', 0.8), + 15 => new question_possible_response('*', 0), + null => question_possible_response::no_response() + ), ), $this->qtype->get_possible_responses($q)); } } diff --git a/question/type/truefalse/simpletest/testquestiontype.php b/question/type/truefalse/simpletest/testquestiontype.php index bfc493aa742..d71aced0400 100644 --- a/question/type/truefalse/simpletest/testquestiontype.php +++ b/question/type/truefalse/simpletest/testquestiontype.php @@ -26,7 +26,7 @@ defined('MOODLE_INTERNAL') || die(); -require_once($CFG->dirroot . '/question/type//truefalse/questiontype.php'); +require_once($CFG->dirroot . '/question/type/truefalse/questiontype.php'); /**