return true;
}
+ /**
+ * Given an array of grade values (numerical indices), applies droplow or keephigh
+ * rules to limit the final array.
+ * @param array $grades
+ * @return array Limited grades.
+ */
+ function apply_limit_rules($grades) {
+ rsort($grades, SORT_NUMERIC);
+ if (!empty($this->droplow)) {
+ for ($i = 0; $i < $this->droplow; $i++) {
+ array_pop($grades);
+ }
+ } elseif (!empty($this->keephigh)) {
+ while (count($grades) > $this->keephigh) {
+ array_pop($grades);
+ }
+ }
+ sort($grades, SORT_NUMERIC);
+ return $grades;
+ }
+
/**
* Given an array of arrays of values, standardised from 0 to 1 and indexed by userid,
* uses this category's aggregation method to
foreach ($pooled_grades as $userid => $grades) {
$aggregated_value = null;
- // Sort grades from lowest to largest
- sort($grades, SORT_NUMERIC);
- // Apply droplow or keephigh rule
- if (!empty($this->droplow)) {
- $reversed_grades = array_reverse($grades);
- for ($i = 0; $i < $this->droplow; $i++) {
- array_pop($reversed_grades);
- }
- $grades = array_reverse($reversed_grades);
- } elseif (!empty($this->keephigh)) {
- for ($i = 0; $i < $this->keephigh; $i++) {
- array_pop($grades);
- }
- }
+ $grades = $this->apply_limit_rules($grades);
if (count($grades) > 1) {
}
function test_grade_category_set_as_parent() {
+ global $CFG;
+ $debuglevel = $CFG->debug;
+
// There are 4 constraints which, if violated, should return false and trigger a debugging message. Test each of them
$grade_category = new grade_category();
$grade_category->fullname = 'new topcategory';
$child2 = new grade_category();
$child2->grade_item = new grade_item();
$child2->grade_item->sortorder = 2;
+ $CFG->debug = 2;
$this->assertFalse($grade_category->set_as_parent(array($child1, $child2)));
+ $CFG->debug = $debuglevel;
// 2. Non-consecutive children
$child1 = new grade_item();
$child2 = new grade_item();
$child1->sortorder = 1;
$child2->sortorder = 3;
+ $CFG->debug = 2;
$this->assertFalse($grade_category->set_as_parent(array($child1, $child2)));
+ $CFG->debug = $debuglevel;
// 3. Child is a top category
$child1 = new grade_category($this->grade_categories[0]);
+ $CFG->debug = 2;
$this->assertFalse($grade_category->set_as_parent(array($child1)));
+ $CFG->debug = $debuglevel;
// 4. Child already has a top category
$child1 = new grade_item($this->grade_items[0]);
+ $CFG->debug = 2;
$this->assertFalse($grade_category->set_as_parent(array($child1)));
+ $CFG->debug = $debuglevel;
// Now test setting parent correctly
$child1 = new grade_item();
$child2->insert();
$this->assertTrue($grade_category->set_as_parent(array($child1, $child2)));
}
+
+ function test_grade_category_apply_limit_rules() {
+ $category = new grade_category();
+ $grades = array(5.374, 9.4743, 2.5474, 7.3754);
+
+ $category->droplow = 2;
+ $result = $category->apply_limit_rules(fullclone($grades));
+ $this->assertEqual(array(7.3754, 9.4743), $result);
+
+ $category->keephigh = 1;
+ $category->droplow = 0;
+ $result = $category->apply_limit_rules(fullclone($grades));
+ $this->assertEqual(array(9.4743), $result);
+ }
}
?>
function test_grade_tree_build_tree_filled() {
$tree = new grade_tree($this->courseid);
+ echo $tree->display_grades() . "<br />";
+
+ $element = $tree->tree_array[7];
+ $tree->remove_element(7);
+ $tree->renumber();
+ echo $tree->display_grades() . "<br />";
+
+ $tree->insert_element($element, 4);
+ $tree->renumber();
+ echo $tree->display_grades() . "<br />";
}
}