"MDL-12304, fix double text"
[moodle-linuxchix.git] / lib / grade / simpletest / testgradeitem.php
blob4742d76350f89b9b86c225a6509f5dbaaa6b9da4
1 <?php // $Id$
3 ///////////////////////////////////////////////////////////////////////////
4 // //
5 // NOTICE OF COPYRIGHT //
6 // //
7 // Moodle - Modular Object-Oriented Dynamic Learning Environment //
8 // http://moodle.org //
9 // //
10 // Copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com //
11 // //
12 // This program is free software; you can redistribute it and/or modify //
13 // it under the terms of the GNU General Public License as published by //
14 // the Free Software Foundation; either version 2 of the License, or //
15 // (at your option) any later version. //
16 // //
17 // This program is distributed in the hope that it will be useful, //
18 // but WITHOUT ANY WARRANTY; without even the implied warranty of //
19 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
20 // GNU General Public License for more details: //
21 // //
22 // http://www.gnu.org/copyleft/gpl.html //
23 // //
24 ///////////////////////////////////////////////////////////////////////////
26 /**
27 * Unit tests for grade_item object.
29 * @author nicolas@moodle.com
30 * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
31 * @package moodlecore
34 if (!defined('MOODLE_INTERNAL')) {
35 die('Direct access to this script is forbidden.'); /// It must be included from a Moodle page
38 require_once($CFG->libdir.'/simpletest/fixtures/gradetest.php');
40 Mock::generatePartial('grade_item', 'mock_grade_item_for_test_is_calculated', array('set_calculation'));
42 @set_time_limit(0);
44 class grade_item_test extends grade_test {
46 function test_grade_item_construct() {
47 $params = new stdClass();
49 $params->courseid = $this->courseid;
50 $params->categoryid = $this->grade_categories[1]->id;
51 $params->itemname = 'unittestgradeitem4';
52 $params->itemtype = 'mod';
53 $params->itemmodule = 'database';
54 $params->iteminfo = 'Grade item used for unit testing';
56 $grade_item = new grade_item($params, false);
58 $this->assertEqual($params->courseid, $grade_item->courseid);
59 $this->assertEqual($params->categoryid, $grade_item->categoryid);
60 $this->assertEqual($params->itemmodule, $grade_item->itemmodule);
63 function test_grade_item_insert() {
64 $grade_item = new grade_item();
65 $this->assertTrue(method_exists($grade_item, 'insert'));
67 $grade_item->courseid = $this->courseid;
68 $grade_item->categoryid = $this->grade_categories[1]->id;
69 $grade_item->itemname = 'unittestgradeitem4';
70 $grade_item->itemtype = 'mod';
71 $grade_item->itemmodule = 'quiz';
72 $grade_item->iteminfo = 'Grade item used for unit testing';
74 $grade_item->insert();
76 $last_grade_item = end($this->grade_items);
78 $this->assertEqual($grade_item->id, $last_grade_item->id + 1);
79 $this->assertEqual(11, $grade_item->sortorder);
82 function test_grade_item_delete() {
83 $grade_item = new grade_item($this->grade_items[0]);
84 $this->assertTrue(method_exists($grade_item, 'delete'));
86 $this->assertTrue($grade_item->delete());
88 $this->assertFalse(get_record('grade_items', 'id', $grade_item->id));
91 function test_grade_item_update() {
92 $grade_item = new grade_item($this->grade_items[0]);
93 $this->assertTrue(method_exists($grade_item, 'update'));
95 $grade_item->iteminfo = 'Updated info for this unittest grade_item';
97 $this->assertTrue($grade_item->update());
99 $grade_item->grademin = 14;
100 $this->assertTrue($grade_item->qualifies_for_regrading());
101 $this->assertTrue($grade_item->update());
103 $iteminfo = get_field('grade_items', 'iteminfo', 'id', $this->grade_items[0]->id);
104 $this->assertEqual($grade_item->iteminfo, $iteminfo);
107 function test_grade_item_load_scale() {
108 $grade_item = new grade_item($this->grade_items[2]);
109 $this->assertTrue(method_exists($grade_item, 'load_scale'));
110 $scale = $grade_item->load_scale();
111 $this->assertFalse(empty($grade_item->scale));
112 $this->assertEqual($scale->id, $this->grade_items[2]->scaleid);
115 function test_grade_item_load_outcome() {
116 $grade_item = new grade_item($this->grade_items[0]);
117 $this->assertTrue(method_exists($grade_item, 'load_outcome'));
118 //TODO: add tests
121 function test_grade_item_qualifies_for_regrading() {
122 $grade_item = new grade_item($this->grade_items[0]);
123 $this->assertTrue(method_exists($grade_item, 'qualifies_for_regrading'));
125 $this->assertFalse($grade_item->qualifies_for_regrading());
127 $grade_item->iteminfo = 'Updated info for this unittest grade_item';
129 $this->assertFalse($grade_item->qualifies_for_regrading());
131 $grade_item->grademin = 14;
133 $this->assertTrue($grade_item->qualifies_for_regrading());
136 function test_grade_item_force_regrading() {
137 $grade_item = new grade_item($this->grade_items[0]);
138 $this->assertTrue(method_exists($grade_item, 'force_regrading'));
140 $this->assertEqual(0, $grade_item->needsupdate);
142 $grade_item->force_regrading();
143 $this->assertEqual(1, $grade_item->needsupdate);
144 $grade_item->update_from_db();
145 $this->assertEqual(1, $grade_item->needsupdate);
148 function test_grade_item_fetch() {
149 $grade_item = new grade_item();
150 $this->assertTrue(method_exists($grade_item, 'fetch'));
152 $grade_item = grade_item::fetch(array('id'=>$this->grade_items[0]->id));
153 $this->assertEqual($this->grade_items[0]->id, $grade_item->id);
154 $this->assertEqual($this->grade_items[0]->iteminfo, $grade_item->iteminfo);
156 $grade_item = grade_item::fetch(array('itemtype'=>$this->grade_items[1]->itemtype, 'itemmodule'=>$this->grade_items[1]->itemmodule));
157 $this->assertEqual($this->grade_items[1]->id, $grade_item->id);
158 $this->assertEqual($this->grade_items[1]->iteminfo, $grade_item->iteminfo);
161 function test_grade_item_fetch_all() {
162 $grade_item = new grade_item();
163 $this->assertTrue(method_exists($grade_item, 'fetch_all'));
165 $grade_items = grade_item::fetch_all(array('courseid'=>$this->courseid));
166 $this->assertEqual(count($this->grade_items), count($grade_items)-1);
169 // Retrieve all final scores for a given grade_item.
170 function test_grade_item_get_all_finals() {
171 $grade_item = new grade_item($this->grade_items[0]);
172 $this->assertTrue(method_exists($grade_item, 'get_final'));
174 $final_grades = $grade_item->get_final();
175 $this->assertEqual(3, count($final_grades));
179 // Retrieve all final scores for a specific userid.
180 function test_grade_item_get_final() {
181 $grade_item = new grade_item($this->grade_items[0]);
182 $this->assertTrue(method_exists($grade_item, 'get_final'));
183 $final_grade = $grade_item->get_final($this->userid);
184 $this->assertEqual($this->grade_grades[0]->finalgrade, $final_grade->finalgrade);
187 function test_grade_item_get_sortorder() {
188 $grade_item = new grade_item($this->grade_items[0]);
189 $this->assertTrue(method_exists($grade_item, 'get_sortorder'));
190 $sortorder = $grade_item->get_sortorder();
191 $this->assertEqual($this->grade_items[0]->sortorder, $sortorder);
194 function test_grade_item_set_sortorder() {
195 $grade_item = new grade_item($this->grade_items[0]);
196 $this->assertTrue(method_exists($grade_item, 'set_sortorder'));
197 $grade_item->set_sortorder(999);
198 $this->assertEqual($grade_item->sortorder, 999);
201 function test_grade_item_move_after_sortorder() {
202 $grade_item = new grade_item($this->grade_items[0]);
203 $this->assertTrue(method_exists($grade_item, 'move_after_sortorder'));
204 $grade_item->move_after_sortorder(5);
205 $this->assertEqual($grade_item->sortorder, 6);
207 $grade_item = grade_item::fetch(array('id'=>$this->grade_items[0]->id));
208 $this->assertEqual($grade_item->sortorder, 6);
210 $after = grade_item::fetch(array('id'=>$this->grade_items[6]->id));
211 $this->assertEqual($after->sortorder, 8);
214 function test_grade_item_get_name() {
215 $grade_item = new grade_item($this->grade_items[0]);
216 $this->assertTrue(method_exists($grade_item, 'get_name'));
218 $name = $grade_item->get_name();
219 $this->assertEqual($this->grade_items[0]->itemname, $name);
222 function test_grade_item_set_parent() {
223 $grade_item = new grade_item($this->grade_items[0]);
224 $this->assertTrue(method_exists($grade_item, 'set_parent'));
226 $old = $grade_item->get_parent_category();
227 $new = new grade_category($this->grade_categories[3]);
228 $new_item = $new->get_grade_item();
230 $this->assertTrue($grade_item->set_parent($new->id));
232 $new_item->update_from_db();
233 $grade_item->update_from_db();
235 $this->assertEqual($grade_item->categoryid, $new->id);
238 function test_grade_item_get_parent_category() {
239 $grade_item = new grade_item($this->grade_items[0]);
240 $this->assertTrue(method_exists($grade_item, 'get_parent_category'));
242 $category = $grade_item->get_parent_category();
243 $this->assertEqual($this->grade_categories[1]->fullname, $category->fullname);
246 function test_grade_item_load_parent_category() {
247 $grade_item = new grade_item($this->grade_items[0]);
248 $this->assertTrue(method_exists($grade_item, 'load_parent_category'));
250 $category = $grade_item->load_parent_category();
251 $this->assertEqual($this->grade_categories[1]->fullname, $category->fullname);
252 $this->assertEqual($this->grade_categories[1]->fullname, $grade_item->parent_category->fullname);
255 function test_grade_item_get_item_category() {
256 $grade_item = new grade_item($this->grade_items[3]);
257 $this->assertTrue(method_exists($grade_item, 'get_item_category'));
259 $category = $grade_item->get_item_category();
260 $this->assertEqual($this->grade_categories[0]->fullname, $category->fullname);
263 function test_grade_item_load_item_category() {
264 $grade_item = new grade_item($this->grade_items[3]);
265 $this->assertTrue(method_exists($grade_item, 'load_item_category'));
267 $category = $grade_item->load_item_category();
268 $this->assertEqual($this->grade_categories[0]->fullname, $category->fullname);
269 $this->assertEqual($this->grade_categories[0]->fullname, $grade_item->item_category->fullname);
272 // Test update of all final grades
273 function test_grade_item_regrade_final_grades() {
274 $grade_item = new grade_item($this->grade_items[0]);
275 $this->assertTrue(method_exists($grade_item, 'regrade_final_grades'));
276 $this->assertEqual(true, $grade_item->regrade_final_grades());
277 //TODO: add more tests
280 // Test the adjust_raw_grade method
281 function test_grade_item_adjust_raw_grade() {
282 $grade_item = new grade_item($this->grade_items[0]);
283 $this->assertTrue(method_exists($grade_item, 'adjust_raw_grade'));
284 $grade_raw = new stdClass();
286 $grade_raw->rawgrade = 40;
287 $grade_raw->grademax = 100;
288 $grade_raw->grademin = 0;
290 $grade_item->multfactor = 1;
291 $grade_item->plusfactor = 0;
292 $grade_item->grademax = 50;
293 $grade_item->grademin = 0;
295 $original_grade_raw = clone($grade_raw);
296 $original_grade_item = clone($grade_item);
298 $this->assertEqual(20, $grade_item->adjust_raw_grade($grade_raw->rawgrade, $grade_raw->grademin, $grade_raw->grademax));
300 // Try a larger maximum grade
301 $grade_item->grademax = 150;
302 $grade_item->grademin = 0;
303 $this->assertEqual(60, $grade_item->adjust_raw_grade($grade_raw->rawgrade, $grade_raw->grademin, $grade_raw->grademax));
305 // Try larger minimum grade
306 $grade_item->grademin = 50;
308 $this->assertEqual(90, $grade_item->adjust_raw_grade($grade_raw->rawgrade, $grade_raw->grademin, $grade_raw->grademax));
310 // Rescaling from a small scale (0-50) to a larger scale (0-100)
311 $grade_raw->grademax = 50;
312 $grade_raw->grademin = 0;
313 $grade_item->grademax = 100;
314 $grade_item->grademin = 0;
316 $this->assertEqual(80, $grade_item->adjust_raw_grade($grade_raw->rawgrade, $grade_raw->grademin, $grade_raw->grademax));
318 // Rescaling from a small scale (0-50) to a larger scale with offset (40-100)
319 $grade_item->grademax = 100;
320 $grade_item->grademin = 40;
322 $this->assertEqual(88, $grade_item->adjust_raw_grade($grade_raw->rawgrade, $grade_raw->grademin, $grade_raw->grademax));
324 // Try multfactor and plusfactor
325 $grade_raw = clone($original_grade_raw);
326 $grade_item = clone($original_grade_item);
327 $grade_item->multfactor = 1.23;
328 $grade_item->plusfactor = 3;
330 $this->assertEqual(27.6, $grade_item->adjust_raw_grade($grade_raw->rawgrade, $grade_raw->grademin, $grade_raw->grademax));
332 // Try multfactor below 0 and a negative plusfactor
333 $grade_raw = clone($original_grade_raw);
334 $grade_item = clone($original_grade_item);
335 $grade_item->multfactor = 0.23;
336 $grade_item->plusfactor = -3;
338 $this->assertEqual(round(1.6), round($grade_item->adjust_raw_grade($grade_raw->rawgrade, $grade_raw->grademin, $grade_raw->grademax)));
341 // Test locking of grade items
342 function test_grade_item_set_locked() {
343 $grade_item = new grade_item($this->grade_items[0]);
344 $this->assertTrue(method_exists($grade_item, 'set_locked'));
346 $grade = new grade_grade($grade_item->get_final(1));
347 $this->assertTrue(empty($grade_item->locked));
348 $this->assertTrue(empty($grade->locked));
350 $this->assertTrue($grade_item->set_locked(true, true, false));
351 $grade = new grade_grade($grade_item->get_final(1));
353 $this->assertFalse(empty($grade_item->locked));
354 $this->assertFalse(empty($grade->locked)); // individual grades should be locked too
356 $this->assertTrue($grade_item->set_locked(false, true, false));
357 $grade = new grade_grade($grade_item->get_final(1));
359 $this->assertTrue(empty($grade_item->locked));
360 $this->assertTrue(empty($grade->locked)); // individual grades should be unlocked too
363 function test_grade_item_is_locked() {
364 $grade_item = new grade_item($this->grade_items[0]);
365 $this->assertTrue(method_exists($grade_item, 'is_locked'));
367 $this->assertFalse($grade_item->is_locked());
368 $this->assertFalse($grade_item->is_locked(1));
369 $this->assertTrue($grade_item->set_locked(true, true, false));
370 $this->assertTrue($grade_item->is_locked());
371 $this->assertTrue($grade_item->is_locked(1));
374 // Test hiding of grade items
375 function test_grade_item_set_hidden() {
376 $grade_item = new grade_item($this->grade_items[0]);
377 $this->assertTrue(method_exists($grade_item, 'set_hidden'));
379 $grade = new grade_grade($grade_item->get_final(1));
380 $this->assertEqual(0, $grade_item->hidden);
381 $this->assertEqual(0, $grade->hidden);
383 $grade_item->set_hidden(666, true);
384 $grade = new grade_grade($grade_item->get_final(1));
386 $this->assertEqual(666, $grade_item->hidden);
387 $this->assertEqual(666, $grade->hidden);
390 function test_grade_item_is_hidden() {
391 $grade_item = new grade_item($this->grade_items[0]);
392 $this->assertTrue(method_exists($grade_item, 'is_hidden'));
394 $this->assertFalse($grade_item->is_hidden());
395 $this->assertFalse($grade_item->is_hidden(1));
397 $grade_item->set_hidden(1);
398 $this->assertTrue($grade_item->is_hidden());
399 $this->assertTrue($grade_item->is_hidden(1));
401 $grade_item->set_hidden(666);
402 $this->assertFalse($grade_item->is_hidden());
403 $this->assertFalse($grade_item->is_hidden(1));
405 $grade_item->set_hidden(time()+666);
406 $this->assertTrue($grade_item->is_hidden());
407 $this->assertTrue($grade_item->is_hidden(1));
410 function test_grade_item_is_category_item() {
411 $grade_item = new grade_item($this->grade_items[3]);
412 $this->assertTrue(method_exists($grade_item, 'is_category_item'));
413 $this->assertTrue($grade_item->is_category_item());
416 function test_grade_item_is_course_item() {
417 $grade_item = grade_item::fetch_course_item($this->courseid);
418 $this->assertTrue(method_exists($grade_item, 'is_course_item'));
419 $this->assertTrue($grade_item->is_course_item());
422 function test_grade_item_fetch_course_item() {
423 $grade_item = grade_item::fetch_course_item($this->courseid);
424 $this->assertTrue(method_exists($grade_item, 'fetch_course_item'));
425 $this->assertTrue($grade_item->itemtype, 'course');
428 function test_grade_item_depends_on() {
429 $grade_item = new grade_item($this->grade_items[1]);
431 // calculated grade dependency
432 $deps = $grade_item->depends_on();
433 sort($deps, SORT_NUMERIC); // for comparison
434 $this->assertEqual(array($this->grade_items[0]->id), $deps);
436 // simulate depends on returns none when locked
437 $grade_item->locked = time();
438 $grade_item->update();
439 $deps = $grade_item->depends_on();
440 sort($deps, SORT_NUMERIC); // for comparison
441 $this->assertEqual(array(), $deps);
443 // category dependency
444 $grade_item = new grade_item($this->grade_items[3]);
445 $deps = $grade_item->depends_on();
446 sort($deps, SORT_NUMERIC); // for comparison
447 $res = array($this->grade_items[4]->id, $this->grade_items[5]->id);
448 $this->assertEqual($res, $deps);
451 function test_grade_item_is_calculated() {
452 $grade_item = new mock_grade_item_for_test_is_calculated($this);
453 $grade_item->set_properties($grade_item, $this->grade_items[1]);
454 $this->assertTrue(method_exists($grade_item, 'is_calculated'));
455 $grade_itemsource = new grade_item($this->grade_items[0]);
456 $normalizedformula = str_replace("[[$grade_itemsource->idnumber]]", "##gi$grade_itemsource->id##", $this->grade_items[1]->calculation);
458 $grade_item->expectOnce('set_calculation', array($grade_item->calculation));
459 $grade_item->setReturnValue('set_calculation', $normalizedformula);
460 $this->assertTrue($grade_item->is_calculated());
463 function test_grade_item_set_calculation() {
464 $grade_item = new grade_item($this->grade_items[1]);
465 $this->assertTrue(method_exists($grade_item, 'set_calculation'));
466 $grade_itemsource = new grade_item($this->grade_items[0]);
468 $grade_item->set_calculation('=[['.$grade_itemsource->idnumber.']]');
470 $this->assertTrue(!empty($grade_item->needsupdate));
471 $this->assertEqual('=##gi'.$grade_itemsource->id.'##', $grade_item->calculation);
474 function test_grade_item_get_calculation() {
475 $grade_item = new grade_item($this->grade_items[1]);
476 $this->assertTrue(method_exists($grade_item, 'get_calculation'));
477 $grade_itemsource = new grade_item($this->grade_items[0]);
479 $denormalizedformula = str_replace('##gi'.$grade_itemsource->id.'##', '[['.$grade_itemsource->idnumber.']]', $this->grade_items[1]->calculation);
481 $formula = $grade_item->get_calculation();
482 $this->assertTrue(!empty($grade_item->needsupdate));
483 $this->assertEqual($denormalizedformula, $formula);
486 function test_grade_item_compute() {
487 $grade_item = new grade_item($this->grade_items[1]);
488 $this->assertTrue(method_exists($grade_item, 'compute'));
490 $grade_grade = grade_grade::fetch(array('id'=>$this->grade_grades[3]->id));
491 $grade_grade->delete();
492 $grade_grade = grade_grade::fetch(array('id'=>$this->grade_grades[4]->id));
493 $grade_grade->delete();
494 $grade_grade = grade_grade::fetch(array('id'=>$this->grade_grades[5]->id));
495 $grade_grade->delete();
497 $grade_item->compute();
499 $grade_grade = grade_grade::fetch(array('userid'=>$this->grade_grades[3]->userid, 'itemid'=>$this->grade_grades[3]->itemid));
500 $this->assertEqual($this->grade_grades[3]->finalgrade, $grade_grade->finalgrade);
501 $grade_grade = grade_grade::fetch(array('userid'=>$this->grade_grades[4]->userid, 'itemid'=>$this->grade_grades[4]->itemid));
502 $this->assertEqual($this->grade_grades[4]->finalgrade, $grade_grade->finalgrade);
503 $grade_grade = grade_grade::fetch(array('userid'=>$this->grade_grades[5]->userid, 'itemid'=>$this->grade_grades[5]->itemid));
504 $this->assertEqual($this->grade_grades[5]->finalgrade, $grade_grade->finalgrade);