Línea 17... |
Línea 17... |
17 |
namespace mod_quiz;
|
17 |
namespace mod_quiz;
|
Línea 18... |
Línea 18... |
18 |
|
18 |
|
19 |
use moodle_url;
|
19 |
use moodle_url;
|
20 |
use question_bank;
|
20 |
use question_bank;
|
21 |
use question_engine;
|
21 |
use question_engine;
|
22 |
use mod_quiz\question\bank\qbank_helper;
|
- |
|
23 |
|
- |
|
24 |
defined('MOODLE_INTERNAL') || die();
|
- |
|
25 |
|
- |
|
26 |
global $CFG;
|
- |
|
27 |
require_once($CFG->dirroot . '/mod/quiz/locallib.php');
|
- |
|
Línea 28... |
Línea 22... |
28 |
require_once($CFG->dirroot . '/mod/quiz/tests/quiz_question_helper_test_trait.php');
|
22 |
use mod_quiz\tests\question_helper_test_trait;
|
29 |
|
23 |
|
30 |
/**
|
24 |
/**
|
31 |
* Quiz attempt walk through.
|
25 |
* Quiz attempt walk through.
|
Línea 35... |
Línea 29... |
35 |
* @copyright 2013 The Open University
|
29 |
* @copyright 2013 The Open University
|
36 |
* @author Jamie Pratt <me@jamiep.org>
|
30 |
* @author Jamie Pratt <me@jamiep.org>
|
37 |
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
31 |
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
38 |
* @covers \mod_quiz\quiz_attempt
|
32 |
* @covers \mod_quiz\quiz_attempt
|
39 |
*/
|
33 |
*/
|
40 |
class attempt_walkthrough_test extends \advanced_testcase {
|
34 |
final class attempt_walkthrough_test extends \advanced_testcase {
|
- |
|
35 |
use question_helper_test_trait;
|
Línea -... |
Línea 36... |
- |
|
36 |
|
41 |
|
37 |
#[\Override]
|
- |
|
38 |
public static function setUpBeforeClass(): void {
|
- |
|
39 |
global $CFG;
|
- |
|
40 |
|
- |
|
41 |
parent::setUpBeforeClass();
|
- |
|
42 |
|
- |
|
43 |
require_once($CFG->dirroot . '/mod/quiz/locallib.php');
|
Línea 42... |
Línea 44... |
42 |
use \quiz_question_helper_test_trait;
|
44 |
}
|
43 |
|
45 |
|
44 |
/**
|
46 |
/**
|
45 |
* Create a quiz with questions and walk through a quiz attempt.
|
47 |
* Create a quiz with questions and walk through a quiz attempt.
|
Línea 102... |
Línea 104... |
102 |
|
104 |
|
103 |
$tosubmit = [
|
105 |
$tosubmit = [
|
104 |
3 => [
|
106 |
3 => [
|
105 |
'frog' => 'amphibian',
|
107 |
'frog' => 'amphibian',
|
106 |
'cat' => 'mammal',
|
108 |
'cat' => 'mammal',
|
107 |
'newt' => ''
|
109 |
'newt' => '',
|
108 |
]
|
110 |
],
|
Línea 109... |
Línea 111... |
109 |
];
|
111 |
];
|
110 |
|
112 |
|
111 |
$attemptobj->process_submitted_actions($timenow, false, $tosubmit);
|
113 |
$attemptobj->process_submitted_actions($timenow, false, $tosubmit);
|
Línea 112... |
Línea 114... |
112 |
// The student has answered three questions but one is invalid, so there is still one remaining.
|
114 |
// The student has answered three questions but one is invalid, so there is still one remaining.
|
113 |
$this->assertEquals(1, $attemptobj->get_number_of_unanswered_questions());
|
115 |
$this->assertEquals(1, $attemptobj->get_number_of_unanswered_questions());
|
114 |
|
116 |
|
115 |
$tosubmit = [
|
117 |
$tosubmit = [
|
116 |
3 => [
|
118 |
3 => [
|
117 |
'frog' => 'amphibian',
|
119 |
'frog' => 'amphibian',
|
118 |
'cat' => 'mammal',
|
120 |
'cat' => 'mammal',
|
Línea 119... |
Línea 121... |
119 |
'newt' => 'amphibian'
|
121 |
'newt' => 'amphibian',
|
120 |
]
|
122 |
],
|
121 |
];
|
123 |
];
|
Línea 122... |
Línea 124... |
122 |
|
124 |
|
123 |
$attemptobj->process_submitted_actions($timenow, false, $tosubmit);
|
125 |
$attemptobj->process_submitted_actions($timenow, false, $tosubmit);
|
124 |
// The student has answered three questions, so there are no remaining.
|
126 |
// The student has answered three questions, so there are no remaining.
|
125 |
$this->assertEquals(0, $attemptobj->get_number_of_unanswered_questions());
|
127 |
$this->assertEquals(0, $attemptobj->get_number_of_unanswered_questions());
|
Línea 126... |
Línea 128... |
126 |
|
128 |
|
127 |
// Finish the attempt.
|
129 |
// Finish the attempt.
|
Línea 128... |
Línea 130... |
128 |
$attemptobj = quiz_attempt::create($attempt->id);
|
130 |
$attemptobj = quiz_attempt::create($attempt->id);
|
129 |
$this->assertTrue($attemptobj->has_response_to_at_least_one_graded_question());
|
131 |
$this->assertTrue($attemptobj->has_response_to_at_least_one_graded_question());
|
130 |
$attemptobj->process_finish($timenow, false);
|
- |
|
131 |
|
132 |
$attemptobj->process_submit($timenow, false);
|
132 |
// Re-load quiz attempt data.
|
133 |
|
133 |
$attemptobj = quiz_attempt::create($attempt->id);
|
134 |
// Re-load quiz attempt data.
|
134 |
|
135 |
$attemptobj = quiz_attempt::create($attempt->id);
|
135 |
// Check that results are stored as expected.
|
136 |
|
- |
|
137 |
// Check that results are stored as expected.
|
- |
|
138 |
$this->assertEquals(1, $attemptobj->get_attempt_number());
|
- |
|
139 |
$this->assertEquals(false, $attemptobj->is_finished());
|
- |
|
140 |
$this->assertEquals($timenow, $attemptobj->get_submitted_date());
|
- |
|
141 |
$this->assertEquals($user1->id, $attemptobj->get_userid());
|
- |
|
142 |
$this->assertTrue($attemptobj->has_response_to_at_least_one_graded_question());
|
- |
|
143 |
$this->assertEquals(0, $attemptobj->get_number_of_unanswered_questions());
|
Línea 136... |
Línea 144... |
136 |
$this->assertEquals(1, $attemptobj->get_attempt_number());
|
144 |
// Check we don't have grades yet.
|
- |
|
145 |
$this->assertEmpty(quiz_get_user_grades($quiz, $user1->id));
|
- |
|
146 |
$this->assertNull($attemptobj->get_sum_marks());
|
- |
|
147 |
|
137 |
$this->assertEquals(3, $attemptobj->get_sum_marks());
|
148 |
// Now grade the submission.
|
138 |
$this->assertEquals(true, $attemptobj->is_finished());
|
149 |
$attemptobj->process_grade_submission($timenow);
|
139 |
$this->assertEquals($timenow, $attemptobj->get_submitted_date());
|
150 |
$attemptobj = quiz_attempt::create($attempt->id);
|
Línea 140... |
Línea 151... |
140 |
$this->assertEquals($user1->id, $attemptobj->get_userid());
|
151 |
|
Línea 151... |
Línea 162... |
151 |
$gradebookitem = array_shift($gradebookgrades->items);
|
162 |
$gradebookitem = array_shift($gradebookgrades->items);
|
152 |
$gradebookgrade = array_shift($gradebookitem->grades);
|
163 |
$gradebookgrade = array_shift($gradebookitem->grades);
|
153 |
$this->assertEquals(100, $gradebookgrade->grade);
|
164 |
$this->assertEquals(100, $gradebookgrade->grade);
|
Línea 154... |
Línea 165... |
154 |
|
165 |
|
155 |
// Update question in quiz.
|
166 |
// Update question in quiz.
|
- |
|
167 |
$newsa = $questiongenerator->update_question(
|
- |
|
168 |
$saq,
|
156 |
$newsa = $questiongenerator->update_question($saq, null,
|
169 |
null,
|
- |
|
170 |
['name' => 'This is the second version of shortanswer']
|
157 |
['name' => 'This is the second version of shortanswer']);
|
171 |
);
|
- |
|
172 |
$newnumbq = $questiongenerator->update_question(
|
- |
|
173 |
$numq,
|
158 |
$newnumbq = $questiongenerator->update_question($numq, null,
|
174 |
null,
|
- |
|
175 |
['name' => 'This is the second version of numerical']
|
159 |
['name' => 'This is the second version of numerical']);
|
176 |
);
|
- |
|
177 |
$newmatch = $questiongenerator->update_question(
|
- |
|
178 |
$matchq,
|
160 |
$newmatch = $questiongenerator->update_question($matchq, null,
|
179 |
null,
|
- |
|
180 |
['name' => 'This is the second version of match']
|
161 |
['name' => 'This is the second version of match']);
|
181 |
);
|
- |
|
182 |
$newdescription = $questiongenerator->update_question(
|
- |
|
183 |
$description,
|
162 |
$newdescription = $questiongenerator->update_question($description, null,
|
184 |
null,
|
- |
|
185 |
['name' => 'This is the second version of description']
|
Línea 163... |
Línea 186... |
163 |
['name' => 'This is the second version of description']);
|
186 |
);
|
164 |
|
187 |
|
165 |
// Update the attempt to use this questions.
|
188 |
// Update the attempt to use this questions.
|
Línea 216... |
Línea 239... |
216 |
// Make a quiz.
|
239 |
// Make a quiz.
|
217 |
$timeclose = time() + HOURSECS;
|
240 |
$timeclose = time() + HOURSECS;
|
218 |
$quizgenerator = $this->getDataGenerator()->get_plugin_generator('mod_quiz');
|
241 |
$quizgenerator = $this->getDataGenerator()->get_plugin_generator('mod_quiz');
|
Línea 219... |
Línea 242... |
219 |
|
242 |
|
220 |
$quiz = $quizgenerator->create_instance(
|
243 |
$quiz = $quizgenerator->create_instance(
|
221 |
['course' => $SITE->id, 'timeclose' => $timeclose,
|
244 |
['course' => $SITE->id, 'timeclose' => $timeclose,
|
- |
|
245 |
'overduehandling' => $overduehandling,
|
- |
|
246 |
'graceperiod' => HOURSECS]
|
Línea 222... |
Línea 247... |
222 |
'overduehandling' => $overduehandling, 'graceperiod' => HOURSECS]);
|
247 |
);
|
223 |
|
248 |
|
224 |
// Create a question.
|
249 |
// Create a question.
|
225 |
/** @var \core_question_generator $questiongenerator */
|
250 |
/** @var \core_question_generator $questiongenerator */
|
Línea 394... |
Línea 419... |
394 |
|
419 |
|
395 |
// Finish the attempt.
|
420 |
// Finish the attempt.
|
396 |
$attemptobj = quiz_attempt::create($attempt->id);
|
421 |
$attemptobj = quiz_attempt::create($attempt->id);
|
397 |
$this->assertTrue($attemptobj->has_response_to_at_least_one_graded_question());
|
422 |
$this->assertTrue($attemptobj->has_response_to_at_least_one_graded_question());
|
398 |
$this->assertEquals(0, $attemptobj->get_number_of_unanswered_questions());
|
423 |
$this->assertEquals(0, $attemptobj->get_number_of_unanswered_questions());
|
Línea 399... |
Línea 424... |
399 |
$attemptobj->process_finish($timenow, false);
|
424 |
$attemptobj->process_submit($timenow, false);
|
400 |
|
425 |
|
Línea 401... |
Línea 426... |
401 |
// Re-load quiz attempt data.
|
426 |
// Re-load quiz attempt data.
|
402 |
$attemptobj = quiz_attempt::create($attempt->id);
|
427 |
$attemptobj = quiz_attempt::create($attempt->id);
|
403 |
|
- |
|
404 |
// Check that results are stored as expected.
|
428 |
|
405 |
$this->assertEquals(1, $attemptobj->get_attempt_number());
|
429 |
// Check that results are stored as expected.
|
406 |
$this->assertEquals(4, $attemptobj->get_sum_marks());
|
430 |
$this->assertEquals(1, $attemptobj->get_attempt_number());
|
407 |
$this->assertEquals(true, $attemptobj->is_finished());
|
431 |
$this->assertEquals(false, $attemptobj->is_finished());
|
408 |
$this->assertEquals($timenow, $attemptobj->get_submitted_date());
|
432 |
$this->assertEquals($timenow, $attemptobj->get_submitted_date());
|
Línea -... |
Línea 433... |
- |
|
433 |
$this->assertEquals($user1->id, $attemptobj->get_userid());
|
- |
|
434 |
$this->assertTrue($attemptobj->has_response_to_at_least_one_graded_question());
|
- |
|
435 |
$this->assertEquals(0, $attemptobj->get_number_of_unanswered_questions());
|
- |
|
436 |
|
- |
|
437 |
// Check we don't have grades yet.
|
- |
|
438 |
$this->assertEmpty(quiz_get_user_grades($quiz, $user1->id));
|
- |
|
439 |
$this->assertNull($attemptobj->get_sum_marks());
|
- |
|
440 |
|
- |
|
441 |
// Now grade the submission.
|
- |
|
442 |
$attemptobj->process_grade_submission($timenow);
|
- |
|
443 |
$attemptobj = quiz_attempt::create($attempt->id);
|
- |
|
444 |
|
409 |
$this->assertEquals($user1->id, $attemptobj->get_userid());
|
445 |
// Check quiz grades.
|
410 |
$this->assertTrue($attemptobj->has_response_to_at_least_one_graded_question());
|
446 |
$this->assertEquals(true, $attemptobj->is_finished());
|
411 |
$this->assertEquals(0, $attemptobj->get_number_of_unanswered_questions());
|
447 |
$this->assertEquals(4, $attemptobj->get_sum_marks());
|
412 |
|
448 |
|
Línea 421... |
Línea 457... |
421 |
$gradebookgrade = array_shift($gradebookitem->grades);
|
457 |
$gradebookgrade = array_shift($gradebookitem->grades);
|
422 |
$this->assertEquals(100, $gradebookgrade->grade);
|
458 |
$this->assertEquals(100, $gradebookgrade->grade);
|
423 |
}
|
459 |
}
|
424 |
}
|
460 |
}
|
Línea -... |
Línea 461... |
- |
|
461 |
|
- |
|
462 |
/**
|
425 |
|
463 |
* Get the correct response for variants.
|
- |
|
464 |
*
|
- |
|
465 |
* @return array
|
426 |
|
466 |
*/
|
427 |
public function get_correct_response_for_variants() {
|
467 |
public static function get_correct_response_for_variants(): array {
|
428 |
return [[1, 9.9], [2, 8.5], [5, 14.2], [10, 6.8, true]];
|
468 |
return [[1, 9.9], [2, 8.5], [5, 14.2], [10, 6.8, true]];
|
Línea -... |
Línea 469... |
- |
|
469 |
}
|
429 |
}
|
470 |
|
Línea 430... |
Línea 471... |
430 |
|
471 |
/** @var ?\quiz A quiz with variants */
|
431 |
protected $quizwithvariants = null;
|
472 |
protected $quizwithvariants = null;
|
432 |
|
473 |
|
Línea 487... |
Línea 528... |
487 |
// Finish the attempt.
|
528 |
// Finish the attempt.
|
488 |
$attemptobj = quiz_attempt::create($attempt->id);
|
529 |
$attemptobj = quiz_attempt::create($attempt->id);
|
489 |
$this->assertTrue($attemptobj->has_response_to_at_least_one_graded_question());
|
530 |
$this->assertTrue($attemptobj->has_response_to_at_least_one_graded_question());
|
490 |
$this->assertEquals(0, $attemptobj->get_number_of_unanswered_questions());
|
531 |
$this->assertEquals(0, $attemptobj->get_number_of_unanswered_questions());
|
Línea 491... |
Línea 532... |
491 |
|
532 |
|
Línea 492... |
Línea 533... |
492 |
$attemptobj->process_finish($timenow, false);
|
533 |
$attemptobj->process_submit($timenow, false);
|
493 |
|
534 |
|
Línea 494... |
Línea 535... |
494 |
// Re-load quiz attempt data.
|
535 |
// Re-load quiz attempt data.
|
495 |
$attemptobj = quiz_attempt::create($attempt->id);
|
536 |
$attemptobj = quiz_attempt::create($attempt->id);
|
496 |
|
- |
|
497 |
// Check that results are stored as expected.
|
537 |
|
498 |
$this->assertEquals(1, $attemptobj->get_attempt_number());
|
538 |
// Check that results are stored as expected.
|
499 |
$this->assertEquals(1, $attemptobj->get_sum_marks());
|
539 |
$this->assertEquals(1, $attemptobj->get_attempt_number());
|
500 |
$this->assertEquals(true, $attemptobj->is_finished());
|
540 |
$this->assertEquals(false, $attemptobj->is_finished());
|
501 |
$this->assertEquals($timenow, $attemptobj->get_submitted_date());
|
541 |
$this->assertEquals($timenow, $attemptobj->get_submitted_date());
|
Línea -... |
Línea 542... |
- |
|
542 |
$this->assertEquals($user1->id, $attemptobj->get_userid());
|
- |
|
543 |
$this->assertTrue($attemptobj->has_response_to_at_least_one_graded_question());
|
- |
|
544 |
$this->assertEquals(0, $attemptobj->get_number_of_unanswered_questions());
|
- |
|
545 |
|
- |
|
546 |
// Check we don't have grades yet.
|
- |
|
547 |
$this->assertEmpty(quiz_get_user_grades($this->quizwithvariants, $user1->id));
|
- |
|
548 |
$this->assertNull($attemptobj->get_sum_marks());
|
- |
|
549 |
|
- |
|
550 |
// Now grade the submission.
|
- |
|
551 |
$attemptobj->process_grade_submission($timenow);
|
- |
|
552 |
$attemptobj = quiz_attempt::create($attempt->id);
|
502 |
$this->assertEquals($user1->id, $attemptobj->get_userid());
|
553 |
|
503 |
$this->assertTrue($attemptobj->has_response_to_at_least_one_graded_question());
|
554 |
// Check quiz grades.
|
504 |
$this->assertEquals(0, $attemptobj->get_number_of_unanswered_questions());
|
555 |
$this->assertEquals(true, $attemptobj->is_finished());
|
505 |
|
556 |
$this->assertEquals(1, $attemptobj->get_sum_marks());
|
Línea 559... |
Línea 610... |
559 |
$this->assertEquals(1, $attemptobj->get_attempt_number());
|
610 |
$this->assertEquals(1, $attemptobj->get_attempt_number());
|
560 |
$this->assertFalse($attemptobj->is_finished());
|
611 |
$this->assertFalse($attemptobj->is_finished());
|
561 |
$this->assertEquals(quiz_attempt::IN_PROGRESS, $attemptobj->get_state());
|
612 |
$this->assertEquals(quiz_attempt::IN_PROGRESS, $attemptobj->get_state());
|
562 |
$this->assertEquals(0, $attemptobj->get_submitted_date());
|
613 |
$this->assertEquals(0, $attemptobj->get_submitted_date());
|
563 |
$this->assertEquals($user->id, $attemptobj->get_userid());
|
614 |
$this->assertEquals($user->id, $attemptobj->get_userid());
|
- |
|
615 |
$this->assertEquals(
|
564 |
$this->assertEquals($overriddentimeclose,
|
616 |
$overriddentimeclose,
|
565 |
$attemptobj->get_access_manager($reopentime)->get_end_time($attemptobj->get_attempt()));
|
617 |
$attemptobj->get_access_manager($reopentime)->get_end_time($attemptobj->get_attempt())
|
- |
|
618 |
);
|
Línea 566... |
Línea 619... |
566 |
|
619 |
|
567 |
// Verify this was logged correctly.
|
620 |
// Verify this was logged correctly.
|
568 |
$events = $sink->get_events();
|
621 |
$events = $sink->get_events();
|
Línea 569... |
Línea 622... |
569 |
$this->assertCount(1, $events);
|
622 |
$this->assertCount(1, $events);
|
570 |
|
623 |
|
571 |
$reopenedevent = array_shift($events);
|
624 |
$reopenedevent = array_shift($events);
|
- |
|
625 |
$this->assertInstanceOf('\mod_quiz\event\attempt_reopened', $reopenedevent);
|
572 |
$this->assertInstanceOf('\mod_quiz\event\attempt_reopened', $reopenedevent);
|
626 |
$this->assertEquals($attemptobj->get_context(), $reopenedevent->get_context());
|
573 |
$this->assertEquals($attemptobj->get_context(), $reopenedevent->get_context());
|
627 |
$this->assertEquals(
|
- |
|
628 |
new moodle_url('/mod/quiz/review.php', ['attempt' => $attemptobj->get_attemptid()]),
|
574 |
$this->assertEquals(new moodle_url('/mod/quiz/review.php', ['attempt' => $attemptobj->get_attemptid()]),
|
629 |
$reopenedevent->get_url()
|
Línea 575... |
Línea 630... |
575 |
$reopenedevent->get_url());
|
630 |
);
|
576 |
}
|
631 |
}
|
577 |
|
632 |
|
Línea 614... |
Línea 669... |
614 |
$this->assertEquals($user->id, $attemptobj->get_userid());
|
669 |
$this->assertEquals($user->id, $attemptobj->get_userid());
|
615 |
$this->assertEquals(1, $attemptobj->get_sum_marks());
|
670 |
$this->assertEquals(1, $attemptobj->get_sum_marks());
|
Línea 616... |
Línea 671... |
616 |
|
671 |
|
617 |
// Verify this was logged correctly - there are some gradebook events between the two we want to check.
|
672 |
// Verify this was logged correctly - there are some gradebook events between the two we want to check.
|
618 |
$events = $sink->get_events();
|
673 |
$events = $sink->get_events();
|
Línea -... |
Línea 674... |
- |
|
674 |
$this->assertGreaterThanOrEqual(3, $events);
|
- |
|
675 |
|
- |
|
676 |
$attempturl = new moodle_url(
|
- |
|
677 |
'/mod/quiz/review.php',
|
619 |
$this->assertGreaterThanOrEqual(2, $events);
|
678 |
['attempt' => $attemptobj->get_attemptid()],
|
620 |
|
679 |
);
|
621 |
$reopenedevent = array_shift($events);
|
680 |
$reopenedevent = array_shift($events);
|
622 |
$this->assertInstanceOf('\mod_quiz\event\attempt_reopened', $reopenedevent);
|
- |
|
623 |
$this->assertEquals($attemptobj->get_context(), $reopenedevent->get_context());
|
- |
|
Línea -... |
Línea 681... |
- |
|
681 |
$this->assertInstanceOf('\mod_quiz\event\attempt_reopened', $reopenedevent);
|
- |
|
682 |
$this->assertEquals($attemptobj->get_context(), $reopenedevent->get_context());
|
624 |
$this->assertEquals(new moodle_url('/mod/quiz/review.php', ['attempt' => $attemptobj->get_attemptid()]),
|
683 |
|
625 |
$reopenedevent->get_url());
|
684 |
$this->assertEquals($attempturl, $reopenedevent->get_url());
|
626 |
|
685 |
|
- |
|
686 |
$submittedevent = array_shift($events);
|
- |
|
687 |
$this->assertInstanceOf('\mod_quiz\event\attempt_submitted', $submittedevent);
|
- |
|
688 |
$this->assertEquals($attemptobj->get_context(), $submittedevent->get_context());
|
- |
|
689 |
|
- |
|
690 |
$this->assertEquals($attempturl, $submittedevent->get_url());
|
627 |
$submittedevent = array_pop($events);
|
691 |
|
- |
|
692 |
$gradedevent = array_pop($events);
|
- |
|
693 |
$this->assertInstanceOf('\mod_quiz\event\attempt_graded', $gradedevent);
|
- |
|
694 |
$this->assertEquals($attemptobj->get_context(), $gradedevent->get_context());
|
- |
|
695 |
$this->assertEquals($attempturl, $gradedevent->get_url());
|
- |
|
696 |
}
|
- |
|
697 |
|
- |
|
698 |
/**
|
- |
|
699 |
* Create a quiz with questions, pre-create an attempt, edit a question, then begin the attempt.
|
- |
|
700 |
*/
|
- |
|
701 |
public function test_quiz_attempt_walkthrough_update_question_after_precreate(): void {
|
- |
|
702 |
global $SITE;
|
- |
|
703 |
|
- |
|
704 |
$this->resetAfterTest(true);
|
- |
|
705 |
|
- |
|
706 |
// Make a quiz.
|
- |
|
707 |
$quizgenerator = $this->getDataGenerator()->get_plugin_generator('mod_quiz');
|
- |
|
708 |
|
628 |
$this->assertInstanceOf('\mod_quiz\event\attempt_submitted', $submittedevent);
|
709 |
$quiz = $quizgenerator->create_instance(
|
- |
|
710 |
[
|
- |
|
711 |
'course' => $SITE->id,
|
- |
|
712 |
'questionsperpage' => 0,
|
- |
|
713 |
'grade' => 100.0,
|
- |
|
714 |
'sumgrades' => 3,
|
- |
|
715 |
],
|
- |
|
716 |
);
|
- |
|
717 |
|
- |
|
718 |
// Create a couple of questions.
|
- |
|
719 |
$questiongenerator = $this->getDataGenerator()->get_plugin_generator('core_question');
|
- |
|
720 |
|
- |
|
721 |
$cat = $questiongenerator->create_question_category();
|
- |
|
722 |
$saq = $questiongenerator->create_question('shortanswer', null, ['category' => $cat->id]);
|
- |
|
723 |
$numq = $questiongenerator->create_question('numerical', null, ['category' => $cat->id]);
|
- |
|
724 |
$matchq = $questiongenerator->create_question('match', null, ['category' => $cat->id]);
|
- |
|
725 |
$description = $questiongenerator->create_question('description', null, ['category' => $cat->id]);
|
- |
|
726 |
|
- |
|
727 |
// Add them to the quiz.
|
- |
|
728 |
quiz_add_quiz_question($saq->id, $quiz);
|
- |
|
729 |
quiz_add_quiz_question($numq->id, $quiz);
|
- |
|
730 |
quiz_add_quiz_question($matchq->id, $quiz);
|
- |
|
731 |
quiz_add_quiz_question($description->id, $quiz);
|
- |
|
732 |
|
- |
|
733 |
// Make a user to do the quiz.
|
- |
|
734 |
$user1 = $this->getDataGenerator()->create_user();
|
- |
|
735 |
|
- |
|
736 |
$quizobj = quiz_settings::create($quiz->id, $user1->id);
|
- |
|
737 |
|
- |
|
738 |
// Start the attempt.
|
- |
|
739 |
$quba = question_engine::make_questions_usage_by_activity('mod_quiz', $quizobj->get_context());
|
- |
|
740 |
$quba->set_preferred_behaviour($quizobj->get_quiz()->preferredbehaviour);
|
- |
|
741 |
|
- |
|
742 |
$timenow = time();
|
- |
|
743 |
$attempt = quiz_create_attempt($quizobj, 1, false, $timenow, false, $user1->id);
|
- |
|
744 |
|
- |
|
745 |
quiz_start_new_attempt($quizobj, $quba, $attempt, 1, $timenow);
|
- |
|
746 |
$this->assertEquals('1,2,3,4,0', $attempt->layout);
|
- |
|
747 |
|
- |
|
748 |
quiz_attempt_save_not_started($quba, $attempt);
|
- |
|
749 |
|
- |
|
750 |
$attemptobj = quiz_attempt::create($attempt->id);
|
- |
|
751 |
|
- |
|
752 |
// Update question in quiz.
|
- |
|
753 |
$newsa = $questiongenerator->update_question($saq, null,
|
- |
|
754 |
['name' => 'This is the second version of shortanswer']);
|
- |
|
755 |
$newnumbq = $questiongenerator->update_question($numq, null,
|
- |
|
756 |
['name' => 'This is the second version of numerical']);
|
- |
|
757 |
$newmatch = $questiongenerator->update_question($matchq, null,
|
- |
|
758 |
['name' => 'This is the second version of match']);
|
- |
|
759 |
$newdescription = $questiongenerator->update_question($description, null,
|
- |
|
760 |
['name' => 'This is the second version of description']);
|
- |
|
761 |
|
- |
|
762 |
$this->assertEquals($saq->id, $attemptobj->get_question_attempt(1)->get_question_id());
|
- |
|
763 |
$this->assertEquals($numq->id, $attemptobj->get_question_attempt(2)->get_question_id());
|
- |
|
764 |
$this->assertEquals($matchq->id, $attemptobj->get_question_attempt(3)->get_question_id());
|
- |
|
765 |
$this->assertEquals($description->id, $attemptobj->get_question_attempt(4)->get_question_id());
|
- |
|
766 |
|
- |
|
767 |
quiz_attempt_save_started($quizobj, $quba, $attempt);
|
- |
|
768 |
|
- |
|
769 |
// Verify that the started attempt contains the new questions.
|
- |
|
770 |
$attemptobj = quiz_attempt::create($attempt->id);
|
- |
|
771 |
$this->assertEquals($newsa->id, $attemptobj->get_question_attempt(1)->get_question_id());
|
629 |
$this->assertEquals($attemptobj->get_context(), $submittedevent->get_context());
|
772 |
$this->assertEquals($newnumbq->id, $attemptobj->get_question_attempt(2)->get_question_id());
|
630 |
$this->assertEquals(new moodle_url('/mod/quiz/review.php', ['attempt' => $attemptobj->get_attemptid()]),
|
773 |
$this->assertEquals($newmatch->id, $attemptobj->get_question_attempt(3)->get_question_id());
|