|
Moodle
2.2.1
http://www.collinsharper.com
|
00001 <?php 00002 00003 // This file is part of Moodle - http://moodle.org/ 00004 // 00005 // Moodle is free software: you can redistribute it and/or modify 00006 // it under the terms of the GNU General Public License as published by 00007 // the Free Software Foundation, either version 3 of the License, or 00008 // (at your option) any later version. 00009 // 00010 // Moodle is distributed in the hope that it will be useful, 00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00013 // GNU General Public License for more details. 00014 // 00015 // You should have received a copy of the GNU General Public License 00016 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 00017 00027 defined('MOODLE_INTERNAL') || die(); 00028 00029 // Include the code to test 00030 require_once($CFG->dirroot . '/mod/workshop/locallib.php'); 00031 require_once($CFG->dirroot . '/mod/workshop/eval/best/lib.php'); 00032 require_once($CFG->libdir . '/gradelib.php'); 00033 00034 global $DB; 00035 Mock::generate(get_class($DB), 'mockDB'); 00036 00040 class testable_workshop_best_evaluation extends workshop_best_evaluation { 00041 00042 public function normalize_grades(array $assessments, array $diminfo) { 00043 return parent::normalize_grades($assessments, $diminfo); 00044 } 00045 public function average_assessment(array $assessments) { 00046 return parent::average_assessment($assessments); 00047 } 00048 public function weighted_variance(array $assessments) { 00049 return parent::weighted_variance($assessments); 00050 } 00051 public function assessments_distance(stdclass $assessment, stdclass $referential, array $diminfo, stdclass $settings) { 00052 return parent::assessments_distance($assessment, $referential, $diminfo, $settings); 00053 } 00054 } 00055 00056 class workshop_best_evaluation_test extends UnitTestCase { 00057 00059 protected $realDB; 00060 00062 protected $workshop; 00063 00065 protected $evaluator; 00066 00070 public function setUp() { 00071 global $DB; 00072 $this->realDB = $DB; 00073 $DB = new mockDB(); 00074 00075 $cm = new stdclass(); 00076 $course = new stdclass(); 00077 $context = new stdclass(); 00078 $workshop = (object)array('id' => 42, 'evaluation' => 'best'); 00079 $this->workshop = new workshop($workshop, $cm, $course, $context); 00080 $this->evaluator = new testable_workshop_best_evaluation($this->workshop); 00081 } 00082 00083 public function tearDown() { 00084 global $DB; 00085 $DB = $this->realDB; 00086 00087 $this->workshop = null; 00088 $this->evaluator = null; 00089 } 00090 00091 public function test_normalize_grades() { 00092 // fixture set-up 00093 $assessments = array(); 00094 $assessments[1] = (object)array( 00095 'dimgrades' => array(3 => 1.0000, 4 => 13.42300), 00096 ); 00097 $assessments[3] = (object)array( 00098 'dimgrades' => array(3 => 2.0000, 4 => 19.1000), 00099 ); 00100 $assessments[7] = (object)array( 00101 'dimgrades' => array(3 => 3.0000, 4 => 0.00000), 00102 ); 00103 $diminfo = array( 00104 3 => (object)array('min' => 1, 'max' => 3), 00105 4 => (object)array('min' => 0, 'max' => 20), 00106 ); 00107 // exercise SUT 00108 $norm = $this->evaluator->normalize_grades($assessments, $diminfo); 00109 // validate 00110 $this->assertIsA($norm, 'array'); 00111 // the following grades from a scale 00112 $this->assertEqual($norm[1]->dimgrades[3], 0); 00113 $this->assertEqual($norm[3]->dimgrades[3], 50); 00114 $this->assertEqual($norm[7]->dimgrades[3], 100); 00115 // the following grades from an interval 0 - 20 00116 $this->assertEqual($norm[1]->dimgrades[4], grade_floatval(13.423 / 20 * 100)); 00117 $this->assertEqual($norm[3]->dimgrades[4], grade_floatval(19.1 / 20 * 100)); 00118 $this->assertEqual($norm[7]->dimgrades[4], 0); 00119 } 00120 00121 public function test_normalize_grades_max_equals_min() { 00122 // fixture set-up 00123 $assessments = array(); 00124 $assessments[1] = (object)array( 00125 'dimgrades' => array(3 => 100.0000), 00126 ); 00127 $diminfo = array( 00128 3 => (object)array('min' => 100, 'max' => 100), 00129 ); 00130 // exercise SUT 00131 $norm = $this->evaluator->normalize_grades($assessments, $diminfo); 00132 // validate 00133 $this->assertIsA($norm, 'array'); 00134 $this->assertEqual($norm[1]->dimgrades[3], 100); 00135 } 00136 00137 public function test_average_assessment_same_weights() { 00138 // fixture set-up 00139 $assessments = array(); 00140 $assessments[18] = (object)array( 00141 'weight' => 1, 00142 'dimgrades' => array(1 => 50, 2 => 33.33333), 00143 ); 00144 $assessments[16] = (object)array( 00145 'weight' => 1, 00146 'dimgrades' => array(1 => 0, 2 => 66.66667), 00147 ); 00148 // exercise SUT 00149 $average = $this->evaluator->average_assessment($assessments); 00150 // validate 00151 $this->assertIsA($average->dimgrades, 'array'); 00152 $this->assertEqual(grade_floatval($average->dimgrades[1]), grade_floatval(25)); 00153 $this->assertEqual(grade_floatval($average->dimgrades[2]), grade_floatval(50)); 00154 } 00155 00156 public function test_average_assessment_different_weights() { 00157 // fixture set-up 00158 $assessments = array(); 00159 $assessments[11] = (object)array( 00160 'weight' => 1, 00161 'dimgrades' => array(3 => 10.0, 4 => 13.4, 5 => 95.0), 00162 ); 00163 $assessments[13] = (object)array( 00164 'weight' => 3, 00165 'dimgrades' => array(3 => 11.0, 4 => 10.1, 5 => 92.0), 00166 ); 00167 $assessments[17] = (object)array( 00168 'weight' => 1, 00169 'dimgrades' => array(3 => 11.0, 4 => 8.1, 5 => 88.0), 00170 ); 00171 // exercise SUT 00172 $average = $this->evaluator->average_assessment($assessments); 00173 // validate 00174 $this->assertIsA($average->dimgrades, 'array'); 00175 $this->assertEqual(grade_floatval($average->dimgrades[3]), grade_floatval((10.0 + 11.0*3 + 11.0)/5)); 00176 $this->assertEqual(grade_floatval($average->dimgrades[4]), grade_floatval((13.4 + 10.1*3 + 8.1)/5)); 00177 $this->assertEqual(grade_floatval($average->dimgrades[5]), grade_floatval((95.0 + 92.0*3 + 88.0)/5)); 00178 } 00179 00180 public function test_average_assessment_noweight() { 00181 // fixture set-up 00182 $assessments = array(); 00183 $assessments[11] = (object)array( 00184 'weight' => 0, 00185 'dimgrades' => array(3 => 10.0, 4 => 13.4, 5 => 95.0), 00186 ); 00187 $assessments[17] = (object)array( 00188 'weight' => 0, 00189 'dimgrades' => array(3 => 11.0, 4 => 8.1, 5 => 88.0), 00190 ); 00191 // exercise SUT 00192 $average = $this->evaluator->average_assessment($assessments); 00193 // validate 00194 $this->assertNull($average); 00195 } 00196 00197 public function test_weighted_variance() { 00198 // fixture set-up 00199 $assessments[11] = (object)array( 00200 'weight' => 1, 00201 'dimgrades' => array(3 => 11, 4 => 2), 00202 ); 00203 $assessments[13] = (object)array( 00204 'weight' => 3, 00205 'dimgrades' => array(3 => 11, 4 => 4), 00206 ); 00207 $assessments[17] = (object)array( 00208 'weight' => 2, 00209 'dimgrades' => array(3 => 11, 4 => 5), 00210 ); 00211 $assessments[20] = (object)array( 00212 'weight' => 1, 00213 'dimgrades' => array(3 => 11, 4 => 7), 00214 ); 00215 $assessments[25] = (object)array( 00216 'weight' => 1, 00217 'dimgrades' => array(3 => 11, 4 => 9), 00218 ); 00219 // exercise SUT 00220 $variance = $this->evaluator->weighted_variance($assessments); 00221 // validate 00222 // dimension [3] have all the grades equal to 11 00223 $this->assertEqual($variance[3], 0); 00224 // dimension [4] represents data 2, 4, 4, 4, 5, 5, 7, 9 having stdev=2 (stdev is sqrt of variance) 00225 $this->assertEqual($variance[4], 4); 00226 } 00227 00228 public function test_assessments_distance_zero() { 00229 // fixture set-up 00230 $diminfo = array( 00231 3 => (object)array('weight' => 1, 'min' => 0, 'max' => 100, 'variance' => 12.34567), 00232 4 => (object)array('weight' => 1, 'min' => 1, 'max' => 5, 'variance' => 98.76543), 00233 ); 00234 $assessment1 = (object)array('dimgrades' => array(3 => 15, 4 => 2)); 00235 $assessment2 = (object)array('dimgrades' => array(3 => 15, 4 => 2)); 00236 $settings = (object)array('comparison' => 5); 00237 // exercise SUT and validate 00238 $this->assertEqual($this->evaluator->assessments_distance($assessment1, $assessment2, $diminfo, $settings), 0); 00239 } 00240 00241 public function test_assessments_distance_equals() { 00242 /* 00243 // fixture set-up 00244 $diminfo = array( 00245 3 => (object)array('weight' => 1, 'min' => 0, 'max' => 100, 'variance' => 12.34567), 00246 4 => (object)array('weight' => 1, 'min' => 0, 'max' => 100, 'variance' => 12.34567), 00247 ); 00248 $assessment1 = (object)array('dimgrades' => array(3 => 25, 4 => 4)); 00249 $assessment2 = (object)array('dimgrades' => array(3 => 75, 4 => 2)); 00250 $referential = (object)array('dimgrades' => array(3 => 50, 4 => 3)); 00251 $settings = (object)array('comparison' => 5); 00252 // exercise SUT and validate 00253 $this->assertEqual($this->evaluator->assessments_distance($assessment1, $referential, $diminfo, $settings), 00254 $this->evaluator->assessments_distance($assessment2, $referential, $diminfo, $settings)); 00255 */ 00256 // fixture set-up 00257 $diminfo = array( 00258 1 => (object)array('min' => 0, 'max' => 2, 'weight' => 1, 'variance' => 625), 00259 2 => (object)array('min' => 0, 'max' => 3, 'weight' => 1, 'variance' => 277.7778888889), 00260 ); 00261 $assessment1 = (object)array('dimgrades' => array(1 => 0, 2 => 66.66667)); 00262 $assessment2 = (object)array('dimgrades' => array(1 => 50, 2 => 33.33333)); 00263 $referential = (object)array('dimgrades' => array(1 => 25, 2 => 50)); 00264 $settings = (object)array('comparison' => 9); 00265 // exercise SUT and validate 00266 $this->assertEqual($this->evaluator->assessments_distance($assessment1, $referential, $diminfo, $settings), 00267 $this->evaluator->assessments_distance($assessment2, $referential, $diminfo, $settings)); 00268 00269 } 00270 }