2828global $ CFG ;
2929require_once ($ CFG ->dirroot . '/mod/quiz/locallib.php ' );
3030
31-
3231/**
33- * Subclass of quiz_attempt to allow faking of the page layout .
32+ * Tests for the quiz_attempt class .
3433 *
3534 * @copyright 2014 Tim Hunt
3635 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
3736 */
38- class mod_quiz_attempt_testable extends quiz_attempt {
39- /** @var array list of slots to treat as if they contain descriptions in the fake layout. */
40- protected $ infos = array ();
37+ class mod_quiz_attempt_testcase extends advanced_testcase {
4138
4239 /**
43- * Set a fake page layout. Used when we test URL generation .
44- * @param int $id assumed attempt id.
40+ * Create quiz and attempt data with layout .
41+ *
4542 * @param string $layout layout to set. Like quiz attempt.layout. E.g. '1,2,0,3,4,0,'.
46- * @param array $infos slot numbers which contain 'descriptions', or other non-questions.
47- * @return quiz_attempt attempt object for use in unit tests.
43+ * @return quiz_attempt the new quiz_attempt object
4844 */
49- public static function setup_fake_attempt_layout ($ id , $ layout , $ infos = array ()) {
50- $ attempt = new stdClass ();
51- $ attempt ->id = $ id ;
52- $ attempt ->layout = $ layout ;
45+ protected function create_quiz_and_attempt_with_layout ($ layout ) {
46+ $ this ->resetAfterTest (true );
47+
48+ // Make a user to do the quiz.
49+ $ user = $ this ->getDataGenerator ()->create_user ();
50+ $ course = $ this ->getDataGenerator ()->create_course ();
51+ // Make a quiz.
52+ $ quizgenerator = $ this ->getDataGenerator ()->get_plugin_generator ('mod_quiz ' );
53+ $ quiz = $ quizgenerator ->create_instance (['course ' => $ course ->id ,
54+ 'grade ' => 100.0 , 'sumgrades ' => 2 , 'layout ' => $ layout ]);
5355
54- $ course = new stdClass ();
55- $ quiz = new stdClass ();
56- $ cm = new stdClass ();
57- $ cm ->id = 0 ;
56+ $ quizobj = quiz::create ($ quiz ->id , $ user ->id );
5857
59- $ attemptobj = new self ($ attempt , $ quiz , $ cm , $ course , false );
6058
61- $ attemptobj ->slots = array ();
59+ $ quba = question_engine::make_questions_usage_by_activity ('mod_quiz ' , $ quizobj ->get_context ());
60+ $ quba ->set_preferred_behaviour ($ quizobj ->get_quiz ()->preferredbehaviour );
61+
62+ $ questiongenerator = $ this ->getDataGenerator ()->get_plugin_generator ('core_question ' );
63+ $ cat = $ questiongenerator ->create_question_category ();
64+
65+ $ page = 1 ;
6266 foreach (explode (', ' , $ layout ) as $ slot ) {
6367 if ($ slot == 0 ) {
68+ $ page += 1 ;
6469 continue ;
6570 }
66- $ attemptobj ->slots [$ slot ] = new stdClass ();
67- $ attemptobj ->slots [$ slot ]->slot = $ slot ;
68- $ attemptobj ->slots [$ slot ]->requireprevious = 0 ;
69- $ attemptobj ->slots [$ slot ]->questionid = 0 ;
70- }
71-
72- $ attemptobj ->sections = array ();
73- $ attemptobj ->sections [0 ] = new stdClass ();
74- $ attemptobj ->sections [0 ]->heading = '' ;
75- $ attemptobj ->sections [0 ]->firstslot = 1 ;
76- $ attemptobj ->sections [0 ]->shufflequestions = 0 ;
7771
78- $ attemptobj ->infos = $ infos ;
79- $ attemptobj ->link_sections_and_slots ();
80- $ attemptobj ->determine_layout ();
81- $ attemptobj ->number_questions ();
72+ $ question = $ questiongenerator ->create_question ('shortanswer ' , null , ['category ' => $ cat ->id ]);
73+ quiz_add_quiz_question ($ question ->id , $ quiz , $ page );
74+ }
8275
83- return $ attemptobj ;
84- }
76+ $ timenow = time ();
77+ $ attempt = quiz_create_attempt ($ quizobj , 1 , false , $ timenow , false , $ user ->id );
78+ quiz_start_new_attempt ($ quizobj , $ quba , $ attempt , 1 , $ timenow );
79+ quiz_attempt_save_started ($ quizobj , $ quba , $ attempt );
8580
86- public function is_real_question ($ slot ) {
87- return !in_array ($ slot , $ this ->infos );
81+ return quiz_attempt::create ($ attempt ->id );
8882 }
89- }
9083
91-
92- /**
93- * Tests for the quiz_attempt class.
94- *
95- * @copyright 2014 Tim Hunt
96- * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
97- */
98- class mod_quiz_attempt_testcase extends advanced_testcase {
9984 /**
10085 * Test the functions quiz_update_open_attempts() and get_list_of_overdue_attempts()
10186 */
10287 public function test_attempt_url () {
103- $ attempt = mod_quiz_attempt_testable::setup_fake_attempt_layout (
104- 123 , '1,2,0,3,4,0,5,6,0 ' );
88+ $ attempt = $ this ->create_quiz_and_attempt_with_layout ('1,2,0,3,4,0,5,6,0 ' );
89+ $ attemptid = $ attempt ->get_attempt ()->id ;
90+ $ cmid = $ attempt ->get_cmid ();
10591
106- // Attempt pages.
10792 $ this ->assertEquals (new moodle_url (
108- '/mod/quiz/attempt.php?attempt=123&cmid=0 ' ),
109- $ attempt ->attempt_url ());
110-
111- $ this ->assertEquals (new moodle_url (
112- '/mod/quiz/attempt.php?attempt=123&page=2&cmid=0 ' ),
93+ '/mod/quiz/attempt.php?attempt= ' . $ attemptid . '&page=2&cmid= ' . $ cmid ),
11394 $ attempt ->attempt_url (null , 2 ));
11495
11596 $ this ->assertEquals (new moodle_url (
116- '/mod/quiz/attempt.php?attempt=123 &page=1&cmid=0 # ' ),
97+ '/mod/quiz/attempt.php?attempt= ' . $ attemptid . ' &page=1&cmid= ' . $ cmid . ' # ' ),
11798 $ attempt ->attempt_url (3 ));
11899
100+ $ questionattempt = $ attempt ->get_question_attempt (4 );
101+ $ expecteanchor = '# ' . $ questionattempt ->get_outer_question_div_unique_id ();
119102 $ this ->assertEquals (new moodle_url (
120- '/mod/quiz/attempt.php?attempt=123 &page=1&cmid=0#q4 ' ),
103+ '/mod/quiz/attempt.php?attempt= ' . $ attemptid . ' &page=1&cmid= ' . $ cmid . $ expecteanchor ),
121104 $ attempt ->attempt_url (4 ));
122105
123106 $ this ->assertEquals (new moodle_url (
@@ -128,82 +111,80 @@ public function test_attempt_url() {
128111 '# ' ),
129112 $ attempt ->attempt_url (3 , -1 , 1 ));
130113
131- $ this -> assertEquals ( new moodle_url (
132- ' #q4 ' ),
133- $ attempt ->attempt_url (4 , -1 , 1 ));
114+ $ questionattempt = $ attempt -> get_question_attempt ( 4 );
115+ $ expecteanchor = ' # ' . $ questionattempt -> get_outer_question_div_unique_id ();
116+ $ this -> assertEquals ( new moodle_url ( $ expecteanchor ), $ attempt ->attempt_url (4 , -1 , 1 ));
134117
135118 // Summary page.
136119 $ this ->assertEquals (new moodle_url (
137- '/mod/quiz/summary.php?attempt=123 &cmid=0 ' ),
120+ '/mod/quiz/summary.php?attempt= ' . $ attemptid . ' &cmid= ' . $ cmid ),
138121 $ attempt ->summary_url ());
139122
140123 // Review page.
141124 $ this ->assertEquals (new moodle_url (
142- '/mod/quiz/review.php?attempt=123 &cmid=0 ' ),
125+ '/mod/quiz/review.php?attempt= ' . $ attemptid . ' &cmid= ' . $ cmid ),
143126 $ attempt ->review_url ());
144127
145128 $ this ->assertEquals (new moodle_url (
146- '/mod/quiz/review.php?attempt=123 &page=2&cmid=0 ' ),
129+ '/mod/quiz/review.php?attempt= ' . $ attemptid . ' &page=2&cmid= ' . $ cmid ),
147130 $ attempt ->review_url (null , 2 ));
148131
149132 $ this ->assertEquals (new moodle_url (
150- '/mod/quiz/review.php?attempt=123 &page=1&cmid=0 ' ),
133+ '/mod/quiz/review.php?attempt= ' . $ attemptid . ' &page=1&cmid= ' . $ cmid ),
151134 $ attempt ->review_url (3 , -1 , false ));
152135
153136 $ this ->assertEquals (new moodle_url (
154- '/mod/quiz/review.php?attempt=123 &page=1&cmid=0#q4 ' ),
137+ '/mod/quiz/review.php?attempt= ' . $ attemptid . ' &page=1&cmid= ' . $ cmid . $ expecteanchor ),
155138 $ attempt ->review_url (4 , -1 , false ));
156139
157140 $ this ->assertEquals (new moodle_url (
158- '/mod/quiz/review.php?attempt=123 &cmid=0 ' ),
141+ '/mod/quiz/review.php?attempt= ' . $ attemptid . ' &cmid= ' . $ cmid ),
159142 $ attempt ->review_url (null , 2 , true ));
160143
161144 $ this ->assertEquals (new moodle_url (
162- '/mod/quiz/review.php?attempt=123 &cmid=0 ' ),
145+ '/mod/quiz/review.php?attempt= ' . $ attemptid . ' &cmid= ' . $ cmid ),
163146 $ attempt ->review_url (1 , -1 , true ));
164147
165148 $ this ->assertEquals (new moodle_url (
166- '/mod/quiz/review.php?attempt=123 &page=2&cmid=0 ' ),
149+ '/mod/quiz/review.php?attempt= ' . $ attemptid . ' &page=2&cmid= ' . $ cmid ),
167150 $ attempt ->review_url (null , 2 , false ));
168151
169152 $ this ->assertEquals (new moodle_url (
170- '/mod/quiz/review.php?attempt=123 &showall=0&cmid=0 ' ),
153+ '/mod/quiz/review.php?attempt= ' . $ attemptid . ' &showall=0&cmid= ' . $ cmid ),
171154 $ attempt ->review_url (null , 0 , false ));
172155
173156 $ this ->assertEquals (new moodle_url (
174- '/mod/quiz/review.php?attempt=123 &showall=0&cmid=0 ' ),
157+ '/mod/quiz/review.php?attempt= ' . $ attemptid . ' &showall=0&cmid= ' . $ cmid ),
175158 $ attempt ->review_url (1 , -1 , false ));
176159
177160 $ this ->assertEquals (new moodle_url (
178- '/mod/quiz/review.php?attempt=123 &page=1&cmid=0 ' ),
161+ '/mod/quiz/review.php?attempt= ' . $ attemptid . ' &page=1&cmid= ' . $ cmid ),
179162 $ attempt ->review_url (3 , -1 , false ));
180163
181164 $ this ->assertEquals (new moodle_url (
182- '/mod/quiz/review.php?attempt=123 &page=2&cmid=0 ' ),
165+ '/mod/quiz/review.php?attempt= ' . $ attemptid . ' &page=2&cmid= ' . $ cmid ),
183166 $ attempt ->review_url (null , 2 ));
184167
185- $ this ->assertEquals (new moodle_url (
186- '# ' ),
187- $ attempt ->review_url (null , -1 , null , 0 ));
168+ $ this ->assertEquals (new moodle_url ('# ' ), $ attempt ->review_url (null , -1 , null , 0 ));
188169
189- $ this ->assertEquals (new moodle_url (
190- '#q3 ' ),
191- $ attempt ->review_url (3 , -1 , null , 0 ));
192170
193- $ this -> assertEquals ( new moodle_url (
194- ' #q4 ' ),
195- $ attempt ->review_url (4 , -1 , null , 0 ));
171+ $ questionattempt = $ attempt -> get_question_attempt ( 3 );
172+ $ expecteanchor = ' # ' . $ questionattempt -> get_outer_question_div_unique_id ();
173+ $ this -> assertEquals ( new moodle_url ( $ expecteanchor ), $ attempt ->review_url (3 , -1 , null , 0 ));
196174
197- $ this ->assertEquals (new moodle_url (
198- '# ' ),
175+ $ questionattempt = $ attempt ->get_question_attempt (4 );
176+ $ expecteanchor = '# ' . $ questionattempt ->get_outer_question_div_unique_id ();
177+ $ this ->assertEquals (new moodle_url ( $ expecteanchor ), $ attempt ->review_url (4 , -1 , null , 0 ));
178+
179+ $ this ->assertEquals (new moodle_url ('# ' ),
199180 $ attempt ->review_url (null , 2 , true , 0 ));
200181
201182 $ this ->assertEquals (new moodle_url (
202183 '# ' ),
203184 $ attempt ->review_url (1 , -1 , true , 0 ));
204185
205186 $ this ->assertEquals (new moodle_url (
206- '/mod/quiz/review.php?attempt=123 &page=2&cmid=0 ' ),
187+ '/mod/quiz/review.php?attempt= ' . $ attemptid . ' &page=2&cmid= ' . $ cmid ),
207188 $ attempt ->review_url (null , 2 , false , 0 ));
208189
209190 $ this ->assertEquals (new moodle_url (
@@ -215,70 +196,75 @@ public function test_attempt_url() {
215196 $ attempt ->review_url (1 , -1 , false , 0 ));
216197
217198 $ this ->assertEquals (new moodle_url (
218- '/mod/quiz/review.php?attempt=123 &page=1&cmid=0# ' ),
199+ '/mod/quiz/review.php?attempt= ' . $ attemptid . ' &page=1&cmid= ' . $ cmid ),
219200 $ attempt ->review_url (3 , -1 , false , 0 ));
220201
221- // Review with more than 50 questions in the quiz.
222- $ attempt = mod_quiz_attempt_testable::setup_fake_attempt_layout (
223- 124 , '1,2,3,4,5,6,7,8,9,10,0,11,12,13,14,15,16,17,18,19,20,0, ' .
224- '21,22,23,24,25,26,27,28,29,30,0,31,32,33,34,35,36,37,38,39,40,0, ' .
225- '41,42,43,44,45,46,47,48,49,50,0,51,52,53,54,55,56,57,58,59,60,0 ' );
202+ // Setup another attempt.
203+ $ attempt = $ this ->create_quiz_and_attempt_with_layout (
204+ '1,2,3,4,5,6,7,8,9,10,0,11,12,13,14,15,16,17,18,19,20,0, ' .
205+ '21,22,23,24,25,26,27,28,29,30,0,31,32,33,34,35,36,37,38,39,40,0, ' .
206+ '41,42,43,44,45,46,47,48,49,50,0,51,52,53,54,55,56,57,58,59,60,0 ' );
207+ $ attemptid = $ attempt ->get_attempt ()->id ;
208+ $ cmid = $ attempt ->get_cmid ();
226209
227210 $ this ->assertEquals (new moodle_url (
228- '/mod/quiz/review.php?attempt=124 &cmid=0 ' ),
211+ '/mod/quiz/review.php?attempt= ' . $ attemptid . ' &cmid= ' . $ cmid ),
229212 $ attempt ->review_url ());
230213
231214 $ this ->assertEquals (new moodle_url (
232- '/mod/quiz/review.php?attempt=124 &page=2&cmid=0 ' ),
215+ '/mod/quiz/review.php?attempt= ' . $ attemptid . ' &page=2&cmid= ' . $ cmid ),
233216 $ attempt ->review_url (null , 2 ));
234217
235218 $ this ->assertEquals (new moodle_url (
236- '/mod/quiz/review.php?attempt=124 &page=1&cmid=0 ' ),
219+ '/mod/quiz/review.php?attempt= ' . $ attemptid . ' &page=1&cmid= ' . $ cmid . ' # ' ),
237220 $ attempt ->review_url (11 , -1 , false ));
238221
222+
223+ $ questionattempt = $ attempt ->get_question_attempt (12 );
224+ $ expecteanchor = '# ' . $ questionattempt ->get_outer_question_div_unique_id ();
239225 $ this ->assertEquals (new moodle_url (
240- '/mod/quiz/review.php?attempt=124 &page=1&cmid=0#q12 ' ),
226+ '/mod/quiz/review.php?attempt= ' . $ attemptid . ' &page=1&cmid= ' . $ cmid . $ expecteanchor ),
241227 $ attempt ->review_url (12 , -1 , false ));
242228
243229 $ this ->assertEquals (new moodle_url (
244- '/mod/quiz/review.php?attempt=124 &showall=1&cmid=0 ' ),
230+ '/mod/quiz/review.php?attempt= ' . $ attemptid . ' &showall=1&cmid= ' . $ cmid ),
245231 $ attempt ->review_url (null , 2 , true ));
246232
247233 $ this ->assertEquals (new moodle_url (
248- '/mod/quiz/review.php?attempt=124 &showall=1&cmid=0 ' ),
234+ '/mod/quiz/review.php?attempt= ' . $ attemptid . ' &showall=1&cmid= ' . $ cmid ),
249235 $ attempt ->review_url (1 , -1 , true ));
250236
251237 $ this ->assertEquals (new moodle_url (
252- '/mod/quiz/review.php?attempt=124 &page=2&cmid=0 ' ),
238+ '/mod/quiz/review.php?attempt= ' . $ attemptid . ' &page=2&cmid= ' . $ cmid ),
253239 $ attempt ->review_url (null , 2 , false ));
254240
255241 $ this ->assertEquals (new moodle_url (
256- '/mod/quiz/review.php?attempt=124 &cmid=0 ' ),
242+ '/mod/quiz/review.php?attempt= ' . $ attemptid . ' &cmid= ' . $ cmid ),
257243 $ attempt ->review_url (null , 0 , false ));
258244
259245 $ this ->assertEquals (new moodle_url (
260- '/mod/quiz/review.php?attempt=124 &page=1&cmid=0 ' ),
246+ '/mod/quiz/review.php?attempt= ' . $ attemptid . ' &page=1&cmid= ' . $ cmid ),
261247 $ attempt ->review_url (11 , -1 , false ));
262248
263249 $ this ->assertEquals (new moodle_url (
264- '/mod/quiz/review.php?attempt=124 &page=1&cmid=0#q12 ' ),
250+ '/mod/quiz/review.php?attempt= ' . $ attemptid . ' &page=1&cmid= ' . $ cmid . $ expecteanchor ),
265251 $ attempt ->review_url (12 , -1 , false ));
266252
267253 $ this ->assertEquals (new moodle_url (
268- '/mod/quiz/review.php?attempt=124 &page=2&cmid=0 ' ),
254+ '/mod/quiz/review.php?attempt= ' . $ attemptid . ' &page=2&cmid= ' . $ cmid ),
269255 $ attempt ->review_url (null , 2 ));
270256
271257 $ this ->assertEquals (new moodle_url (
272258 '# ' ),
273259 $ attempt ->review_url (null , -1 , null , 0 ));
274260
275- $ this -> assertEquals ( new moodle_url (
276- ' #q3 ' ),
277- $ attempt ->review_url (3 , -1 , null , 0 ));
261+ $ questionattempt = $ attempt -> get_question_attempt ( 3 );
262+ $ expecteanchor = ' # ' . $ questionattempt -> get_outer_question_div_unique_id ();
263+ $ this -> assertEquals ( new moodle_url ( $ expecteanchor ), $ attempt ->review_url (3 , -1 , null , 0 ));
278264
279- $ this -> assertEquals ( new moodle_url (
280- ' #q4 ' ),
281- $ attempt ->review_url (4 , -1 , null , 0 ));
265+ $ questionattempt = $ attempt -> get_question_attempt ( 4 );
266+ $ expecteanchor = ' # ' . $ questionattempt -> get_outer_question_div_unique_id ();
267+ $ this -> assertEquals ( new moodle_url ( $ expecteanchor ), $ attempt ->review_url (4 , -1 , null , 0 ));
282268
283269 $ this ->assertEquals (new moodle_url (
284270 '# ' ),
@@ -289,7 +275,7 @@ public function test_attempt_url() {
289275 $ attempt ->review_url (1 , -1 , true , 0 ));
290276
291277 $ this ->assertEquals (new moodle_url (
292- '/mod/quiz/review.php?attempt=124 &page=2&cmid=0 ' ),
278+ '/mod/quiz/review.php?attempt= ' . $ attemptid . ' &page=2&cmid= ' . $ cmid ),
293279 $ attempt ->review_url (null , 2 , false , 0 ));
294280
295281 $ this ->assertEquals (new moodle_url (
@@ -301,7 +287,7 @@ public function test_attempt_url() {
301287 $ attempt ->review_url (1 , -1 , false , 0 ));
302288
303289 $ this ->assertEquals (new moodle_url (
304- '/mod/quiz/review.php?attempt=124 &page=1&cmid=0 # ' ),
290+ '/mod/quiz/review.php?attempt= ' . $ attemptid . ' &page=1&cmid= ' . $ cmid . ' # ' ),
305291 $ attempt ->review_url (11 , -1 , false , 0 ));
306292 }
307293
@@ -339,4 +325,4 @@ public function test_is_participant() {
339325 $ this ->assertEquals (true , $ quizobj ->is_participant ($ USER ->id ),
340326 'Admin is enrolled, suspended and can participate ' );
341327 }
342- }
328+ }
0 commit comments