PageRenderTime 53ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/trunk/MoodleWebRole/lib/grade/simpletest/testgradeitem.php

#
PHP | 508 lines | 344 code | 118 blank | 46 comment | 1 complexity | 972e3bc633e7b0692b4af159f25ab6c6 MD5 | raw file
Possible License(s): LGPL-2.1, BSD-3-Clause, LGPL-2.0, GPL-2.0
  1. <?php // $Id: testgradeitem.php,v 1.6.2.3 2008/03/27 17:13:00 nicolasconnault Exp $
  2. ///////////////////////////////////////////////////////////////////////////
  3. // //
  4. // NOTICE OF COPYRIGHT //
  5. // //
  6. // Moodle - Modular Object-Oriented Dynamic Learning Environment //
  7. // http://moodle.org //
  8. // //
  9. // Copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com //
  10. // //
  11. // This program is free software; you can redistribute it and/or modify //
  12. // it under the terms of the GNU General Public License as published by //
  13. // the Free Software Foundation; either version 2 of the License, or //
  14. // (at your option) any later version. //
  15. // //
  16. // This program is distributed in the hope that it will be useful, //
  17. // but WITHOUT ANY WARRANTY; without even the implied warranty of //
  18. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
  19. // GNU General Public License for more details: //
  20. // //
  21. // http://www.gnu.org/copyleft/gpl.html //
  22. // //
  23. ///////////////////////////////////////////////////////////////////////////
  24. /**
  25. * Unit tests for grade_item object.
  26. *
  27. * @author nicolas@moodle.com
  28. * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
  29. * @package moodlecore
  30. */
  31. if (!defined('MOODLE_INTERNAL')) {
  32. die('Direct access to this script is forbidden.'); /// It must be included from a Moodle page
  33. }
  34. require_once($CFG->libdir.'/simpletest/fixtures/gradetest.php');
  35. Mock::generatePartial('grade_item', 'mock_grade_item_for_test_is_calculated', array('set_calculation'));
  36. @set_time_limit(0);
  37. class grade_item_test extends grade_test {
  38. function test_grade_item_construct() {
  39. $params = new stdClass();
  40. $params->courseid = $this->courseid;
  41. $params->categoryid = $this->grade_categories[1]->id;
  42. $params->itemname = 'unittestgradeitem4';
  43. $params->itemtype = 'mod';
  44. $params->itemmodule = 'database';
  45. $params->iteminfo = 'Grade item used for unit testing';
  46. $grade_item = new grade_item($params, false);
  47. $this->assertEqual($params->courseid, $grade_item->courseid);
  48. $this->assertEqual($params->categoryid, $grade_item->categoryid);
  49. $this->assertEqual($params->itemmodule, $grade_item->itemmodule);
  50. }
  51. function test_grade_item_insert() {
  52. $grade_item = new grade_item();
  53. $this->assertTrue(method_exists($grade_item, 'insert'));
  54. $grade_item->courseid = $this->courseid;
  55. $grade_item->categoryid = $this->grade_categories[1]->id;
  56. $grade_item->itemname = 'unittestgradeitem4';
  57. $grade_item->itemtype = 'mod';
  58. $grade_item->itemmodule = 'quiz';
  59. $grade_item->iteminfo = 'Grade item used for unit testing';
  60. $grade_item->insert();
  61. $last_grade_item = end($this->grade_items);
  62. $this->assertEqual($grade_item->id, $last_grade_item->id + 1);
  63. $this->assertEqual(11, $grade_item->sortorder);
  64. }
  65. function test_grade_item_delete() {
  66. $grade_item = new grade_item($this->grade_items[0]);
  67. $this->assertTrue(method_exists($grade_item, 'delete'));
  68. $this->assertTrue($grade_item->delete());
  69. $this->assertFalse(get_record('grade_items', 'id', $grade_item->id));
  70. }
  71. function test_grade_item_update() {
  72. $grade_item = new grade_item($this->grade_items[0]);
  73. $this->assertTrue(method_exists($grade_item, 'update'));
  74. $grade_item->iteminfo = 'Updated info for this unittest grade_item';
  75. $this->assertTrue($grade_item->update());
  76. $grade_item->grademin = 14;
  77. $this->assertTrue($grade_item->qualifies_for_regrading());
  78. $this->assertTrue($grade_item->update());
  79. $iteminfo = get_field('grade_items', 'iteminfo', 'id', $this->grade_items[0]->id);
  80. $this->assertEqual($grade_item->iteminfo, $iteminfo);
  81. }
  82. function test_grade_item_load_scale() {
  83. $grade_item = new grade_item($this->grade_items[2]);
  84. $this->assertTrue(method_exists($grade_item, 'load_scale'));
  85. $scale = $grade_item->load_scale();
  86. $this->assertFalse(empty($grade_item->scale));
  87. $this->assertEqual($scale->id, $this->grade_items[2]->scaleid);
  88. }
  89. function test_grade_item_load_outcome() {
  90. $grade_item = new grade_item($this->grade_items[0]);
  91. $this->assertTrue(method_exists($grade_item, 'load_outcome'));
  92. //TODO: add tests
  93. }
  94. function test_grade_item_qualifies_for_regrading() {
  95. $grade_item = new grade_item($this->grade_items[0]);
  96. $this->assertTrue(method_exists($grade_item, 'qualifies_for_regrading'));
  97. $this->assertFalse($grade_item->qualifies_for_regrading());
  98. $grade_item->iteminfo = 'Updated info for this unittest grade_item';
  99. $this->assertFalse($grade_item->qualifies_for_regrading());
  100. $grade_item->grademin = 14;
  101. $this->assertTrue($grade_item->qualifies_for_regrading());
  102. }
  103. function test_grade_item_force_regrading() {
  104. $grade_item = new grade_item($this->grade_items[0]);
  105. $this->assertTrue(method_exists($grade_item, 'force_regrading'));
  106. $this->assertEqual(0, $grade_item->needsupdate);
  107. $grade_item->force_regrading();
  108. $this->assertEqual(1, $grade_item->needsupdate);
  109. $grade_item->update_from_db();
  110. $this->assertEqual(1, $grade_item->needsupdate);
  111. }
  112. function test_grade_item_fetch() {
  113. $grade_item = new grade_item();
  114. $this->assertTrue(method_exists($grade_item, 'fetch'));
  115. $grade_item = grade_item::fetch(array('id'=>$this->grade_items[0]->id));
  116. $this->assertEqual($this->grade_items[0]->id, $grade_item->id);
  117. $this->assertEqual($this->grade_items[0]->iteminfo, $grade_item->iteminfo);
  118. $grade_item = grade_item::fetch(array('itemtype'=>$this->grade_items[1]->itemtype, 'itemmodule'=>$this->grade_items[1]->itemmodule));
  119. $this->assertEqual($this->grade_items[1]->id, $grade_item->id);
  120. $this->assertEqual($this->grade_items[1]->iteminfo, $grade_item->iteminfo);
  121. }
  122. function test_grade_item_fetch_all() {
  123. $grade_item = new grade_item();
  124. $this->assertTrue(method_exists($grade_item, 'fetch_all'));
  125. $grade_items = grade_item::fetch_all(array('courseid'=>$this->courseid));
  126. $this->assertEqual(count($this->grade_items), count($grade_items)-1);
  127. }
  128. // Retrieve all final scores for a given grade_item.
  129. function test_grade_item_get_all_finals() {
  130. $grade_item = new grade_item($this->grade_items[0]);
  131. $this->assertTrue(method_exists($grade_item, 'get_final'));
  132. $final_grades = $grade_item->get_final();
  133. $this->assertEqual(3, count($final_grades));
  134. }
  135. // Retrieve all final scores for a specific userid.
  136. function test_grade_item_get_final() {
  137. $grade_item = new grade_item($this->grade_items[0]);
  138. $this->assertTrue(method_exists($grade_item, 'get_final'));
  139. $final_grade = $grade_item->get_final($this->userid);
  140. $this->assertEqual($this->grade_grades[0]->finalgrade, $final_grade->finalgrade);
  141. }
  142. function test_grade_item_get_sortorder() {
  143. $grade_item = new grade_item($this->grade_items[0]);
  144. $this->assertTrue(method_exists($grade_item, 'get_sortorder'));
  145. $sortorder = $grade_item->get_sortorder();
  146. $this->assertEqual($this->grade_items[0]->sortorder, $sortorder);
  147. }
  148. function test_grade_item_set_sortorder() {
  149. $grade_item = new grade_item($this->grade_items[0]);
  150. $this->assertTrue(method_exists($grade_item, 'set_sortorder'));
  151. $grade_item->set_sortorder(999);
  152. $this->assertEqual($grade_item->sortorder, 999);
  153. }
  154. function test_grade_item_move_after_sortorder() {
  155. $grade_item = new grade_item($this->grade_items[0]);
  156. $this->assertTrue(method_exists($grade_item, 'move_after_sortorder'));
  157. $grade_item->move_after_sortorder(5);
  158. $this->assertEqual($grade_item->sortorder, 6);
  159. $grade_item = grade_item::fetch(array('id'=>$this->grade_items[0]->id));
  160. $this->assertEqual($grade_item->sortorder, 6);
  161. $after = grade_item::fetch(array('id'=>$this->grade_items[6]->id));
  162. $this->assertEqual($after->sortorder, 8);
  163. }
  164. function test_grade_item_get_name() {
  165. $grade_item = new grade_item($this->grade_items[0]);
  166. $this->assertTrue(method_exists($grade_item, 'get_name'));
  167. $name = $grade_item->get_name();
  168. $this->assertEqual($this->grade_items[0]->itemname, $name);
  169. }
  170. function test_grade_item_set_parent() {
  171. $grade_item = new grade_item($this->grade_items[0]);
  172. $this->assertTrue(method_exists($grade_item, 'set_parent'));
  173. $old = $grade_item->get_parent_category();
  174. $new = new grade_category($this->grade_categories[3]);
  175. $new_item = $new->get_grade_item();
  176. $this->assertTrue($grade_item->set_parent($new->id));
  177. $new_item->update_from_db();
  178. $grade_item->update_from_db();
  179. $this->assertEqual($grade_item->categoryid, $new->id);
  180. }
  181. function test_grade_item_get_parent_category() {
  182. $grade_item = new grade_item($this->grade_items[0]);
  183. $this->assertTrue(method_exists($grade_item, 'get_parent_category'));
  184. $category = $grade_item->get_parent_category();
  185. $this->assertEqual($this->grade_categories[1]->fullname, $category->fullname);
  186. }
  187. function test_grade_item_load_parent_category() {
  188. $grade_item = new grade_item($this->grade_items[0]);
  189. $this->assertTrue(method_exists($grade_item, 'load_parent_category'));
  190. $category = $grade_item->load_parent_category();
  191. $this->assertEqual($this->grade_categories[1]->fullname, $category->fullname);
  192. $this->assertEqual($this->grade_categories[1]->fullname, $grade_item->parent_category->fullname);
  193. }
  194. function test_grade_item_get_item_category() {
  195. $grade_item = new grade_item($this->grade_items[3]);
  196. $this->assertTrue(method_exists($grade_item, 'get_item_category'));
  197. $category = $grade_item->get_item_category();
  198. $this->assertEqual($this->grade_categories[0]->fullname, $category->fullname);
  199. }
  200. function test_grade_item_load_item_category() {
  201. $grade_item = new grade_item($this->grade_items[3]);
  202. $this->assertTrue(method_exists($grade_item, 'load_item_category'));
  203. $category = $grade_item->load_item_category();
  204. $this->assertEqual($this->grade_categories[0]->fullname, $category->fullname);
  205. $this->assertEqual($this->grade_categories[0]->fullname, $grade_item->item_category->fullname);
  206. }
  207. // Test update of all final grades
  208. function test_grade_item_regrade_final_grades() {
  209. $grade_item = new grade_item($this->grade_items[0]);
  210. $this->assertTrue(method_exists($grade_item, 'regrade_final_grades'));
  211. $this->assertEqual(true, $grade_item->regrade_final_grades());
  212. //TODO: add more tests
  213. }
  214. // Test the adjust_raw_grade method
  215. function test_grade_item_adjust_raw_grade() {
  216. $grade_item = new grade_item($this->grade_items[0]);
  217. $this->assertTrue(method_exists($grade_item, 'adjust_raw_grade'));
  218. $grade_raw = new stdClass();
  219. $grade_raw->rawgrade = 40;
  220. $grade_raw->grademax = 100;
  221. $grade_raw->grademin = 0;
  222. $grade_item->multfactor = 1;
  223. $grade_item->plusfactor = 0;
  224. $grade_item->grademax = 50;
  225. $grade_item->grademin = 0;
  226. $original_grade_raw = clone($grade_raw);
  227. $original_grade_item = clone($grade_item);
  228. $this->assertEqual(20, $grade_item->adjust_raw_grade($grade_raw->rawgrade, $grade_raw->grademin, $grade_raw->grademax));
  229. // Try a larger maximum grade
  230. $grade_item->grademax = 150;
  231. $grade_item->grademin = 0;
  232. $this->assertEqual(60, $grade_item->adjust_raw_grade($grade_raw->rawgrade, $grade_raw->grademin, $grade_raw->grademax));
  233. // Try larger minimum grade
  234. $grade_item->grademin = 50;
  235. $this->assertEqual(90, $grade_item->adjust_raw_grade($grade_raw->rawgrade, $grade_raw->grademin, $grade_raw->grademax));
  236. // Rescaling from a small scale (0-50) to a larger scale (0-100)
  237. $grade_raw->grademax = 50;
  238. $grade_raw->grademin = 0;
  239. $grade_item->grademax = 100;
  240. $grade_item->grademin = 0;
  241. $this->assertEqual(80, $grade_item->adjust_raw_grade($grade_raw->rawgrade, $grade_raw->grademin, $grade_raw->grademax));
  242. // Rescaling from a small scale (0-50) to a larger scale with offset (40-100)
  243. $grade_item->grademax = 100;
  244. $grade_item->grademin = 40;
  245. $this->assertEqual(88, $grade_item->adjust_raw_grade($grade_raw->rawgrade, $grade_raw->grademin, $grade_raw->grademax));
  246. // Try multfactor and plusfactor
  247. $grade_raw = clone($original_grade_raw);
  248. $grade_item = clone($original_grade_item);
  249. $grade_item->multfactor = 1.23;
  250. $grade_item->plusfactor = 3;
  251. $this->assertEqual(27.6, $grade_item->adjust_raw_grade($grade_raw->rawgrade, $grade_raw->grademin, $grade_raw->grademax));
  252. // Try multfactor below 0 and a negative plusfactor
  253. $grade_raw = clone($original_grade_raw);
  254. $grade_item = clone($original_grade_item);
  255. $grade_item->multfactor = 0.23;
  256. $grade_item->plusfactor = -3;
  257. $this->assertEqual(round(1.6), round($grade_item->adjust_raw_grade($grade_raw->rawgrade, $grade_raw->grademin, $grade_raw->grademax)));
  258. }
  259. // Test locking of grade items
  260. function test_grade_item_set_locked() {
  261. $grade_item = new grade_item($this->grade_items[0]);
  262. $this->assertTrue(method_exists($grade_item, 'set_locked'));
  263. $grade = new grade_grade($grade_item->get_final(1));
  264. $this->assertTrue(empty($grade_item->locked));
  265. $this->assertTrue(empty($grade->locked));
  266. $this->assertTrue($grade_item->set_locked(true, true, false));
  267. $grade = new grade_grade($grade_item->get_final(1));
  268. $this->assertFalse(empty($grade_item->locked));
  269. $this->assertFalse(empty($grade->locked)); // individual grades should be locked too
  270. $this->assertTrue($grade_item->set_locked(false, true, false));
  271. $grade = new grade_grade($grade_item->get_final(1));
  272. $this->assertTrue(empty($grade_item->locked));
  273. $this->assertTrue(empty($grade->locked)); // individual grades should be unlocked too
  274. }
  275. function test_grade_item_is_locked() {
  276. $grade_item = new grade_item($this->grade_items[0]);
  277. $this->assertTrue(method_exists($grade_item, 'is_locked'));
  278. $this->assertFalse($grade_item->is_locked());
  279. $this->assertFalse($grade_item->is_locked(1));
  280. $this->assertTrue($grade_item->set_locked(true, true, false));
  281. $this->assertTrue($grade_item->is_locked());
  282. $this->assertTrue($grade_item->is_locked(1));
  283. }
  284. // Test hiding of grade items
  285. function test_grade_item_set_hidden() {
  286. $grade_item = new grade_item($this->grade_items[0]);
  287. $this->assertTrue(method_exists($grade_item, 'set_hidden'));
  288. $grade = new grade_grade($grade_item->get_final(1));
  289. $this->assertEqual(0, $grade_item->hidden);
  290. $this->assertEqual(0, $grade->hidden);
  291. $grade_item->set_hidden(666, true);
  292. $grade = new grade_grade($grade_item->get_final(1));
  293. $this->assertEqual(666, $grade_item->hidden);
  294. $this->assertEqual(666, $grade->hidden);
  295. }
  296. function test_grade_item_is_hidden() {
  297. $grade_item = new grade_item($this->grade_items[0]);
  298. $this->assertTrue(method_exists($grade_item, 'is_hidden'));
  299. $this->assertFalse($grade_item->is_hidden());
  300. $this->assertFalse($grade_item->is_hidden(1));
  301. $grade_item->set_hidden(1);
  302. $this->assertTrue($grade_item->is_hidden());
  303. $this->assertTrue($grade_item->is_hidden(1));
  304. $grade_item->set_hidden(666);
  305. $this->assertFalse($grade_item->is_hidden());
  306. $this->assertFalse($grade_item->is_hidden(1));
  307. $grade_item->set_hidden(time()+666);
  308. $this->assertTrue($grade_item->is_hidden());
  309. $this->assertTrue($grade_item->is_hidden(1));
  310. }
  311. function test_grade_item_is_category_item() {
  312. $grade_item = new grade_item($this->grade_items[3]);
  313. $this->assertTrue(method_exists($grade_item, 'is_category_item'));
  314. $this->assertTrue($grade_item->is_category_item());
  315. }
  316. function test_grade_item_is_course_item() {
  317. $grade_item = grade_item::fetch_course_item($this->courseid);
  318. $this->assertTrue(method_exists($grade_item, 'is_course_item'));
  319. $this->assertTrue($grade_item->is_course_item());
  320. }
  321. function test_grade_item_fetch_course_item() {
  322. $grade_item = grade_item::fetch_course_item($this->courseid);
  323. $this->assertTrue(method_exists($grade_item, 'fetch_course_item'));
  324. $this->assertTrue($grade_item->itemtype, 'course');
  325. }
  326. function test_grade_item_depends_on() {
  327. $grade_item = new grade_item($this->grade_items[1]);
  328. // calculated grade dependency
  329. $deps = $grade_item->depends_on();
  330. sort($deps, SORT_NUMERIC); // for comparison
  331. $this->assertEqual(array($this->grade_items[0]->id), $deps);
  332. // simulate depends on returns none when locked
  333. $grade_item->locked = time();
  334. $grade_item->update();
  335. $deps = $grade_item->depends_on();
  336. sort($deps, SORT_NUMERIC); // for comparison
  337. $this->assertEqual(array(), $deps);
  338. // category dependency
  339. $grade_item = new grade_item($this->grade_items[3]);
  340. $deps = $grade_item->depends_on();
  341. sort($deps, SORT_NUMERIC); // for comparison
  342. $res = array($this->grade_items[4]->id, $this->grade_items[5]->id);
  343. $this->assertEqual($res, $deps);
  344. }
  345. function test_grade_item_is_calculated() {
  346. $grade_item = new mock_grade_item_for_test_is_calculated($this);
  347. $grade_item->set_properties($grade_item, $this->grade_items[1]);
  348. $this->assertTrue(method_exists($grade_item, 'is_calculated'));
  349. $grade_itemsource = new grade_item($this->grade_items[0]);
  350. $normalizedformula = str_replace("[[$grade_itemsource->idnumber]]", "##gi$grade_itemsource->id##", $this->grade_items[1]->calculation);
  351. $grade_item->expectOnce('set_calculation', array($grade_item->calculation));
  352. $grade_item->setReturnValue('set_calculation', $normalizedformula);
  353. $this->assertTrue($grade_item->is_calculated());
  354. }
  355. function test_grade_item_set_calculation() {
  356. $grade_item = new grade_item($this->grade_items[1]);
  357. $this->assertTrue(method_exists($grade_item, 'set_calculation'));
  358. $grade_itemsource = new grade_item($this->grade_items[0]);
  359. $grade_item->set_calculation('=[['.$grade_itemsource->idnumber.']]');
  360. $this->assertTrue(!empty($grade_item->needsupdate));
  361. $this->assertEqual('=##gi'.$grade_itemsource->id.'##', $grade_item->calculation);
  362. }
  363. function test_grade_item_get_calculation() {
  364. $grade_item = new grade_item($this->grade_items[1]);
  365. $this->assertTrue(method_exists($grade_item, 'get_calculation'));
  366. $grade_itemsource = new grade_item($this->grade_items[0]);
  367. $denormalizedformula = str_replace('##gi'.$grade_itemsource->id.'##', '[['.$grade_itemsource->idnumber.']]', $this->grade_items[1]->calculation);
  368. $formula = $grade_item->get_calculation();
  369. $this->assertTrue(!empty($grade_item->needsupdate));
  370. $this->assertEqual($denormalizedformula, $formula);
  371. }
  372. function test_grade_item_compute() {
  373. $grade_item = new grade_item($this->grade_items[1]);
  374. $this->assertTrue(method_exists($grade_item, 'compute'));
  375. $grade_grade = grade_grade::fetch(array('id'=>$this->grade_grades[3]->id));
  376. $grade_grade->delete();
  377. $grade_grade = grade_grade::fetch(array('id'=>$this->grade_grades[4]->id));
  378. $grade_grade->delete();
  379. $grade_grade = grade_grade::fetch(array('id'=>$this->grade_grades[5]->id));
  380. $grade_grade->delete();
  381. $grade_item->compute();
  382. $grade_grade = grade_grade::fetch(array('userid'=>$this->grade_grades[3]->userid, 'itemid'=>$this->grade_grades[3]->itemid));
  383. $this->assertEqual($this->grade_grades[3]->finalgrade, $grade_grade->finalgrade);
  384. $grade_grade = grade_grade::fetch(array('userid'=>$this->grade_grades[4]->userid, 'itemid'=>$this->grade_grades[4]->itemid));
  385. $this->assertEqual($this->grade_grades[4]->finalgrade, $grade_grade->finalgrade);
  386. $grade_grade = grade_grade::fetch(array('userid'=>$this->grade_grades[5]->userid, 'itemid'=>$this->grade_grades[5]->itemid));
  387. $this->assertEqual($this->grade_grades[5]->finalgrade, $grade_grade->finalgrade);
  388. }
  389. }
  390. ?>