Merge branch 'MDL-70065_310' of https://github.com/timhunt/moodle into MOODLE_310_STABLE
[moodle.git] / question / type / gapselect / tests / question_test.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * Unit tests for the select missing words question definition class.
19  *
20  * @package   qtype_gapselect
21  * @copyright 2012 The Open University
22  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
26 defined('MOODLE_INTERNAL') || die();
27 global $CFG;
29 require_once($CFG->dirroot . '/question/engine/tests/helpers.php');
30 require_once($CFG->dirroot . '/question/type/gapselect/tests/helper.php');
33 /**
34  * Unit tests for the select missing words question definition class.
35  *
36  * @copyright 2012 The Open University
37  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
38  */
39 class qtype_gapselect_question_test extends basic_testcase {
41     public function test_get_question_summary() {
42         $gapselect = test_question_maker::make_question('gapselect');
43         $this->assertEquals('The [[1]] brown [[2]] jumped over the [[3]] dog.; ' .
44                 '[[1]] -> {quick / slow}; [[2]] -> {fox / dog}; [[3]] -> {lazy / assiduous}',
45                 $gapselect->get_question_summary());
46     }
48     public function test_get_question_summary_maths() {
49         $gapselect = test_question_maker::make_question('gapselect', 'maths');
50         $this->assertEquals('Fill in the operators to make this equation work: ' .
51                 '7 [[1]] 11 [[2]] 13 [[1]] 17 [[2]] 19 = 3; [[1]] -> {+ / - / * / /}',
52                 $gapselect->get_question_summary());
53     }
55     public function test_summarise_response() {
56         $gapselect = test_question_maker::make_question('gapselect');
57         $gapselect->shufflechoices = false;
58         $gapselect->start_attempt(new question_attempt_step(), 1);
60         $this->assertEquals('{quick} {fox} {lazy}',
61                 $gapselect->summarise_response(array('p1' => '1', 'p2' => '1', 'p3' => '1')));
62     }
64     public function test_summarise_response_maths() {
65         $gapselect = test_question_maker::make_question('gapselect', 'maths');
66         $gapselect->shufflechoices = false;
67         $gapselect->start_attempt(new question_attempt_step(), 1);
69         $this->assertEquals('{+} {-} {+} {-}', $gapselect->summarise_response(
70                 array('p1' => '1', 'p2' => '2', 'p3' => '1', 'p4' => '2')));
71     }
73     public function test_get_random_guess_score() {
74         $gapselect = test_question_maker::make_question('gapselect');
75         $this->assertEquals(0.5, $gapselect->get_random_guess_score());
76     }
78     public function test_get_random_guess_score_maths() {
79         $gapselect = test_question_maker::make_question('gapselect', 'maths');
80         $this->assertEquals(0.25, $gapselect->get_random_guess_score());
81     }
83     public function test_get_right_choice_for() {
84         $gapselect = test_question_maker::make_question('gapselect');
85         $gapselect->shufflechoices = false;
86         $gapselect->start_attempt(new question_attempt_step(), 1);
88         $this->assertEquals(1, $gapselect->get_right_choice_for(1));
89         $this->assertEquals(1, $gapselect->get_right_choice_for(2));
90     }
92     public function test_get_right_choice_for_maths() {
93         $gapselect = test_question_maker::make_question('gapselect', 'maths');
94         $gapselect->shufflechoices = false;
95         $gapselect->start_attempt(new question_attempt_step(), 1);
97         $this->assertEquals(1, $gapselect->get_right_choice_for(1));
98         $this->assertEquals(2, $gapselect->get_right_choice_for(2));
99     }
101     public function test_clear_wrong_from_response() {
102         $gapselect = test_question_maker::make_question('gapselect', 'maths');
103         $gapselect->shufflechoices = false;
104         $gapselect->start_attempt(new question_attempt_step(), 1);
106         $initialresponse = array('p1' => '1', 'p2' => '1', 'p3' => '1', 'p4' => '1');
107         $this->assertEquals(array('p1' => '1', 'p2' => '0', 'p3' => '1', 'p4' => '0'),
108                 $gapselect->clear_wrong_from_response($initialresponse));
109     }
111     public function test_get_num_parts_right() {
112         $gapselect = test_question_maker::make_question('gapselect');
113         $gapselect->shufflechoices = false;
114         $gapselect->start_attempt(new question_attempt_step(), 1);
116         $this->assertEquals(array(2, 3),
117                 $gapselect->get_num_parts_right(array('p1' => '1', 'p2' => '1', 'p3' => '2')));
118         $this->assertEquals(array(3, 3),
119                 $gapselect->get_num_parts_right(array('p1' => '1', 'p2' => '1', 'p3' => '1')));
120     }
122     public function test_get_num_parts_right_maths() {
123         $gapselect = test_question_maker::make_question('gapselect', 'maths');
124         $gapselect->shufflechoices = false;
125         $gapselect->start_attempt(new question_attempt_step(), 1);
127         $this->assertEquals(array(2, 4), $gapselect->get_num_parts_right(
128                 array('p1' => '1', 'p2' => '1', 'p3' => '1', 'p4' => '1')));
129     }
131     public function test_get_expected_data() {
132         $gapselect = test_question_maker::make_question('gapselect');
133         $gapselect->start_attempt(new question_attempt_step(), 1);
135         $this->assertEquals(array('p1' => PARAM_INT, 'p2' => PARAM_INT, 'p3' => PARAM_INT),
136                 $gapselect->get_expected_data());
137     }
139     public function test_get_correct_response() {
140         $gapselect = test_question_maker::make_question('gapselect');
141         $gapselect->shufflechoices = false;
142         $gapselect->start_attempt(new question_attempt_step(), 1);
144         $this->assertEquals(array('p1' => '1', 'p2' => '1', 'p3' => '1'),
145                 $gapselect->get_correct_response());
146     }
148     public function test_get_correct_response_maths() {
149         $gapselect = test_question_maker::make_question('gapselect', 'maths');
150         $gapselect->shufflechoices = false;
151         $gapselect->start_attempt(new question_attempt_step(), 1);
153         $this->assertEquals(array('p1' => '1', 'p2' => '2', 'p3' => '1', 'p4' => '2'),
154                 $gapselect->get_correct_response());
155     }
157     public function test_is_same_response() {
158         $gapselect = test_question_maker::make_question('gapselect');
159         $gapselect->start_attempt(new question_attempt_step(), 1);
161         $this->assertTrue($gapselect->is_same_response(
162                 array(),
163                 array('p1' => '0', 'p2' => '0', 'p3' => '0')));
165         $this->assertFalse($gapselect->is_same_response(
166                 array(),
167                 array('p1' => '1', 'p2' => '0', 'p3' => '0')));
169         $this->assertFalse($gapselect->is_same_response(
170                 array('p1' => '0', 'p2' => '0', 'p3' => '0'),
171                 array('p1' => '1', 'p2' => '0', 'p3' => '0')));
173         $this->assertTrue($gapselect->is_same_response(
174                 array('p1' => '1', 'p2' => '2', 'p3' => '3'),
175                 array('p1' => '1', 'p2' => '2', 'p3' => '3')));
177         $this->assertFalse($gapselect->is_same_response(
178                 array('p1' => '1', 'p2' => '2', 'p3' => '3'),
179                 array('p1' => '1', 'p2' => '2', 'p3' => '2')));
180     }
181     public function test_is_complete_response() {
182         $gapselect = test_question_maker::make_question('gapselect');
183         $gapselect->start_attempt(new question_attempt_step(), 1);
185         $this->assertFalse($gapselect->is_complete_response(array()));
186         $this->assertFalse($gapselect->is_complete_response(
187                 array('p1' => '1', 'p2' => '1', 'p3' => '0')));
188         $this->assertFalse($gapselect->is_complete_response(array('p1' => '1')));
189         $this->assertTrue($gapselect->is_complete_response(
190                 array('p1' => '1', 'p2' => '1', 'p3' => '1')));
191     }
193     public function test_is_gradable_response() {
194         $gapselect = test_question_maker::make_question('gapselect');
195         $gapselect->start_attempt(new question_attempt_step(), 1);
197         $this->assertFalse($gapselect->is_gradable_response(array()));
198         $this->assertFalse($gapselect->is_gradable_response(
199                 array('p1' => '0', 'p2' => '0', 'p3' => '0')));
200         $this->assertTrue($gapselect->is_gradable_response(
201                 array('p1' => '1', 'p2' => '1', 'p3' => '0')));
202         $this->assertTrue($gapselect->is_gradable_response(array('p1' => '1')));
203         $this->assertTrue($gapselect->is_gradable_response(
204                 array('p1' => '1', 'p2' => '1', 'p3' => '1')));
205     }
207     public function test_grading() {
208         $gapselect = test_question_maker::make_question('gapselect');
209         $gapselect->shufflechoices = false;
210         $gapselect->start_attempt(new question_attempt_step(), 1);
212         $this->assertEquals(array(1, question_state::$gradedright),
213                 $gapselect->grade_response(array('p1' => '1', 'p2' => '1', 'p3' => '1')));
214         $this->assertEquals(array(1 / 3, question_state::$gradedpartial),
215                 $gapselect->grade_response(array('p1' => '1')));
216         $this->assertEquals(array(0, question_state::$gradedwrong),
217                 $gapselect->grade_response(array('p1' => '2', 'p2' => '2', 'p3' => '2')));
218     }
220     public function test_grading_maths() {
221         $gapselect = test_question_maker::make_question('gapselect', 'maths');
222         $gapselect->shufflechoices = false;
223         $gapselect->start_attempt(new question_attempt_step(), 1);
225         $this->assertEquals(array(1, question_state::$gradedright), $gapselect->grade_response(
226                 array('p1' => '1', 'p2' => '2', 'p3' => '1', 'p4' => '2')));
227         $this->assertEquals(array(0.5, question_state::$gradedpartial), $gapselect->grade_response(
228                 array('p1' => '1', 'p2' => '1', 'p3' => '1', 'p4' => '1')));
229         $this->assertEquals(array(0, question_state::$gradedwrong), $gapselect->grade_response(
230                 array('p1' => '0', 'p2' => '1', 'p3' => '2', 'p4' => '1')));
231     }
233     public function test_classify_response() {
234         $gapselect = test_question_maker::make_question('gapselect');
235         $gapselect->shufflechoices = false;
236         $gapselect->start_attempt(new question_attempt_step(), 1);
238         $this->assertEquals(array(
239                     1 => new question_classified_response(1, 'quick', 1 / 3),
240                     2 => new question_classified_response(2, 'dog', 0),
241                     3 => new question_classified_response(1, 'lazy', 1 / 3),
242                 ), $gapselect->classify_response(array('p1' => '1', 'p2' => '2', 'p3' => '1')));
243         $this->assertEquals(array(
244                     1 => question_classified_response::no_response(),
245                     2 => new question_classified_response(1, 'fox', 1 / 3),
246                     3 => new question_classified_response(2, 'assiduous', 0),
247                 ), $gapselect->classify_response(array('p1' => '0', 'p2' => '1', 'p3' => '2')));
248     }