|
Moodle
2.2.1
http://www.collinsharper.com
|
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 00017 00028 require_once($CFG->dirroot . '/question/engine/simpletest/helpers.php'); 00029 00030 00037 class qtype_numerical_question_test extends UnitTestCase { 00038 public function test_is_complete_response() { 00039 $question = test_question_maker::make_question('numerical'); 00040 00041 $this->assertFalse($question->is_complete_response(array())); 00042 $this->assertTrue($question->is_complete_response(array('answer' => '0'))); 00043 $this->assertTrue($question->is_complete_response(array('answer' => 0))); 00044 $this->assertFalse($question->is_complete_response(array('answer' => 'test'))); 00045 } 00046 00047 public function test_is_gradable_response() { 00048 $question = test_question_maker::make_question('numerical'); 00049 00050 $this->assertFalse($question->is_gradable_response(array())); 00051 $this->assertTrue($question->is_gradable_response(array('answer' => '0'))); 00052 $this->assertTrue($question->is_gradable_response(array('answer' => 0))); 00053 $this->assertTrue($question->is_gradable_response(array('answer' => 'test'))); 00054 } 00055 00056 public function test_grading() { 00057 $question = test_question_maker::make_question('numerical'); 00058 00059 $this->assertEqual(array(0, question_state::$gradedwrong), 00060 $question->grade_response(array('answer' => '1.0'))); 00061 $this->assertEqual(array(1, question_state::$gradedright), 00062 $question->grade_response(array('answer' => '3.14'))); 00063 } 00064 00065 public function test_grading_with_units() { 00066 $question = test_question_maker::make_question('numerical'); 00067 $question->unitgradingtype = qtype_numerical::UNITOPTIONAL; 00068 $question->ap = new qtype_numerical_answer_processor( 00069 array('m' => 1, 'cm' => 100), false, '.', ','); 00070 00071 $this->assertEqual(array(1, question_state::$gradedright), 00072 $question->grade_response(array('answer' => '3.14 frogs'))); 00073 $this->assertEqual(array(1, question_state::$gradedright), 00074 $question->grade_response(array('answer' => '3.14'))); 00075 $this->assertEqual(array(1, question_state::$gradedright), 00076 $question->grade_response(array('answer' => '3.14 m'))); 00077 $this->assertEqual(array(1, question_state::$gradedright), 00078 $question->grade_response(array('answer' => '314cm'))); 00079 $this->assertEqual(array(1, question_state::$gradedright), 00080 $question->grade_response(array('answer' => '314000000x10^-8m'))); 00081 } 00082 00083 public function test_grading_with_units_graded() { 00084 $question = test_question_maker::make_question('numerical'); 00085 $question->unitgradingtype = qtype_numerical::UNITGRADED; 00086 $question->ap = new qtype_numerical_answer_processor( 00087 array('m' => 1, 'cm' => 100), false, '.', ','); 00088 00089 $this->assertEqual(array(0.8, question_state::$gradedpartial), 00090 $question->grade_response(array('answer' => '3.14 frogs'))); 00091 $this->assertEqual(array(0.8, question_state::$gradedpartial), 00092 $question->grade_response(array('answer' => '3.14'))); 00093 $this->assertEqual(array(1, question_state::$gradedright), 00094 $question->grade_response(array('answer' => '3.14 m'))); 00095 $this->assertEqual(array(1, question_state::$gradedright), 00096 $question->grade_response(array('answer' => '314cm'))); 00097 $this->assertEqual(array(1, question_state::$gradedright), 00098 $question->grade_response(array('answer' => '314000000x10^-8m'))); 00099 $this->assertEqual(array(0.8, question_state::$gradedpartial), 00100 $question->grade_response(array('answer' => '3.14 cm'))); 00101 $this->assertEqual(array(0, question_state::$gradedwrong), 00102 $question->grade_response(array('answer' => '314 m'))); 00103 } 00104 00105 public function test_grading_unit() { 00106 $question = test_question_maker::make_question('numerical', 'unit'); 00107 00108 $this->assertEqual(array(0, question_state::$gradedwrong), 00109 $question->grade_response(array('answer' => '2', 'unit' => 'm'))); 00110 $this->assertEqual(array(0, question_state::$gradedwrong), 00111 $question->grade_response(array('answer' => '2', 'unit' => 'cm'))); 00112 $this->assertEqual(array(0, question_state::$gradedwrong), 00113 $question->grade_response(array('answer' => '2', 'unit' => ''))); 00114 00115 $this->assertEqual(array(1, question_state::$gradedright), 00116 $question->grade_response(array('answer' => '1.25', 'unit' => 'm'))); 00117 $this->assertEqual(array(1, question_state::$gradedright), 00118 $question->grade_response(array('answer' => '125', 'unit' => 'cm'))); 00119 $this->assertEqual(array(0.5, question_state::$gradedpartial), 00120 $question->grade_response(array('answer' => '1.25', 'unit' => ''))); 00121 00122 $this->assertEqual(array(0.5, question_state::$gradedpartial), 00123 $question->grade_response(array('answer' => '1.23', 'unit' => 'm'))); 00124 $this->assertEqual(array(0.5, question_state::$gradedpartial), 00125 $question->grade_response(array('answer' => '123', 'unit' => 'cm'))); 00126 $this->assertEqual(array(0.25, question_state::$gradedpartial), 00127 $question->grade_response(array('answer' => '1.23', 'unit' => ''))); 00128 } 00129 00130 public function test_grading_currency() { 00131 $question = test_question_maker::make_question('numerical', 'currency'); 00132 00133 $this->assertEqual(array(1, question_state::$gradedright), 00134 $question->grade_response(array('answer' => '$1332'))); 00135 $this->assertEqual(array(1, question_state::$gradedright), 00136 $question->grade_response(array('answer' => '$ 1332'))); 00137 $this->assertEqual(array(0.8, question_state::$gradedpartial), 00138 $question->grade_response(array('answer' => 'frog 1332'))); 00139 $this->assertEqual(array(0.8, question_state::$gradedpartial), 00140 $question->grade_response(array('answer' => '1332'))); 00141 $this->assertEqual(array(0.8, question_state::$gradedpartial), 00142 $question->grade_response(array('answer' => ' 1332'))); 00143 $this->assertEqual(array(0, question_state::$gradedwrong), 00144 $question->grade_response(array('answer' => '1332 $'))); 00145 $this->assertEqual(array(0, question_state::$gradedwrong), 00146 $question->grade_response(array('answer' => '1332 frogs'))); 00147 $this->assertEqual(array(0, question_state::$gradedwrong), 00148 $question->grade_response(array('answer' => '$1'))); 00149 } 00150 00151 public function test_get_correct_response() { 00152 $question = test_question_maker::make_question('numerical'); 00153 00154 $this->assertEqual(array('answer' => '3.14'), 00155 $question->get_correct_response()); 00156 } 00157 00158 public function test_get_correct_response_units() { 00159 $question = test_question_maker::make_question('numerical', 'unit'); 00160 00161 $this->assertEqual(array('answer' => '1.25', 'unit' => 'm'), 00162 $question->get_correct_response()); 00163 } 00164 00165 public function test_get_correct_response_currency() { 00166 $question = test_question_maker::make_question('numerical', 'currency'); 00167 00168 $this->assertEqual(array('answer' => '$ 1332'), 00169 $question->get_correct_response()); 00170 } 00171 00172 public function test_get_question_summary() { 00173 $num = test_question_maker::make_question('numerical'); 00174 $qsummary = $num->get_question_summary(); 00175 $this->assertEqual('What is pi to two d.p.?', $qsummary); 00176 } 00177 00178 public function test_summarise_response() { 00179 $num = test_question_maker::make_question('numerical'); 00180 $this->assertEqual('3.1', $num->summarise_response(array('answer' => '3.1'))); 00181 } 00182 00183 public function test_summarise_response_unit() { 00184 $num = test_question_maker::make_question('numerical', 'unit'); 00185 $this->assertEqual('3.1', $num->summarise_response(array('answer' => '3.1'))); 00186 $this->assertEqual('3.1m', $num->summarise_response(array('answer' => '3.1m'))); 00187 $this->assertEqual('3.1 cm', $num->summarise_response(array('answer' => '3.1 cm'))); 00188 } 00189 00190 public function test_summarise_response_currency() { 00191 $num = test_question_maker::make_question('numerical', 'currency'); 00192 $this->assertEqual('100', $num->summarise_response(array('answer' => '100'))); 00193 $this->assertEqual('$100', $num->summarise_response(array('answer' => '$100'))); 00194 $this->assertEqual('$ 100', $num->summarise_response(array('answer' => '$ 100'))); 00195 $this->assertEqual('100 frogs', $num->summarise_response(array('answer' => '100 frogs'))); 00196 } 00197 00198 public function test_classify_response() { 00199 $num = test_question_maker::make_question('numerical'); 00200 $num->start_attempt(new question_attempt_step(), 1); 00201 00202 $this->assertEqual(array( 00203 new question_classified_response(15, '3.1', 0.0)), 00204 $num->classify_response(array('answer' => '3.1'))); 00205 $this->assertEqual(array( 00206 new question_classified_response(17, '42', 0.0)), 00207 $num->classify_response(array('answer' => '42'))); 00208 $this->assertEqual(array( 00209 new question_classified_response(13, '3.14', 1.0)), 00210 $num->classify_response(array('answer' => '3.14'))); 00211 $this->assertEqual(array( 00212 question_classified_response::no_response()), 00213 $num->classify_response(array('answer' => ''))); 00214 } 00215 00216 public function test_classify_response_no_star() { 00217 $num = test_question_maker::make_question('numerical'); 00218 unset($num->answers[17]); 00219 $num->start_attempt(new question_attempt_step(), 1); 00220 00221 $this->assertEqual(array( 00222 new question_classified_response(15, '3.1', 0.0)), 00223 $num->classify_response(array('answer' => '3.1'))); 00224 $this->assertEqual(array( 00225 new question_classified_response(0, '42', 0.0)), 00226 $num->classify_response(array('answer' => '42'))); 00227 $this->assertEqual(array( 00228 question_classified_response::no_response()), 00229 $num->classify_response(array('answer' => ''))); 00230 } 00231 00232 public function test_classify_response_unit() { 00233 $num = test_question_maker::make_question('numerical', 'unit'); 00234 $num->start_attempt(new question_attempt_step(), 1); 00235 00236 $this->assertEqual(array( 00237 new question_classified_response(13, '1.25', 0.5)), 00238 $num->classify_response(array('answer' => '1.25', 'unit' => ''))); 00239 $this->assertEqual(array( 00240 new question_classified_response(13, '1.25 m', 1.0)), 00241 $num->classify_response(array('answer' => '1.25', 'unit' => 'm'))); 00242 $this->assertEqual(array( 00243 new question_classified_response(13, '125 cm', 1.0)), 00244 $num->classify_response(array('answer' => '125', 'unit' => 'cm'))); 00245 $this->assertEqual(array( 00246 new question_classified_response(14, '123 cm', 0.5)), 00247 $num->classify_response(array('answer' => '123', 'unit' => 'cm'))); 00248 $this->assertEqual(array( 00249 new question_classified_response(14, '1.27 m', 0.5)), 00250 $num->classify_response(array('answer' => '1.27', 'unit' => 'm'))); 00251 $this->assertEqual(array( 00252 new question_classified_response(17, '3.0 m', 0)), 00253 $num->classify_response(array('answer' => '3.0', 'unit' => 'm'))); 00254 $this->assertEqual(array( 00255 question_classified_response::no_response()), 00256 $num->classify_response(array('answer' => ''))); 00257 } 00258 00259 public function test_classify_response_unit_no_star() { 00260 $num = test_question_maker::make_question('numerical', 'unit'); 00261 unset($num->answers[17]); 00262 $num->start_attempt(new question_attempt_step(), 1); 00263 00264 $this->assertEqual(array( 00265 new question_classified_response(0, '42 cm', 0)), 00266 $num->classify_response(array('answer' => '42', 'unit' => 'cm'))); 00267 $this->assertEqual(array( 00268 new question_classified_response(0, '3.0', 0)), 00269 $num->classify_response(array('answer' => '3.0', 'unit' => ''))); 00270 $this->assertEqual(array( 00271 new question_classified_response(0, '3.0 m', 0)), 00272 $num->classify_response(array('answer' => '3.0', 'unit' => 'm'))); 00273 $this->assertEqual(array( 00274 question_classified_response::no_response()), 00275 $num->classify_response(array('answer' => '', 'unit' => ''))); 00276 } 00277 00278 public function test_classify_response_currency() { 00279 $num = test_question_maker::make_question('numerical', 'currency'); 00280 $num->start_attempt(new question_attempt_step(), 1); 00281 00282 $this->assertEqual(array( 00283 new question_classified_response(14, '$100', 0)), 00284 $num->classify_response(array('answer' => '$100'))); 00285 $this->assertEqual(array( 00286 new question_classified_response(13, '1 332', 0.8)), 00287 $num->classify_response(array('answer' => '1 332'))); 00288 } 00289 }