Proyectos de Subversion Moodle

Rev

Rev 11 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 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/>.
16
 
17
namespace qtype_ddwtos;
18
 
19
use question_display_options;
20
use question_hint_with_parts;
21
use question_state;
22
 
23
defined('MOODLE_INTERNAL') || die();
24
global $CFG;
25
 
26
require_once($CFG->dirroot . '/question/engine/tests/helpers.php');
27
require_once($CFG->dirroot . '/question/type/ddwtos/tests/helper.php');
28
 
29
 
30
/**
31
 * Unit tests for the drag-and-drop words into sentences question type.
32
 *
33
 * @package   qtype_ddwtos
34
 * @copyright 2012 The Open University
35
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
36
 */
1441 ariadna 37
final class walkthrough_test extends \qbehaviour_walkthrough_test_base {
1 efrain 38
 
39
    protected function get_contains_drop_box_expectation($place, $group, $readonly,
40
            $stateclass = '0') {
41
        $qa = $this->quba->get_question_attempt($this->slot);
42
 
43
        $class = "place{$place} drop group{$group}";
44
        if ($readonly) {
45
            $class .= ' readonly';
46
        } else {
47
            $expectedattrs['tabindex'] = 0;
48
        }
49
        $expectedattrs['class'] = $class;
50
 
51
        return new \question_contains_tag_with_attributes('span', $expectedattrs);
52
    }
53
 
11 efrain 54
    public function test_interactive_behaviour(): void {
1 efrain 55
 
56
        // Create a drag-and-drop question.
57
        $dd = \test_question_maker::make_question('ddwtos');
58
        $dd->hints = array(
59
            new question_hint_with_parts(13, 'This is the first hint.', FORMAT_HTML, false, false),
60
            new question_hint_with_parts(14, 'This is the second hint.', FORMAT_HTML, true, true),
61
        );
62
        $dd->shufflechoices = false;
63
        $this->start_attempt_at_question($dd, 'interactive', 3);
64
 
65
        // Check the initial state.
66
        $this->check_current_state(question_state::$todo);
67
        $this->check_current_mark(null);
68
        $this->check_current_output(
69
                $this->get_contains_drop_box_expectation('1', 1, false),
70
                $this->get_contains_drop_box_expectation('2', 2, false),
71
                $this->get_contains_drop_box_expectation('3', 3, false),
72
                $this->get_contains_hidden_expectation(
73
                        $this->quba->get_field_prefix($this->slot) . 'p1', '0'),
74
                $this->get_contains_hidden_expectation(
75
                        $this->quba->get_field_prefix($this->slot) . 'p2', '0'),
76
                $this->get_contains_hidden_expectation(
77
                        $this->quba->get_field_prefix($this->slot) . 'p3', '0'),
78
                $this->get_contains_submit_button_expectation(true),
79
                $this->get_does_not_contain_feedback_expectation(),
80
                $this->get_tries_remaining_expectation(3),
81
                $this->get_no_hint_visible_expectation());
82
 
83
        // Save the wrong answer.
84
        $this->process_submission(array('p1' => '2', 'p2' => '2', 'p3' => '2'));
85
 
86
        // Verify.
87
        $this->check_current_state(question_state::$todo);
88
        $this->check_current_mark(null);
89
        $this->check_current_output(
90
                $this->get_contains_drop_box_expectation('1', 1, false),
91
                $this->get_contains_drop_box_expectation('2', 2, false),
92
                $this->get_contains_drop_box_expectation('3', 3, false),
93
                $this->get_contains_hidden_expectation(
94
                        $this->quba->get_field_prefix($this->slot) . 'p1', '2'),
95
                $this->get_contains_hidden_expectation(
96
                        $this->quba->get_field_prefix($this->slot) . 'p2', '2'),
97
                $this->get_contains_hidden_expectation(
98
                        $this->quba->get_field_prefix($this->slot) . 'p3', '2'),
99
                $this->get_contains_submit_button_expectation(true),
100
                $this->get_does_not_contain_correctness_expectation(),
101
                $this->get_does_not_contain_feedback_expectation(),
102
                $this->get_tries_remaining_expectation(3),
103
                $this->get_no_hint_visible_expectation());
104
 
105
        // Submit the wrong answer.
106
        $this->process_submission(array('p1' => '2', 'p2' => '2', 'p3' => '2', '-submit' => 1));
107
 
108
        // Verify.
109
        $this->check_current_state(question_state::$todo);
110
        $this->check_current_mark(null);
111
        $this->check_current_output(
112
                $this->get_contains_drop_box_expectation('1', 1, true),
113
                $this->get_contains_drop_box_expectation('2', 2, true),
114
                $this->get_contains_drop_box_expectation('3', 3, true),
115
                $this->get_does_not_contain_submit_button_expectation(),
116
                $this->get_contains_try_again_button_expectation(true),
117
                $this->get_does_not_contain_correctness_expectation(),
118
                $this->get_contains_hint_expectation('This is the first hint'));
119
 
120
        // Do try again.
121
        $this->process_submission(array('-tryagain' => 1));
122
 
123
        // Verify.
124
        $this->check_current_state(question_state::$todo);
125
        $this->check_current_mark(null);
126
        $this->check_current_output(
127
                $this->get_contains_drop_box_expectation('1', 1, false),
128
                $this->get_contains_drop_box_expectation('2', 2, false),
129
                $this->get_contains_drop_box_expectation('3', 3, false),
130
                $this->get_contains_hidden_expectation(
131
                        $this->quba->get_field_prefix($this->slot) . 'p1', '2'),
132
                $this->get_contains_hidden_expectation(
133
                        $this->quba->get_field_prefix($this->slot) . 'p2', '2'),
134
                $this->get_contains_hidden_expectation(
135
                        $this->quba->get_field_prefix($this->slot) . 'p3', '2'),
136
                $this->get_contains_submit_button_expectation(true),
137
                $this->get_does_not_contain_correctness_expectation(),
138
                $this->get_does_not_contain_feedback_expectation(),
139
                $this->get_tries_remaining_expectation(2),
140
                $this->get_no_hint_visible_expectation());
141
 
142
        // Submit the right answer.
143
        $this->process_submission(array('p1' => '1', 'p2' => '1', 'p3' => '1', '-submit' => 1));
144
 
145
        // Verify.
146
        $this->check_current_state(question_state::$gradedright);
147
        $this->check_current_mark(2);
148
        $this->check_current_output(
149
                $this->get_contains_drop_box_expectation('1', 1, true, 'correct'),
150
                $this->get_contains_drop_box_expectation('2', 2, true, 'correct'),
151
                $this->get_contains_drop_box_expectation('3', 3, true, 'correct'),
152
                $this->get_does_not_contain_submit_button_expectation(),
153
                $this->get_contains_correct_expectation(),
154
                $this->get_no_hint_visible_expectation());
155
 
156
        // Check regrading does not mess anything up.
157
        $this->quba->regrade_all_questions();
158
 
159
        // Verify.
160
        $this->check_current_state(question_state::$gradedright);
161
        $this->check_current_mark(2);
162
    }
163
 
11 efrain 164
    public function test_deferred_feedback(): void {
1 efrain 165
 
166
        // Create a drag-and-drop question.
167
        $dd = \test_question_maker::make_question('ddwtos');
168
        $dd->shufflechoices = false;
169
        $this->start_attempt_at_question($dd, 'deferredfeedback', 3);
170
 
171
        // Check the initial state.
172
        $this->check_current_state(question_state::$todo);
173
        $this->check_current_mark(null);
174
        $this->check_current_output(
175
                $this->get_contains_drop_box_expectation('1', 1, false),
176
                $this->get_contains_drop_box_expectation('2', 2, false),
177
                $this->get_contains_drop_box_expectation('3', 3, false),
178
                $this->get_contains_hidden_expectation(
179
                        $this->quba->get_field_prefix($this->slot) . 'p1', '0'),
180
                $this->get_contains_hidden_expectation(
181
                        $this->quba->get_field_prefix($this->slot) . 'p2', '0'),
182
                $this->get_contains_hidden_expectation(
183
                        $this->quba->get_field_prefix($this->slot) . 'p3', '0'),
184
                $this->get_does_not_contain_feedback_expectation());
185
 
186
        // Save a partial answer.
187
        $this->process_submission(array('p1' => '1', 'p2' => '2'));
188
 
189
        // Verify.
190
        $this->check_current_state(question_state::$invalid);
191
        $this->check_current_mark(null);
192
        $this->check_current_output(
193
                $this->get_contains_drop_box_expectation('1', 1, false),
194
                $this->get_contains_drop_box_expectation('2', 2, false),
195
                $this->get_contains_drop_box_expectation('3', 3, false),
196
                $this->get_contains_hidden_expectation(
197
                        $this->quba->get_field_prefix($this->slot) . 'p1', '1'),
198
                $this->get_contains_hidden_expectation(
199
                        $this->quba->get_field_prefix($this->slot) . 'p2', '2'),
200
                $this->get_contains_hidden_expectation(
201
                        $this->quba->get_field_prefix($this->slot) . 'p3', '0'),
202
                $this->get_does_not_contain_correctness_expectation(),
203
                $this->get_does_not_contain_feedback_expectation());
204
 
205
        // Save the right answer.
206
        $this->process_submission(array('p1' => '1', 'p2' => '1', 'p3' => '1'));
207
 
208
        // Verify.
209
        $this->check_current_state(question_state::$complete);
210
        $this->check_current_mark(null);
211
        $this->check_current_output(
212
                $this->get_contains_drop_box_expectation('1', 1, false),
213
                $this->get_contains_drop_box_expectation('2', 2, false),
214
                $this->get_contains_drop_box_expectation('3', 3, false),
215
                $this->get_contains_hidden_expectation(
216
                        $this->quba->get_field_prefix($this->slot) . 'p1', '1'),
217
                $this->get_contains_hidden_expectation(
218
                        $this->quba->get_field_prefix($this->slot) . 'p2', '1'),
219
                $this->get_contains_hidden_expectation(
220
                        $this->quba->get_field_prefix($this->slot) . 'p3', '1'),
221
                $this->get_does_not_contain_correctness_expectation(),
222
                $this->get_does_not_contain_feedback_expectation());
223
 
224
        // Finish the attempt.
225
        $this->quba->finish_all_questions();
226
 
227
        // Verify.
228
        $this->check_current_state(question_state::$gradedright);
229
        $this->check_current_mark(3);
230
        $this->check_current_output(
231
                $this->get_contains_drop_box_expectation('1', 1, true, 'correct'),
232
                $this->get_contains_drop_box_expectation('2', 2, true, 'correct'),
233
                $this->get_contains_drop_box_expectation('3', 3, true, 'correct'),
234
                $this->get_contains_correct_expectation());
235
 
236
        // Change the right answer a bit.
237
        $dd->rightchoices[2] = 2;
238
 
239
        // Check regrading does not mess anything up.
240
        $this->quba->regrade_all_questions();
241
 
242
        // Verify.
243
        $this->check_current_state(question_state::$gradedpartial);
244
        $this->check_current_mark(2);
245
    }
246
 
11 efrain 247
    public function test_deferred_feedback_unanswered(): void {
1 efrain 248
 
249
        // Create a drag-and-drop question.
250
        $dd = \test_question_maker::make_question('ddwtos');
251
        $dd->shufflechoices = false;
252
        $this->start_attempt_at_question($dd, 'deferredfeedback', 3);
253
 
254
        // Check the initial state.
255
        $this->check_current_state(question_state::$todo);
256
        $this->check_current_mark(null);
257
        $this->check_current_output(
258
                $this->get_contains_drop_box_expectation('1', 1, false),
259
                $this->get_contains_drop_box_expectation('2', 2, false),
260
                $this->get_contains_drop_box_expectation('3', 3, false),
261
                $this->get_contains_hidden_expectation(
262
                        $this->quba->get_field_prefix($this->slot) . 'p1', '0'),
263
                $this->get_contains_hidden_expectation(
264
                        $this->quba->get_field_prefix($this->slot) . 'p2', '0'),
265
                $this->get_contains_hidden_expectation(
266
                        $this->quba->get_field_prefix($this->slot) . 'p3', '0'),
267
                $this->get_does_not_contain_correctness_expectation(),
268
                $this->get_does_not_contain_feedback_expectation());
269
        $this->check_step_count(1);
270
 
271
        // Save a blank response.
272
        $this->process_submission(array('p1' => '0', 'p2' => '0', 'p3' => '0'));
273
 
274
        // Verify.
275
        $this->check_current_state(question_state::$todo);
276
        $this->check_current_mark(null);
277
        $this->check_current_output(
278
                $this->get_contains_drop_box_expectation('1', 1, false),
279
                $this->get_contains_drop_box_expectation('2', 2, false),
280
                $this->get_contains_drop_box_expectation('3', 3, false),
281
                $this->get_contains_hidden_expectation(
282
                        $this->quba->get_field_prefix($this->slot) . 'p1', '0'),
283
                $this->get_contains_hidden_expectation(
284
                        $this->quba->get_field_prefix($this->slot) . 'p2', '0'),
285
                $this->get_contains_hidden_expectation(
286
                        $this->quba->get_field_prefix($this->slot) . 'p3', '0'),
287
                $this->get_does_not_contain_correctness_expectation(),
288
                $this->get_does_not_contain_feedback_expectation());
289
        $this->check_step_count(1);
290
 
291
        // Finish the attempt.
292
        $this->quba->finish_all_questions();
293
 
294
        // Verify.
295
        $this->check_current_state(question_state::$gaveup);
296
        $this->check_current_mark(null);
297
        $this->check_current_output(
298
                $this->get_contains_drop_box_expectation('1', 1, true),
299
                $this->get_contains_drop_box_expectation('2', 2, true),
300
                $this->get_contains_drop_box_expectation('3', 3, true));
301
    }
302
 
11 efrain 303
    public function test_deferred_feedback_partial_answer(): void {
1 efrain 304
 
305
        // Create a drag-and-drop question.
306
        $dd = \test_question_maker::make_question('ddwtos');
307
        $dd->shufflechoices = false;
308
        $this->start_attempt_at_question($dd, 'deferredfeedback', 3);
309
 
310
        // Check the initial state.
311
        $this->check_current_state(question_state::$todo);
312
        $this->check_current_mark(null);
313
        $this->check_current_output(
314
                $this->get_contains_drop_box_expectation('1', 1, false),
315
                $this->get_contains_drop_box_expectation('2', 2, false),
316
                $this->get_contains_drop_box_expectation('3', 3, false),
317
                $this->get_contains_hidden_expectation(
318
                        $this->quba->get_field_prefix($this->slot) . 'p1', '0'),
319
                $this->get_contains_hidden_expectation(
320
                        $this->quba->get_field_prefix($this->slot) . 'p2', '0'),
321
                $this->get_contains_hidden_expectation(
322
                        $this->quba->get_field_prefix($this->slot) . 'p3', '0'),
323
                $this->get_does_not_contain_correctness_expectation(),
324
                $this->get_does_not_contain_feedback_expectation());
325
 
326
        // Save a partial response.
327
        $this->process_submission(array('p1' => '1', 'p2' => '0', 'p3' => '0'));
328
 
329
        // Verify.
330
        $this->check_current_state(question_state::$invalid);
331
        $this->check_current_mark(null);
332
        $this->check_current_output(
333
                $this->get_contains_drop_box_expectation('1', 1, false),
334
                $this->get_contains_drop_box_expectation('2', 2, false),
335
                $this->get_contains_drop_box_expectation('3', 3, false),
336
                $this->get_contains_hidden_expectation(
337
                        $this->quba->get_field_prefix($this->slot) . 'p1', '1'),
338
                $this->get_contains_hidden_expectation(
339
                        $this->quba->get_field_prefix($this->slot) . 'p2', '0'),
340
                $this->get_contains_hidden_expectation(
341
                        $this->quba->get_field_prefix($this->slot) . 'p3', '0'),
342
                $this->get_does_not_contain_correctness_expectation(),
343
                $this->get_does_not_contain_feedback_expectation());
344
 
345
        // Finish the attempt.
346
        $this->quba->finish_all_questions();
347
 
348
        // Verify.
349
        $this->check_current_state(question_state::$gradedpartial);
350
        $this->check_current_mark(1);
351
        $this->check_current_output(
352
                $this->get_contains_drop_box_expectation('1', 1, true, 'correct'),
353
                $this->get_contains_drop_box_expectation('2', 2, true, 'incorrect'),
354
                $this->get_contains_drop_box_expectation('3', 3, true, 'incorrect'),
355
                $this->get_contains_partcorrect_expectation());
356
    }
357
 
11 efrain 358
    public function test_interactive_grading(): void {
1 efrain 359
 
360
        // Create a drag-and-drop question.
361
        $dd = \test_question_maker::make_question('ddwtos');
362
        $dd->hints = array(
363
            new question_hint_with_parts(1, 'This is the first hint.',
364
                    FORMAT_MOODLE, true, true),
365
            new question_hint_with_parts(2, 'This is the second hint.',
366
                    FORMAT_MOODLE, true, true),
367
        );
368
        $dd->shufflechoices = false;
369
        $this->start_attempt_at_question($dd, 'interactive', 9);
370
 
371
        // Check the initial state.
372
        $this->check_current_state(question_state::$todo);
373
        $this->check_current_mark(null);
374
        $this->assertEquals('interactivecountback',
375
                $this->quba->get_question_attempt($this->slot)->get_behaviour_name());
376
        $this->check_current_output(
377
                $this->get_contains_drop_box_expectation('1', 1, false),
378
                $this->get_contains_drop_box_expectation('2', 2, false),
379
                $this->get_contains_drop_box_expectation('3', 3, false),
380
                $this->get_contains_hidden_expectation(
381
                        $this->quba->get_field_prefix($this->slot) . 'p1', '0'),
382
                $this->get_contains_hidden_expectation(
383
                        $this->quba->get_field_prefix($this->slot) . 'p2', '0'),
384
                $this->get_contains_hidden_expectation(
385
                        $this->quba->get_field_prefix($this->slot) . 'p3', '0'),
386
                $this->get_contains_submit_button_expectation(true),
387
                $this->get_does_not_contain_feedback_expectation(),
388
                $this->get_tries_remaining_expectation(3),
389
                $this->get_does_not_contain_num_parts_correct(),
390
                $this->get_no_hint_visible_expectation());
391
 
392
        // Submit an response with the first two parts right.
393
        $this->process_submission(array('p1' => '1', 'p2' => '1', 'p3' => '2', '-submit' => 1));
394
 
395
        // Verify.
396
        $this->check_current_state(question_state::$todo);
397
        $this->check_current_mark(null);
398
        $this->check_current_output(
399
                $this->get_contains_drop_box_expectation('1', 1, true),
400
                $this->get_contains_drop_box_expectation('2', 2, true),
401
                $this->get_contains_drop_box_expectation('3', 3, true),
402
                $this->get_does_not_contain_submit_button_expectation(),
403
                $this->get_contains_try_again_button_expectation(true),
404
                $this->get_does_not_contain_correctness_expectation(),
405
                $this->get_contains_hint_expectation('This is the first hint'),
406
                $this->get_contains_num_parts_correct(2),
407
                $this->get_contains_standard_partiallycorrect_combined_feedback_expectation(),
408
                $this->get_contains_hidden_expectation(
409
                        $this->quba->get_field_prefix($this->slot) . 'p1', '1'),
410
                $this->get_contains_hidden_expectation(
411
                        $this->quba->get_field_prefix($this->slot) . 'p2', '1'),
412
                $this->get_contains_hidden_expectation(
413
                        $this->quba->get_field_prefix($this->slot) . 'p3', '0'));
414
 
415
        // Check that extract responses will return the reset data.
416
        $prefix = $this->quba->get_field_prefix($this->slot);
417
        $this->assertEquals(array('p1' => '1', 'p2' => '1'),
418
                $this->quba->extract_responses($this->slot,
419
                array($prefix . 'p1' => '1', $prefix . 'p2' => '1', '-tryagain' => 1)));
420
 
421
        // Do try again.
422
        $this->process_submission(array('p1' => '1', 'p2' => '1', '-tryagain' => 1));
423
 
424
        // Verify.
425
        $this->check_current_state(question_state::$todo);
426
        $this->check_current_mark(null);
427
        $this->check_current_output(
428
                $this->get_contains_drop_box_expectation('1', 1, false),
429
                $this->get_contains_drop_box_expectation('2', 2, false),
430
                $this->get_contains_drop_box_expectation('3', 3, false),
431
                $this->get_contains_hidden_expectation(
432
                        $this->quba->get_field_prefix($this->slot) . 'p1', '1'),
433
                $this->get_contains_hidden_expectation(
434
                        $this->quba->get_field_prefix($this->slot) . 'p2', '1'),
435
                $this->get_contains_hidden_expectation(
436
                        $this->quba->get_field_prefix($this->slot) . 'p3', '0'),
437
                $this->get_contains_submit_button_expectation(true),
438
                $this->get_does_not_contain_try_again_button_expectation(),
439
                $this->get_does_not_contain_correctness_expectation(),
440
                $this->get_does_not_contain_feedback_expectation(),
441
                $this->get_tries_remaining_expectation(2),
442
                $this->get_no_hint_visible_expectation());
443
 
444
        // Submit an response with the first and last parts right.
445
        $this->process_submission(array('p1' => '1', 'p2' => '2', 'p3' => '1', '-submit' => 1));
446
 
447
        // Verify.
448
        $this->check_current_state(question_state::$todo);
449
        $this->check_current_mark(null);
450
        $this->check_current_output(
451
                $this->get_contains_drop_box_expectation('1', 1, true),
452
                $this->get_contains_drop_box_expectation('2', 2, true),
453
                $this->get_contains_drop_box_expectation('3', 3, true),
454
                $this->get_does_not_contain_submit_button_expectation(),
455
                $this->get_contains_try_again_button_expectation(true),
456
                $this->get_does_not_contain_correctness_expectation(),
457
                $this->get_contains_hint_expectation('This is the second hint'),
458
                $this->get_contains_num_parts_correct(2),
459
                $this->get_contains_standard_partiallycorrect_combined_feedback_expectation(),
460
                $this->get_contains_hidden_expectation(
461
                        $this->quba->get_field_prefix($this->slot) . 'p1', '1'),
462
                $this->get_contains_hidden_expectation(
463
                        $this->quba->get_field_prefix($this->slot) . 'p2', '0'),
464
                $this->get_contains_hidden_expectation(
465
                        $this->quba->get_field_prefix($this->slot) . 'p3', '1'));
466
 
467
        // Do try again.
468
        $this->process_submission(array('p1' => '1', 'p3' => '1', '-tryagain' => 1));
469
 
470
        // Verify.
471
        $this->check_current_state(question_state::$todo);
472
        $this->check_current_mark(null);
473
        $this->check_current_output(
474
                $this->get_contains_drop_box_expectation('1', 1, false),
475
                $this->get_contains_drop_box_expectation('2', 2, false),
476
                $this->get_contains_drop_box_expectation('3', 3, false),
477
                $this->get_contains_hidden_expectation(
478
                        $this->quba->get_field_prefix($this->slot) . 'p1', '1'),
479
                $this->get_contains_hidden_expectation(
480
                        $this->quba->get_field_prefix($this->slot) . 'p2', '0'),
481
                $this->get_contains_hidden_expectation(
482
                        $this->quba->get_field_prefix($this->slot) . 'p3', '1'),
483
                $this->get_contains_submit_button_expectation(true),
484
                $this->get_does_not_contain_try_again_button_expectation(),
485
                $this->get_does_not_contain_correctness_expectation(),
486
                $this->get_does_not_contain_feedback_expectation(),
487
                $this->get_tries_remaining_expectation(1),
488
                $this->get_no_hint_visible_expectation());
489
 
490
        // Submit the right answer.
491
        $this->process_submission(array('p1' => '1', 'p2' => '1', 'p3' => '1', '-submit' => 1));
492
 
493
        // Verify.
494
        $this->check_current_state(question_state::$gradedright);
495
        $this->check_current_mark(6);
496
        $this->check_current_output(
497
                $this->get_contains_drop_box_expectation('1', 1, true, 'correct'),
498
                $this->get_contains_drop_box_expectation('2', 2, true, 'correct'),
499
                $this->get_contains_drop_box_expectation('3', 3, true, 'correct'),
500
                $this->get_does_not_contain_submit_button_expectation(),
501
                $this->get_does_not_contain_try_again_button_expectation(),
502
                $this->get_contains_correct_expectation(),
503
                $this->get_no_hint_visible_expectation(),
504
                $this->get_does_not_contain_num_parts_correct(),
505
                $this->get_contains_standard_correct_combined_feedback_expectation(),
506
                $this->get_contains_hidden_expectation(
507
                        $this->quba->get_field_prefix($this->slot) . 'p1', '1'),
508
                $this->get_contains_hidden_expectation(
509
                        $this->quba->get_field_prefix($this->slot) . 'p2', '1'),
510
                $this->get_contains_hidden_expectation(
511
                        $this->quba->get_field_prefix($this->slot) . 'p3', '1'));
512
    }
513
 
11 efrain 514
    public function test_interactive_correct_no_submit(): void {
1 efrain 515
 
516
        // Create a drag-and-drop question.
517
        $dd = \test_question_maker::make_question('ddwtos');
518
        $dd->hints = array(
519
            new question_hint_with_parts(23, 'This is the first hint.',
520
                    FORMAT_MOODLE, false, false),
521
            new question_hint_with_parts(24, 'This is the second hint.',
522
                    FORMAT_MOODLE, true, true),
523
        );
524
        $dd->shufflechoices = false;
525
        $this->start_attempt_at_question($dd, 'interactive', 3);
526
 
527
        // Check the initial state.
528
        $this->check_current_state(question_state::$todo);
529
        $this->check_current_mark(null);
530
        $this->check_current_output(
531
                $this->get_contains_drop_box_expectation('1', 1, false),
532
                $this->get_contains_drop_box_expectation('2', 2, false),
533
                $this->get_contains_drop_box_expectation('3', 3, false),
534
                $this->get_contains_hidden_expectation(
535
                        $this->quba->get_field_prefix($this->slot) . 'p1', '0'),
536
                $this->get_contains_hidden_expectation(
537
                        $this->quba->get_field_prefix($this->slot) . 'p2', '0'),
538
                $this->get_contains_hidden_expectation(
539
                        $this->quba->get_field_prefix($this->slot) . 'p3', '0'),
540
                $this->get_contains_submit_button_expectation(true),
541
                $this->get_does_not_contain_feedback_expectation(),
542
                $this->get_tries_remaining_expectation(3),
543
                $this->get_no_hint_visible_expectation());
544
 
545
        // Save the right answer.
546
        $this->process_submission(array('p1' => '1', 'p2' => '1', 'p3' => '1'));
547
 
548
        // Finish the attempt without clicking check.
549
        $this->quba->finish_all_questions();
550
 
551
        // Verify.
552
        $this->check_current_state(question_state::$gradedright);
553
        $this->check_current_mark(3);
554
        $this->check_current_output(
555
                $this->get_contains_drop_box_expectation('1', 1, true, 'correct'),
556
                $this->get_contains_drop_box_expectation('2', 2, true, 'correct'),
557
                $this->get_contains_drop_box_expectation('3', 3, true, 'correct'),
558
                $this->get_does_not_contain_submit_button_expectation(),
559
                $this->get_contains_correct_expectation(),
560
                $this->get_no_hint_visible_expectation());
561
 
562
        // Check regrading does not mess anything up.
563
        $this->quba->regrade_all_questions();
564
 
565
        // Verify.
566
        $this->check_current_state(question_state::$gradedright);
567
        $this->check_current_mark(3);
568
    }
569
 
11 efrain 570
    public function test_interactive_partial_no_submit(): void {
1 efrain 571
 
572
        // Create a drag-and-drop question.
573
        $dd = \test_question_maker::make_question('ddwtos');
574
        $dd->hints = array(
575
            new question_hint_with_parts(23, 'This is the first hint.',
576
                    FORMAT_MOODLE, false, false),
577
            new question_hint_with_parts(24, 'This is the second hint.',
578
                    FORMAT_MOODLE, true, true),
579
        );
580
        $dd->shufflechoices = false;
581
        $this->start_attempt_at_question($dd, 'interactive', 3);
582
 
583
        // Check the initial state.
584
        $this->check_current_state(question_state::$todo);
585
        $this->check_current_mark(null);
586
        $this->check_current_output(
587
                $this->get_contains_drop_box_expectation('1', 1, false),
588
                $this->get_contains_drop_box_expectation('2', 2, false),
589
                $this->get_contains_drop_box_expectation('3', 3, false),
590
                $this->get_contains_hidden_expectation(
591
                        $this->quba->get_field_prefix($this->slot) . 'p1', '0'),
592
                $this->get_contains_hidden_expectation(
593
                        $this->quba->get_field_prefix($this->slot) . 'p2', '0'),
594
                $this->get_contains_hidden_expectation(
595
                        $this->quba->get_field_prefix($this->slot) . 'p3', '0'),
596
                $this->get_contains_submit_button_expectation(true),
597
                $this->get_does_not_contain_feedback_expectation(),
598
                $this->get_tries_remaining_expectation(3),
599
                $this->get_no_hint_visible_expectation());
600
 
601
        // Save the a partially right answer.
602
        $this->process_submission(array('p1' => '1', 'p2' => '2', 'p3' => '2'));
603
 
604
        // Finish the attempt without clicking check.
605
        $this->quba->finish_all_questions();
606
 
607
        // Verify.
608
        $this->check_current_state(question_state::$gradedpartial);
609
        $this->check_current_mark(1);
610
        $this->check_current_output(
611
                $this->get_contains_drop_box_expectation('1', 1, true, 'correct'),
612
                $this->get_contains_drop_box_expectation('2', 2, true, 'incorrect'),
613
                $this->get_contains_drop_box_expectation('3', 3, true, 'incorrect'),
614
                $this->get_does_not_contain_submit_button_expectation(),
615
                $this->get_contains_partcorrect_expectation(),
616
                $this->get_no_hint_visible_expectation());
617
 
618
        // Check regrading does not mess anything up.
619
        $this->quba->regrade_all_questions();
620
 
621
        // Verify.
622
        $this->check_current_state(question_state::$gradedpartial);
623
        $this->check_current_mark(1);
624
    }
625
 
11 efrain 626
    public function test_interactive_no_right_clears(): void {
1 efrain 627
 
628
        // Create a drag-and-drop question.
629
        $dd = \test_question_maker::make_question('ddwtos');
630
        $dd->hints = array(
631
            new question_hint_with_parts(23, 'This is the first hint.', FORMAT_MOODLE, false, true),
632
            new question_hint_with_parts(24, 'This is the second hint.', FORMAT_MOODLE, true, true),
633
        );
634
        $dd->shufflechoices = false;
635
        $this->start_attempt_at_question($dd, 'interactive', 3);
636
 
637
        // Check the initial state.
638
        $this->check_current_state(question_state::$todo);
639
        $this->check_current_mark(null);
640
        $this->check_current_output(
641
                $this->get_contains_marked_out_of_summary(),
642
                $this->get_contains_drop_box_expectation('1', 1, false),
643
                $this->get_contains_drop_box_expectation('2', 2, false),
644
                $this->get_contains_drop_box_expectation('3', 3, false),
645
                $this->get_contains_hidden_expectation(
646
                        $this->quba->get_field_prefix($this->slot) . 'p1', '0'),
647
                $this->get_contains_hidden_expectation(
648
                        $this->quba->get_field_prefix($this->slot) . 'p2', '0'),
649
                $this->get_contains_hidden_expectation(
650
                        $this->quba->get_field_prefix($this->slot) . 'p3', '0'),
651
                $this->get_contains_submit_button_expectation(true),
652
                $this->get_does_not_contain_feedback_expectation(),
653
                $this->get_tries_remaining_expectation(3),
654
                $this->get_no_hint_visible_expectation());
655
 
656
        // Save the a completely wrong answer.
657
        $this->process_submission(array('p1' => '2', 'p2' => '2', 'p3' => '2', '-submit' => 1));
658
 
659
        // Verify.
660
        $this->check_current_state(question_state::$todo);
661
        $this->check_current_mark(null);
662
        $this->check_current_output(
663
                $this->get_contains_marked_out_of_summary(),
664
                $this->get_contains_drop_box_expectation('1', 1, true),
665
                $this->get_contains_drop_box_expectation('2', 2, true),
666
                $this->get_contains_drop_box_expectation('3', 3, true),
667
                $this->get_does_not_contain_submit_button_expectation(),
668
                $this->get_contains_hint_expectation('This is the first hint'));
669
 
670
        // Do try again.
671
        $this->process_submission(array('p1' => '0', 'p2' => '0', 'p3' => '0', '-tryagain' => 1));
672
 
673
        // Check that all the wrong answers have been cleared.
674
        $this->check_current_state(question_state::$todo);
675
        $this->check_current_mark(null);
676
        $this->check_current_output(
677
                $this->get_contains_marked_out_of_summary(),
678
                $this->get_contains_drop_box_expectation('1', 1, false),
679
                $this->get_contains_drop_box_expectation('2', 2, false),
680
                $this->get_contains_drop_box_expectation('3', 3, false),
681
                $this->get_contains_hidden_expectation(
682
                        $this->quba->get_field_prefix($this->slot) . 'p1', '0'),
683
                $this->get_contains_hidden_expectation(
684
                        $this->quba->get_field_prefix($this->slot) . 'p2', '0'),
685
                $this->get_contains_hidden_expectation(
686
                        $this->quba->get_field_prefix($this->slot) . 'p3', '0'),
687
                $this->get_contains_submit_button_expectation(true),
688
                $this->get_does_not_contain_feedback_expectation(),
689
                $this->get_tries_remaining_expectation(2),
690
                $this->get_no_hint_visible_expectation());
691
    }
692
 
11 efrain 693
    public function test_display_of_right_answer_when_shuffled(): void {
1 efrain 694
 
695
        // Create a drag-and-drop question.
696
        $dd = \test_question_maker::make_question('ddwtos');
697
        $this->start_attempt_at_question($dd, 'deferredfeedback', 3);
698
 
699
        // Check the initial state.
700
        $this->check_current_state(question_state::$todo);
701
        $this->check_current_mark(null);
702
        $this->check_current_output(
703
                $this->get_contains_drop_box_expectation('1', 1, false),
704
                $this->get_contains_drop_box_expectation('2', 2, false),
705
                $this->get_contains_drop_box_expectation('3', 3, false),
706
                $this->get_contains_hidden_expectation(
707
                        $this->quba->get_field_prefix($this->slot) . 'p1', '0'),
708
                $this->get_contains_hidden_expectation(
709
                        $this->quba->get_field_prefix($this->slot) . 'p2', '0'),
710
                $this->get_contains_hidden_expectation(
711
                        $this->quba->get_field_prefix($this->slot) . 'p3', '0'),
712
                $this->get_does_not_contain_feedback_expectation());
713
 
714
        // Save a partial answer.
715
        $this->process_submission($dd->get_correct_response());
716
 
717
        // Verify.
718
        $this->check_current_state(question_state::$complete);
719
        $this->check_current_mark(null);
720
        $this->check_current_output(
721
                $this->get_contains_drop_box_expectation('1', 1, false),
722
                $this->get_contains_drop_box_expectation('2', 2, false),
723
                $this->get_contains_drop_box_expectation('3', 3, false),
724
                $this->get_contains_hidden_expectation(
725
                        $this->quba->get_field_prefix($this->slot) . 'p1',
726
                                $dd->get_right_choice_for(1)),
727
                $this->get_contains_hidden_expectation(
728
                        $this->quba->get_field_prefix($this->slot) . 'p2',
729
                                $dd->get_right_choice_for(2)),
730
                $this->get_contains_hidden_expectation(
731
                        $this->quba->get_field_prefix($this->slot) . 'p3',
732
                                $dd->get_right_choice_for(3)),
733
                $this->get_does_not_contain_correctness_expectation(),
734
                $this->get_does_not_contain_feedback_expectation());
735
 
736
        // Finish the attempt.
737
        $this->quba->finish_all_questions();
738
 
739
        // Verify.
740
        $this->displayoptions->rightanswer = question_display_options::VISIBLE;
741
        $this->assertEquals('{quick} {fox} {lazy}', $dd->get_right_answer_summary());
742
        $this->check_current_state(question_state::$gradedright);
743
        $this->check_current_mark(3);
744
        $this->check_current_output(
745
                $this->get_contains_drop_box_expectation('1', 1, true, 'correct'),
746
                $this->get_contains_drop_box_expectation('2', 2, true, 'correct'),
747
                $this->get_contains_drop_box_expectation('3', 3, true, 'correct'),
748
                $this->get_contains_correct_expectation(),
749
                new \question_pattern_expectation('/' .
750
                        preg_quote('The [quick] brown [fox] jumped over the [lazy] dog.', '/') . '/'));
751
    }
752
}