PageRenderTime 61ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/mod/workshop/eval/best/tests/lib_test.php

https://bitbucket.org/kudutest1/moodlegit
PHP | 262 lines | 169 code | 22 blank | 71 comment | 1 complexity | 4f18a467d71d7b989166afc12bfbeb77 MD5 | raw file
  1. <?php
  2. // This file is part of Moodle - http://moodle.org/
  3. //
  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.
  8. //
  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.
  13. //
  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/>.
  16. /**
  17. * Unit tests for grading evaluation method "best"
  18. *
  19. * @package workshopeval_best
  20. * @category phpunit
  21. * @copyright 2009 David Mudrak <david.mudrak@gmail.com>
  22. * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  23. */
  24. defined('MOODLE_INTERNAL') || die();
  25. // Include the code to test
  26. global $CFG;
  27. require_once($CFG->dirroot . '/mod/workshop/locallib.php');
  28. require_once($CFG->dirroot . '/mod/workshop/eval/best/lib.php');
  29. require_once($CFG->libdir . '/gradelib.php');
  30. class workshopeval_best_evaluation_testcase extends basic_testcase {
  31. /** workshop instance emulation */
  32. protected $workshop;
  33. /** instance of the grading evaluator being tested */
  34. protected $evaluator;
  35. /**
  36. * Setup testing environment
  37. */
  38. protected function setUp() {
  39. parent::setUp();
  40. $cm = new stdclass();
  41. $course = new stdclass();
  42. $context = new stdclass();
  43. $workshop = (object)array('id' => 42, 'evaluation' => 'best');
  44. $this->workshop = new workshop($workshop, $cm, $course, $context);
  45. $this->evaluator = new testable_workshop_best_evaluation($this->workshop);
  46. }
  47. protected function tearDown() {
  48. $this->workshop = null;
  49. $this->evaluator = null;
  50. parent::tearDown();
  51. }
  52. public function test_normalize_grades() {
  53. // fixture set-up
  54. $assessments = array();
  55. $assessments[1] = (object)array(
  56. 'dimgrades' => array(3 => 1.0000, 4 => 13.42300),
  57. );
  58. $assessments[3] = (object)array(
  59. 'dimgrades' => array(3 => 2.0000, 4 => 19.1000),
  60. );
  61. $assessments[7] = (object)array(
  62. 'dimgrades' => array(3 => 3.0000, 4 => 0.00000),
  63. );
  64. $diminfo = array(
  65. 3 => (object)array('min' => 1, 'max' => 3),
  66. 4 => (object)array('min' => 0, 'max' => 20),
  67. );
  68. // exercise SUT
  69. $norm = $this->evaluator->normalize_grades($assessments, $diminfo);
  70. // validate
  71. $this->assertEquals(gettype($norm), 'array');
  72. // the following grades from a scale
  73. $this->assertEquals($norm[1]->dimgrades[3], 0);
  74. $this->assertEquals($norm[3]->dimgrades[3], 50);
  75. $this->assertEquals($norm[7]->dimgrades[3], 100);
  76. // the following grades from an interval 0 - 20
  77. $this->assertEquals($norm[1]->dimgrades[4], grade_floatval(13.423 / 20 * 100));
  78. $this->assertEquals($norm[3]->dimgrades[4], grade_floatval(19.1 / 20 * 100));
  79. $this->assertEquals($norm[7]->dimgrades[4], 0);
  80. }
  81. public function test_normalize_grades_max_equals_min() {
  82. // fixture set-up
  83. $assessments = array();
  84. $assessments[1] = (object)array(
  85. 'dimgrades' => array(3 => 100.0000),
  86. );
  87. $diminfo = array(
  88. 3 => (object)array('min' => 100, 'max' => 100),
  89. );
  90. // exercise SUT
  91. $norm = $this->evaluator->normalize_grades($assessments, $diminfo);
  92. // validate
  93. $this->assertEquals(gettype($norm), 'array');
  94. $this->assertEquals($norm[1]->dimgrades[3], 100);
  95. }
  96. public function test_average_assessment_same_weights() {
  97. // fixture set-up
  98. $assessments = array();
  99. $assessments[18] = (object)array(
  100. 'weight' => 1,
  101. 'dimgrades' => array(1 => 50, 2 => 33.33333),
  102. );
  103. $assessments[16] = (object)array(
  104. 'weight' => 1,
  105. 'dimgrades' => array(1 => 0, 2 => 66.66667),
  106. );
  107. // exercise SUT
  108. $average = $this->evaluator->average_assessment($assessments);
  109. // validate
  110. $this->assertEquals(gettype($average->dimgrades), 'array');
  111. $this->assertEquals(grade_floatval($average->dimgrades[1]), grade_floatval(25));
  112. $this->assertEquals(grade_floatval($average->dimgrades[2]), grade_floatval(50));
  113. }
  114. public function test_average_assessment_different_weights() {
  115. // fixture set-up
  116. $assessments = array();
  117. $assessments[11] = (object)array(
  118. 'weight' => 1,
  119. 'dimgrades' => array(3 => 10.0, 4 => 13.4, 5 => 95.0),
  120. );
  121. $assessments[13] = (object)array(
  122. 'weight' => 3,
  123. 'dimgrades' => array(3 => 11.0, 4 => 10.1, 5 => 92.0),
  124. );
  125. $assessments[17] = (object)array(
  126. 'weight' => 1,
  127. 'dimgrades' => array(3 => 11.0, 4 => 8.1, 5 => 88.0),
  128. );
  129. // exercise SUT
  130. $average = $this->evaluator->average_assessment($assessments);
  131. // validate
  132. $this->assertEquals(gettype($average->dimgrades), 'array');
  133. $this->assertEquals(grade_floatval($average->dimgrades[3]), grade_floatval((10.0 + 11.0*3 + 11.0)/5));
  134. $this->assertEquals(grade_floatval($average->dimgrades[4]), grade_floatval((13.4 + 10.1*3 + 8.1)/5));
  135. $this->assertEquals(grade_floatval($average->dimgrades[5]), grade_floatval((95.0 + 92.0*3 + 88.0)/5));
  136. }
  137. public function test_average_assessment_noweight() {
  138. // fixture set-up
  139. $assessments = array();
  140. $assessments[11] = (object)array(
  141. 'weight' => 0,
  142. 'dimgrades' => array(3 => 10.0, 4 => 13.4, 5 => 95.0),
  143. );
  144. $assessments[17] = (object)array(
  145. 'weight' => 0,
  146. 'dimgrades' => array(3 => 11.0, 4 => 8.1, 5 => 88.0),
  147. );
  148. // exercise SUT
  149. $average = $this->evaluator->average_assessment($assessments);
  150. // validate
  151. $this->assertNull($average);
  152. }
  153. public function test_weighted_variance() {
  154. // fixture set-up
  155. $assessments[11] = (object)array(
  156. 'weight' => 1,
  157. 'dimgrades' => array(3 => 11, 4 => 2),
  158. );
  159. $assessments[13] = (object)array(
  160. 'weight' => 3,
  161. 'dimgrades' => array(3 => 11, 4 => 4),
  162. );
  163. $assessments[17] = (object)array(
  164. 'weight' => 2,
  165. 'dimgrades' => array(3 => 11, 4 => 5),
  166. );
  167. $assessments[20] = (object)array(
  168. 'weight' => 1,
  169. 'dimgrades' => array(3 => 11, 4 => 7),
  170. );
  171. $assessments[25] = (object)array(
  172. 'weight' => 1,
  173. 'dimgrades' => array(3 => 11, 4 => 9),
  174. );
  175. // exercise SUT
  176. $variance = $this->evaluator->weighted_variance($assessments);
  177. // validate
  178. // dimension [3] have all the grades equal to 11
  179. $this->assertEquals($variance[3], 0);
  180. // dimension [4] represents data 2, 4, 4, 4, 5, 5, 7, 9 having stdev=2 (stdev is sqrt of variance)
  181. $this->assertEquals($variance[4], 4);
  182. }
  183. public function test_assessments_distance_zero() {
  184. // fixture set-up
  185. $diminfo = array(
  186. 3 => (object)array('weight' => 1, 'min' => 0, 'max' => 100, 'variance' => 12.34567),
  187. 4 => (object)array('weight' => 1, 'min' => 1, 'max' => 5, 'variance' => 98.76543),
  188. );
  189. $assessment1 = (object)array('dimgrades' => array(3 => 15, 4 => 2));
  190. $assessment2 = (object)array('dimgrades' => array(3 => 15, 4 => 2));
  191. $settings = (object)array('comparison' => 5);
  192. // exercise SUT and validate
  193. $this->assertEquals($this->evaluator->assessments_distance($assessment1, $assessment2, $diminfo, $settings), 0);
  194. }
  195. public function test_assessments_distance_equals() {
  196. /*
  197. // fixture set-up
  198. $diminfo = array(
  199. 3 => (object)array('weight' => 1, 'min' => 0, 'max' => 100, 'variance' => 12.34567),
  200. 4 => (object)array('weight' => 1, 'min' => 0, 'max' => 100, 'variance' => 12.34567),
  201. );
  202. $assessment1 = (object)array('dimgrades' => array(3 => 25, 4 => 4));
  203. $assessment2 = (object)array('dimgrades' => array(3 => 75, 4 => 2));
  204. $referential = (object)array('dimgrades' => array(3 => 50, 4 => 3));
  205. $settings = (object)array('comparison' => 5);
  206. // exercise SUT and validate
  207. $this->assertEquals($this->evaluator->assessments_distance($assessment1, $referential, $diminfo, $settings),
  208. $this->evaluator->assessments_distance($assessment2, $referential, $diminfo, $settings));
  209. */
  210. // fixture set-up
  211. $diminfo = array(
  212. 1 => (object)array('min' => 0, 'max' => 2, 'weight' => 1, 'variance' => 625),
  213. 2 => (object)array('min' => 0, 'max' => 3, 'weight' => 1, 'variance' => 277.7778888889),
  214. );
  215. $assessment1 = (object)array('dimgrades' => array(1 => 0, 2 => 66.66667));
  216. $assessment2 = (object)array('dimgrades' => array(1 => 50, 2 => 33.33333));
  217. $referential = (object)array('dimgrades' => array(1 => 25, 2 => 50));
  218. $settings = (object)array('comparison' => 9);
  219. // exercise SUT and validate
  220. $this->assertEquals($this->evaluator->assessments_distance($assessment1, $referential, $diminfo, $settings),
  221. $this->evaluator->assessments_distance($assessment2, $referential, $diminfo, $settings));
  222. }
  223. }
  224. /**
  225. * Test subclass that makes all the protected methods we want to test public.
  226. */
  227. class testable_workshop_best_evaluation extends workshop_best_evaluation {
  228. public function normalize_grades(array $assessments, array $diminfo) {
  229. return parent::normalize_grades($assessments, $diminfo);
  230. }
  231. public function average_assessment(array $assessments) {
  232. return parent::average_assessment($assessments);
  233. }
  234. public function weighted_variance(array $assessments) {
  235. return parent::weighted_variance($assessments);
  236. }
  237. public function assessments_distance(stdclass $assessment, stdclass $referential, array $diminfo, stdclass $settings) {
  238. return parent::assessments_distance($assessment, $referential, $diminfo, $settings);
  239. }
  240. }