2 // This file is part of Moodle - http://moodle.org/
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.
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.
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/>.
18 * Quiz attempt walk through tests.
22 * @copyright 2013 The Open University
23 * @author Jamie Pratt <me@jamiep.org>
24 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
27 defined('MOODLE_INTERNAL') || die();
30 require_once($CFG->dirroot . '/mod/quiz/editlib.php');
31 require_once($CFG->dirroot . '/mod/quiz/locallib.php');
34 * Quiz attempt walk through.
38 * @copyright 2013 The Open University
39 * @author Jamie Pratt <me@jamiep.org>
40 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
42 class mod_quiz_attempt_walkthrough_testcase extends advanced_testcase {
45 * Create a quiz with questions and walk through a quiz attempt.
47 public function test_quiz_attempt_walkthrough() {
50 $this->resetAfterTest(true);
53 $quizgenerator = $this->getDataGenerator()->get_plugin_generator('mod_quiz');
55 $quiz = $quizgenerator->create_instance(array('course'=>$SITE->id, 'questionsperpage' => 0, 'grade' => 100.0,
58 // Create a couple of questions.
59 $questiongenerator = $this->getDataGenerator()->get_plugin_generator('core_question');
61 $cat = $questiongenerator->create_question_category();
62 $saq = $questiongenerator->create_question('shortanswer', null, array('category' => $cat->id));
63 $numq = $questiongenerator->create_question('numerical', null, array('category' => $cat->id));
65 // Add them to the quiz.
66 quiz_add_quiz_question($saq->id, $quiz);
67 quiz_add_quiz_question($numq->id, $quiz);
69 // Make a user to do the quiz.
70 $user1 = $this->getDataGenerator()->create_user();
71 $this->setUser($user1);
73 $quizobj = quiz::create($quiz->id, $user1->id);
76 $quba = question_engine::make_questions_usage_by_activity('mod_quiz', $quizobj->get_context());
77 $quba->set_preferred_behaviour($quizobj->get_quiz()->preferredbehaviour);
80 $attempt = quiz_create_attempt($quizobj, 1, false, $timenow);
82 quiz_start_new_attempt($quizobj, $quba, $attempt, 1, $timenow);
84 quiz_attempt_save_started($quizobj, $quba, $attempt);
86 // Process some responses from the student.
87 $attemptobj = quiz_attempt::create($attempt->id);
88 $prefix1 = $quba->get_field_prefix(1);
89 $prefix2 = $quba->get_field_prefix(2);
91 $tosubmit = array(1 => array('answer' => 'frog'),
92 2 => array('answer' => '3.14'));
94 $attemptobj->process_submitted_actions($timenow, false, $tosubmit);
96 // Finish the attempt.
97 $attemptobj = quiz_attempt::create($attempt->id);
98 $attemptobj->process_finish($timenow, false);
100 // Re-load quiz attempt data.
101 $attemptobj = quiz_attempt::create($attempt->id);
103 // Check that results are stored as expected.
104 $this->assertEquals(1, $attemptobj->get_attempt_number());
105 $this->assertEquals(2, $attemptobj->get_sum_marks());
106 $this->assertEquals(true, $attemptobj->is_finished());
107 $this->assertEquals($timenow, $attemptobj->get_submitted_date());
108 $this->assertEquals($user1->id, $attemptobj->get_userid());
110 // Check quiz grades.
111 $grades = quiz_get_user_grades($quiz, $user1->id);
112 $grade = array_shift($grades);
113 $this->assertEquals(100.0, $grade->rawgrade);
116 $gradebookgrades = grade_get_grades($SITE->id, 'mod', 'quiz', $quiz->id, $user1->id);
117 $gradebookitem = array_shift($gradebookgrades->items);
118 $gradebookgrade = array_shift($gradebookitem->grades);
119 $this->assertEquals(100, $gradebookgrade->grade);
123 * Create a quiz with a random as well as other questions and walk through quiz attempts.
125 public function test_quiz_with_random_question_attempt_walkthrough() {
128 $this->resetAfterTest(true);
129 question_bank::get_qtype('random')->clear_caches_before_testing();
131 $this->setAdminUser();
134 $quizgenerator = $this->getDataGenerator()->get_plugin_generator('mod_quiz');
136 $quiz = $quizgenerator->create_instance(array('course'=>$SITE->id, 'questionsperpage' => 0, 'grade' => 100.0,
139 $questiongenerator = $this->getDataGenerator()->get_plugin_generator('core_question');
141 // Add two questions to question category.
142 $cat = $questiongenerator->create_question_category();
143 $saq = $questiongenerator->create_question('shortanswer', null, array('category' => $cat->id));
144 $numq = $questiongenerator->create_question('numerical', null, array('category' => $cat->id));
146 // Add random question to the quiz.
147 quiz_add_random_questions($quiz, 0, $cat->id, 1, false);
149 // Make another category.
150 $cat2 = $questiongenerator->create_question_category();
151 $match = $questiongenerator->create_question('match', null, array('category' => $cat->id));
153 quiz_add_quiz_question($match->id, $quiz, 0);
155 $multichoicemulti = $questiongenerator->create_question('multichoice', 'two_of_four', array('category' => $cat->id));
157 quiz_add_quiz_question($multichoicemulti->id, $quiz, 0);
159 $multichoicesingle = $questiongenerator->create_question('multichoice', 'one_of_four', array('category' => $cat->id));
161 quiz_add_quiz_question($multichoicesingle->id, $quiz, 0);
163 foreach (array($saq->id => 'frog', $numq->id => '3.14') as $randomqidtoselect => $randqanswer) {
164 // Make a new user to do the quiz each loop.
165 $user1 = $this->getDataGenerator()->create_user();
166 $this->setUser($user1);
168 $quizobj = quiz::create($quiz->id, $user1->id);
170 // Start the attempt.
171 $quba = question_engine::make_questions_usage_by_activity('mod_quiz', $quizobj->get_context());
172 $quba->set_preferred_behaviour($quizobj->get_quiz()->preferredbehaviour);
175 $attempt = quiz_create_attempt($quizobj, 1, false, $timenow);
177 quiz_start_new_attempt($quizobj, $quba, $attempt, 1, $timenow, array(1 => $randomqidtoselect));
179 quiz_attempt_save_started($quizobj, $quba, $attempt);
181 // Process some responses from the student.
182 $attemptobj = quiz_attempt::create($attempt->id);
185 $selectedquestionid = $quba->get_question_attempt(1)->get_question()->id;
186 $tosubmit[1] = array('answer' => $randqanswer);
187 $tosubmit[2] = array(
191 $tosubmit[3] = array('1', '0', '1', '0'); // First and third choice.
192 $tosubmit[4] = array('answer' => 0); // The first choice.
194 $attemptobj->process_submitted_actions($timenow, false, $tosubmit);
196 // Finish the attempt.
197 $attemptobj = quiz_attempt::create($attempt->id);
198 $attemptobj->process_finish($timenow, false);
200 // Re-load quiz attempt data.
201 $attemptobj = quiz_attempt::create($attempt->id);
203 // Check that results are stored as expected.
204 $this->assertEquals(1, $attemptobj->get_attempt_number());
205 $this->assertEquals(4, $attemptobj->get_sum_marks());
206 $this->assertEquals(true, $attemptobj->is_finished());
207 $this->assertEquals($timenow, $attemptobj->get_submitted_date());
208 $this->assertEquals($user1->id, $attemptobj->get_userid());
210 // Check quiz grades.
211 $grades = quiz_get_user_grades($quiz, $user1->id);
212 $grade = array_shift($grades);
213 $this->assertEquals(100.0, $grade->rawgrade);
216 $gradebookgrades = grade_get_grades($SITE->id, 'mod', 'quiz', $quiz->id, $user1->id);
217 $gradebookitem = array_shift($gradebookgrades->items);
218 $gradebookgrade = array_shift($gradebookitem->grades);
219 $this->assertEquals(100, $gradebookgrade->grade);