]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-9506 Fixed a couple of failing unit tests, due to new test data
authornicolasconnault <nicolasconnault>
Wed, 16 May 2007 07:47:04 +0000 (07:47 +0000)
committernicolasconnault <nicolasconnault>
Wed, 16 May 2007 07:47:04 +0000 (07:47 +0000)
lib/simpletest/grade/simpletest/testgradeitem.php

index d5e9d0059c411ac979f0aed0fb48f46ffeb8591e..b832134414f21b5a352f9ebbea81a48bad4414e9 100755 (executable)
-<?php // $Id$
-
-///////////////////////////////////////////////////////////////////////////
-//                                                                       //
-// NOTICE OF COPYRIGHT                                                   //
-//                                                                       //
-// Moodle - Modular Object-Oriented Dynamic Learning Environment         //
-//          http://moodle.org                                            //
-//                                                                       //
-// Copyright (C) 1999-2004  Martin Dougiamas  http://dougiamas.com       //
-//                                                                       //
-// This program is free software; you can redistribute it and/or modify  //
-// it under the terms of the GNU General Public License as published by  //
-// the Free Software Foundation; either version 2 of the License, or     //
-// (at your option) any later version.                                   //
-//                                                                       //
-// This program is distributed in the hope that it will be useful,       //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of        //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         //
-// GNU General Public License for more details:                          //
-//                                                                       //
-//          http://www.gnu.org/copyleft/gpl.html                         //
-//                                                                       //
-///////////////////////////////////////////////////////////////////////////
-@set_time_limit(0);
-/**
- * Unit tests for grade_item object.
- *
- * @author nicolas@moodle.com
- * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
- * @package moodlecore
- */
-require_once(dirname(__FILE__) . '/../../../../config.php');
-global $CFG;
-require_once($CFG->libdir . '/simpletest/testgradelib.php');
-
-class grade_item_test extends gradelib_test {
-
-    function test_grade_item_construct() { 
-        $params = new stdClass();
-
-        $params->courseid = $this->courseid;
-        $params->categoryid = $this->grade_categories[1]->id;
-        $params->itemname = 'unittestgradeitem4';
-        $params->itemtype = 'mod';
-        $params->itemmodule = 'database';
-        $params->iteminfo = 'Grade item used for unit testing';
-
-        $grade_item = new grade_item($params, false);
-
-        $this->assertEqual($params->courseid, $grade_item->courseid);
-        $this->assertEqual($params->categoryid, $grade_item->categoryid);
-        $this->assertEqual($params->itemmodule, $grade_item->itemmodule);
-    }
-
-    function test_grade_item_insert() {
-        $grade_item = new grade_item();
-        $this->assertTrue(method_exists($grade_item, 'insert'));
-        
-        $grade_item->courseid = $this->courseid;
-        $grade_item->categoryid = $this->grade_categories[1]->id;
-        $grade_item->itemname = 'unittestgradeitem4';
-        $grade_item->itemtype = 'mod';
-        $grade_item->itemmodule = 'quiz';
-        $grade_item->iteminfo = 'Grade item used for unit testing';
-
-        // Check the grade_category's needsupdate variable first
-        $category = $grade_item->get_category(); 
-        $category->load_grade_item();
-        $category->grade_item->needsupdate = false;
-        $this->assertNotNull($category->grade_item);
-
-        $grade_item->insert();
-
-        // Now check the needsupdate variable, it should have been set to true
-        $category->grade_item->update_from_db();
-        $this->assertTrue($category->grade_item->needsupdate);
-
-        $last_grade_item = end($this->grade_items);
-
-        $this->assertEqual($grade_item->id, $last_grade_item->id + 1);
-    }
-
-    function test_grade_item_delete() {
-        $grade_item = new grade_item($this->grade_items[0]);
-        $this->assertTrue(method_exists($grade_item, 'delete'));
-        
-        // Check the grade_category's needsupdate variable first
-        $category = $grade_item->get_category(); 
-        $category->load_grade_item();
-        $this->assertNotNull($category->grade_item);
-        $category->grade_item->needsupdate = false;
-        
-        $this->assertTrue($grade_item->delete());
-
-        // Now check the needsupdate variable, it should have been set to true
-        $category->grade_item->update_from_db();
-        $this->assertTrue($category->grade_item->needsupdate);
-
-        $this->assertFalse(get_record('grade_items', 'id', $grade_item->id));
-    }
-
-    function test_grade_item_update() {
-        $grade_item = new grade_item($this->grade_items[0]);
-        $this->assertTrue(method_exists($grade_item, 'update'));
-        
-        $grade_item->iteminfo = 'Updated info for this unittest grade_item';
-
-        // Check the grade_category's needsupdate variable first
-        $category= $grade_item->get_category(); 
-        $category->load_grade_item();
-        $this->assertNotNull($category->grade_item);
-        $category->grade_item->needsupdate = false;
-        
-        $this->assertTrue($grade_item->update());
-
-        // Now check the needsupdate variable, it should NOT have been set to true, because insufficient changes to justify update.
-        $this->assertFalse($category->grade_item->needsupdate);
-        
-        $grade_item->grademin = 14; 
-        $this->assertTrue($grade_item->qualifies_for_update());
-        $this->assertTrue($grade_item->update(true));
-        
-        // Now check the needsupdate variable, it should have been set to true
-        $category->grade_item->update_from_db();
-        $this->assertTrue($category->grade_item->needsupdate);
-
-        // Also check parent
-        $category->load_parent_category();
-        $category->parent_category->load_grade_item();
-        $this->assertTrue($category->parent_category->grade_item->needsupdate);
-        
-        $iteminfo = get_field('grade_items', 'iteminfo', 'id', $this->grade_items[0]->id);
-        $this->assertEqual($grade_item->iteminfo, $iteminfo);
-    }
-
-    function test_grade_item_qualifies_for_update() {
-        $grade_item = new grade_item($this->grade_items[0]);
-        $this->assertTrue(method_exists($grade_item, 'qualifies_for_update'));
-        
-        $grade_item->iteminfo = 'Updated info for this unittest grade_item';
-        
-        $this->assertFalse($grade_item->qualifies_for_update());
-
-        $grade_item->grademin = 14;
-
-        $this->assertTrue($grade_item->qualifies_for_update()); 
-    }
-
-    function test_grade_item_fetch() {
-        $grade_item = new grade_item(); 
-        $this->assertTrue(method_exists($grade_item, 'fetch'));
-
-        $grade_item = grade_item::fetch('id', $this->grade_items[0]->id);
-        $this->assertEqual($this->grade_items[0]->id, $grade_item->id);
-        $this->assertEqual($this->grade_items[0]->iteminfo, $grade_item->iteminfo); 
-        
-        $grade_item = grade_item::fetch('itemtype', $this->grade_items[1]->itemtype, 'itemmodule', $this->grade_items[1]->itemmodule);
-        $this->assertEqual($this->grade_items[1]->id, $grade_item->id);
-        $this->assertEqual($this->grade_items[1]->iteminfo, $grade_item->iteminfo); 
-    }
-
-    function test_grade_item_fetch_all_using_this() {
-        $grade_item = new grade_item();
-        $grade_item->itemtype = 'mod';
-        $this->assertTrue(method_exists($grade_item, 'fetch_all_using_this'));
-       
-        $grade_items = $grade_item->fetch_all_using_this();
-        $this->assertEqual(2, count($grade_items));
-        $first_grade_item = reset($grade_items);
-        $this->assertEqual($this->grade_items[0]->id, $first_grade_item->id);
-    }
-    
-    /**
-     * Retrieve all raw scores for a given grade_item.
-     */
-    function test_grade_item_get_all_raws() {
-        $grade_item = new grade_item($this->grade_items[0]);
-        $this->assertTrue(method_exists($grade_item, 'get_raw'));
-        
-        $raw_grades = $grade_item->get_raw();
-        $this->assertEqual(3, count($raw_grades));
-    }
-
-    /**
-     * Retrieve the raw score for a specific userid.
-     */
-    function test_grade_item_get_raw() { 
-        $grade_item = new grade_item($this->grade_items[0]);
-        $this->assertTrue(method_exists($grade_item, 'get_raw'));
-        
-        $raw_grades = $grade_item->get_raw($this->userid);
-        $raw_grade = current($raw_grades);
-        $this->assertEqual(1, count($raw_grades));        
-        $this->assertEqual($this->grade_grades_raw[0]->gradevalue, $raw_grade->gradevalue);
-    }
-
-    
-    /**
-     * Retrieve all final scores for a given grade_item.
-     */
-    function test_grade_item_get_all_finals() {
-        $grade_item = new grade_item($this->grade_items[0]);
-        $this->assertTrue(method_exists($grade_item, 'get_final'));
-        
-        $final_grades = $grade_item->get_final();
-        $this->assertEqual(3, count($final_grades)); 
-    }
-
-    
-    /**
-     * Retrieve all final scores for a specific userid.
-     */
-    function test_grade_item_get_final() {
-        $grade_item = new grade_item($this->grade_items[0]);
-        $this->assertTrue(method_exists($grade_item, 'get_final'));
-        
-        $final_grades = $grade_item->get_final($this->userid);
-        $final_grade = current($final_grades);
-        $this->assertEqual(1, count($final_grade));
-        $this->assertEqual($this->grade_grades_final[0]->gradevalue, $final_grade->gradevalue); 
-    }
-
-    function test_grade_item_get_calculation() {
-        $grade_item = new grade_item($this->grade_items[0]);
-        $this->assertTrue(method_exists($grade_item, 'get_calculation'));
-        
-        $grade_calculation = $grade_item->get_calculation();
-        $this->assertEqual($this->grade_calculations[0]->id, $grade_calculation->id);
-    }
-
-    function test_grade_item_set_calculation() {
-        $grade_item = new grade_item($this->grade_items[1]);
-        $this->assertTrue(method_exists($grade_item, 'set_calculation'));
-        $this->assertTrue(method_exists($grade_item, 'get_calculation'));
-        
-        $calculation = 'SUM([unittestgradeitem1], [unittestgradeitem3])';
-        $grade_item->set_calculation($calculation);
-        $new_calculation = $grade_item->get_calculation();
-
-        $this->assertEqual($calculation, $new_calculation->calculation);
-    }
-
-    function test_grade_item_get_category() {
-        $grade_item = new grade_item($this->grade_items[0]);
-        $this->assertTrue(method_exists($grade_item, 'get_category'));
-        
-        $category = $grade_item->get_category();
-        $this->assertEqual($this->grade_categories[1]->fullname, $category->fullname);
-    }
-
-    /**
-     * Test update of all final grades, then only 1 grade (give a $userid)
-     */
-    function test_grade_item_update_final_grades() {
-        $grade_item = new grade_item($this->grade_items[0]);
-        $this->assertTrue(method_exists($grade_item, 'update_final_grade'));
-        $this->assertEqual(3, $grade_item->update_final_grade()); 
-        $this->assertEqual(1, $grade_item->update_final_grade(1)); 
-    }
-
-    /**
-     * Test loading of raw and final items into grade_item.
-     */
-    function test_grade_item_load() {
-        $grade_item = new grade_item($this->grade_items[0]);
-        $this->assertTrue(method_exists($grade_item, 'load_final'));
-        $this->assertTrue(method_exists($grade_item, 'load_raw'));
-
-        // Check that final and raw items are not yet loaded
-        $this->assertTrue(empty($grade_item->grade_grades_final));
-        $this->assertTrue(empty($grade_item->grade_grades_raw));
-        
-        // Load raw and final grades
-        $grade_item->load_final();
-        $grade_item->load_raw();
-        
-        // Check that final and raw grades are now loaded
-        $this->assertFalse(empty($grade_item->grade_grades_final));
-        $this->assertFalse(empty($grade_item->grade_grades_raw));
-        $this->assertEqual($this->grade_grades_final[0]->gradevalue, $grade_item->grade_grades_final[1]->gradevalue);
-        $this->assertEqual($this->grade_grades_raw[0]->gradevalue, $grade_item->grade_grades_raw[1]->gradevalue);
-    }
-
-    /**
-     * Test loading final items, generating fake values to replace missing grades
-     */
-    function test_grade_item_load_fake_final() {
-        $grade_item = new grade_item($this->grade_items[0]);
-        $this->assertTrue(method_exists($grade_item, 'load_final'));
-        global $CFG;
-        $CFG->usenullgrades = true;
-
-        // Delete one of the final grades
-        $final_grade = new grade_grades_final($this->grade_grades_final[0]);
-        $final_grade->delete();
-        unset($this->grade_grades_final[0]);
-
-        // Load the final grades
-        $final_grades = $grade_item->load_final(true);
-        $this->assertEqual(3, count($final_grades));
-        $this->assertEqual($grade_item->grademin, $final_grades[1]->gradevalue); 
-
-        // Load normal final grades
-        $final_grades = $grade_item->load_final();
-        $this->assertEqual(2, count($final_grades));
-    }
-    
-    /**
-     * Test the adjust_grade method
-     */
-    function test_grade_item_adjust_grade() {
-        $grade_item = new grade_item($this->grade_items[0]);
-        $this->assertTrue(method_exists($grade_item, 'adjust_grade'));
-        $grade_raw = new stdClass();
-
-        $grade_raw->gradevalue = 40;
-        $grade_raw->grademax = 100;
-        $grade_raw->grademin = 0;
-        
-        $grade_item->multfactor = 1;
-        $grade_item->plusfactor = 0;
-        $grade_item->grademax = 50;
-        $grade_item->grademin = 0;
-        
-        $original_grade_raw  = clone($grade_raw);
-        $original_grade_item = clone($grade_item);
-
-        $this->assertEqual(20, $grade_item->adjust_grade($grade_raw)); 
-        
-        // Try a larger maximum grade
-        $grade_item->grademax = 150;
-        $grade_item->grademin = 0;
-        $this->assertEqual(60, $grade_item->adjust_grade($grade_raw)); 
-
-        // Try larger minimum grade
-        $grade_item->grademin = 50;
-
-        $this->assertEqual(90, $grade_item->adjust_grade($grade_raw)); 
-
-        // Rescaling from a small scale (0-50) to a larger scale (0-100)
-        $grade_raw->grademax = 50;
-        $grade_raw->grademin = 0;
-        $grade_item->grademax = 100;
-        $grade_item->grademin = 0;
-
-        $this->assertEqual(80, $grade_item->adjust_grade($grade_raw)); 
-
-        // Rescaling from a small scale (0-50) to a larger scale with offset (40-100)
-        $grade_item->grademax = 100;
-        $grade_item->grademin = 40;
-
-        $this->assertEqual(88, $grade_item->adjust_grade($grade_raw)); 
-
-        // Try multfactor and plusfactor
-        $grade_raw = clone($original_grade_raw);
-        $grade_item = clone($original_grade_item);
-        $grade_item->multfactor = 1.23;
-        $grade_item->plusfactor = 3;
-
-        $this->assertEqual(27.6, $grade_item->adjust_grade($grade_raw)); 
-
-        // Try multfactor below 0 and a negative plusfactor
-        $grade_raw = clone($original_grade_raw);
-        $grade_item = clone($original_grade_item);
-        $grade_item->multfactor = 0.23;
-        $grade_item->plusfactor = -3;
-
-        $this->assertEqual(round(1.6), round($grade_item->adjust_grade($grade_raw))); 
-    }
-
-    function test_grade_item_adjust_scale_grade() {
-        // Load grade item and its scale
-        $grade_item = new grade_item(array('scaleid' => $this->scale[1]->id), false);
-        $grade_item->gradetype = GRADE_TYPE_SCALE;
-        $grade_item->insert();
-        $grade_item->load_scale();
-        $this->assertEqual('Very Good', $grade_item->scale->scale_items[1]);
-        
-        // Load raw grade and its scale
-        $grade_raw = new grade_grades_raw(array('scaleid' => $this->scale[0]->id), false);
-        $grade_raw->gradevalue = 4;
-        $grade_raw->itemid = $grade_item->id;
-        $grade_raw->userid = 1;
-        $grade_raw->insert();
-        $grade_raw->load_scale();
-        $this->assertEqual('Fairly neutral', $grade_raw->scale->scale_items[2]);
-        
-        // Test grade_item::adjust_scale
-        $this->assertEqual(3, round($grade_item->adjust_grade($grade_raw, null, 'gradevalue')));
-        $grade_raw->gradevalue = 6;
-        $this->assertEqual(4, $grade_item->adjust_grade($grade_raw, null, 'gradevalue'));
-
-        // Check that the final grades have the correct values now
-        $grade_item->load_raw();
-        $grade_item->update_final_grade();
-        
-        $this->assertFalse(empty($grade_item->grade_grades_final));
-        $this->assertEqual($grade_item->id, $grade_item->grade_grades_final[1]->itemid);
-        $this->assertEqual(2.66667, $grade_item->grade_grades_final[1]->gradevalue);
-        $this->assertEqual(1, $grade_item->grade_grades_final[1]->userid);
-    }
-
-    function test_grade_item_toggle_locking() {
-        $grade_item = new grade_item($this->grade_items[0]);
-        $this->assertTrue(method_exists($grade_item, 'toggle_locking'));
-
-        $this->assertFalse($grade_item->locked);
-        $this->assertEqual(0, $grade_item->toggle_locking());
-        $this->assertTrue($grade_item->locked);
-        $grade_item->load_final();
-        $this->assertFalse($grade_item->grade_grades_final[1]->locked);
-        
-        $grade_item->locked = false;
-        $this->assertEqual(3, $grade_item->toggle_locking(true));
-        $this->assertTrue($grade_item->locked);
-        $this->assertTrue($grade_item->grade_grades_final[1]->locked);
-        $this->assertTrue($grade_item->grade_grades_final[2]->locked);
-        $this->assertTrue($grade_item->grade_grades_final[3]->locked);
-    }
-
-    function test_grade_item_toggle_hiding() {
-        $grade_item = new grade_item($this->grade_items[0]);
-        $this->assertTrue(method_exists($grade_item, 'toggle_hiding'));
-
-        $this->assertFalse($grade_item->hidden);
-        $this->assertEqual(0, $grade_item->toggle_hiding());
-        $this->assertTrue($grade_item->hidden);
-        $grade_item->load_final();
-        $this->assertFalse($grade_item->grade_grades_final[1]->hidden);
-        
-        $grade_item->hidden = false;
-        $this->assertEqual(3, $grade_item->toggle_hiding(true));
-        $this->assertTrue($grade_item->hidden);
-        $this->assertTrue($grade_item->grade_grades_final[1]->hidden);
-        $this->assertTrue($grade_item->grade_grades_final[2]->hidden);
-        $this->assertTrue($grade_item->grade_grades_final[3]->hidden);
-    } 
-
-    function test_grade_item_generate_final() {
-        $grade_item = new grade_item();
-        $grade_item->courseid = $this->courseid;
-        $grade_item->categoryid = $this->grade_categories[1]->id;
-        $grade_item->itemname = 'unittestgradeitem4';
-        $grade_item->itemtype = 'mod';
-        $grade_item->grademin = 0;
-        $grade_item->grademax = 100;
-        $grade_item->itemmodule = 'quiz';
-        $grade_item->iteminfo = 'Grade item used for unit testing';
-
-        $grade_item->insert();
-
-        $grade_grades_raw = new grade_grades_raw();
-        $grade_grades_raw->itemid = $grade_item->id;
-        $grade_grades_raw->userid = 1;
-        $grade_grades_raw->gradevalue = 88;
-        $grade_grades_raw->grademax = 110;
-        $grade_grades_raw->grademin = 18;
-        $grade_grades_raw->insert();
-
-        $grade_grades_raw = new grade_grades_raw();
-        $grade_grades_raw->itemid = $grade_item->id;
-        $grade_grades_raw->userid = 2;
-        $grade_grades_raw->gradevalue = 68;
-        $grade_grades_raw->grademax = 110;
-        $grade_grades_raw->grademin = 18;
-        $grade_grades_raw->insert();
-
-        $grade_grades_raw = new grade_grades_raw();
-        $grade_grades_raw->itemid = $grade_item->id;
-        $grade_grades_raw->userid = 3;
-        $grade_grades_raw->gradevalue = 81;
-        $grade_grades_raw->grademax = 110;
-        $grade_grades_raw->grademin = 18;
-        $grade_grades_raw->insert();
-
-        $grade_item->load_raw();
-        $this->assertEqual(3, count($grade_item->grade_grades_raw));
-
-        $grade_item->generate_final();
-        $grade_item->load_final();
-        $this->assertEqual(3, count($grade_item->grade_grades_final)); 
-    }
-} 
-?>
+<?php // $Id$\r
+\r
+///////////////////////////////////////////////////////////////////////////\r
+//                                                                       //\r
+// NOTICE OF COPYRIGHT                                                   //\r
+//                                                                       //\r
+// Moodle - Modular Object-Oriented Dynamic Learning Environment         //\r
+//          http://moodle.org                                            //\r
+//                                                                       //\r
+// Copyright (C) 1999-2004  Martin Dougiamas  http://dougiamas.com       //\r
+//                                                                       //\r
+// This program is free software; you can redistribute it and/or modify  //\r
+// it under the terms of the GNU General Public License as published by  //\r
+// the Free Software Foundation; either version 2 of the License, or     //\r
+// (at your option) any later version.                                   //\r
+//                                                                       //\r
+// This program is distributed in the hope that it will be useful,       //\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of        //\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         //\r
+// GNU General Public License for more details:                          //\r
+//                                                                       //\r
+//          http://www.gnu.org/copyleft/gpl.html                         //\r
+//                                                                       //\r
+///////////////////////////////////////////////////////////////////////////\r
+@set_time_limit(0);\r
+/**\r
+ * Unit tests for grade_item object.\r
+ *\r
+ * @author nicolas@moodle.com\r
+ * @license http://www.gnu.org/copyleft/gpl.html GNU Public License\r
+ * @package moodlecore\r
+ */\r
+require_once(dirname(__FILE__) . '/../../../../config.php');\r
+global $CFG;\r
+require_once($CFG->libdir . '/simpletest/testgradelib.php');\r
+\r
+class grade_item_test extends gradelib_test {\r
+\r
+    function test_grade_item_construct() { \r
+        $params = new stdClass();\r
+\r
+        $params->courseid = $this->courseid;\r
+        $params->categoryid = $this->grade_categories[1]->id;\r
+        $params->itemname = 'unittestgradeitem4';\r
+        $params->itemtype = 'mod';\r
+        $params->itemmodule = 'database';\r
+        $params->iteminfo = 'Grade item used for unit testing';\r
+\r
+        $grade_item = new grade_item($params, false);\r
+\r
+        $this->assertEqual($params->courseid, $grade_item->courseid);\r
+        $this->assertEqual($params->categoryid, $grade_item->categoryid);\r
+        $this->assertEqual($params->itemmodule, $grade_item->itemmodule);\r
+    }\r
+\r
+    function test_grade_item_insert() {\r
+        $grade_item = new grade_item();\r
+        $this->assertTrue(method_exists($grade_item, 'insert'));\r
+        \r
+        $grade_item->courseid = $this->courseid;\r
+        $grade_item->categoryid = $this->grade_categories[1]->id;\r
+        $grade_item->itemname = 'unittestgradeitem4';\r
+        $grade_item->itemtype = 'mod';\r
+        $grade_item->itemmodule = 'quiz';\r
+        $grade_item->iteminfo = 'Grade item used for unit testing';\r
+\r
+        // Check the grade_category's needsupdate variable first\r
+        $category = $grade_item->get_category(); \r
+        $category->load_grade_item();\r
+        $category->grade_item->needsupdate = false;\r
+        $this->assertNotNull($category->grade_item);\r
+\r
+        $grade_item->insert();\r
+\r
+        // Now check the needsupdate variable, it should have been set to true\r
+        $category->grade_item->update_from_db();\r
+        $this->assertTrue($category->grade_item->needsupdate);\r
+\r
+        $last_grade_item = end($this->grade_items);\r
+\r
+        $this->assertEqual($grade_item->id, $last_grade_item->id + 1);\r
+    }\r
+\r
+    function test_grade_item_delete() {\r
+        $grade_item = new grade_item($this->grade_items[0]);\r
+        $this->assertTrue(method_exists($grade_item, 'delete'));\r
+        \r
+        // Check the grade_category's needsupdate variable first\r
+        $category = $grade_item->get_category(); \r
+        $category->load_grade_item();\r
+        $this->assertNotNull($category->grade_item);\r
+        $category->grade_item->needsupdate = false;\r
+        \r
+        $this->assertTrue($grade_item->delete());\r
+\r
+        // Now check the needsupdate variable, it should have been set to true\r
+        $category->grade_item->update_from_db();\r
+        $this->assertTrue($category->grade_item->needsupdate);\r
+\r
+        $this->assertFalse(get_record('grade_items', 'id', $grade_item->id));\r
+    }\r
+\r
+    function test_grade_item_update() {\r
+        $grade_item = new grade_item($this->grade_items[0]);\r
+        $this->assertTrue(method_exists($grade_item, 'update'));\r
+        \r
+        $grade_item->iteminfo = 'Updated info for this unittest grade_item';\r
+\r
+        // Check the grade_category's needsupdate variable first\r
+        $category= $grade_item->get_category(); \r
+        $category->load_grade_item();\r
+        $this->assertNotNull($category->grade_item);\r
+        $category->grade_item->needsupdate = false;\r
+        \r
+        $this->assertTrue($grade_item->update());\r
+\r
+        // Now check the needsupdate variable, it should NOT have been set to true, because insufficient changes to justify update.\r
+        $this->assertFalse($category->grade_item->needsupdate);\r
+        \r
+        $grade_item->grademin = 14; \r
+        $this->assertTrue($grade_item->qualifies_for_update());\r
+        $this->assertTrue($grade_item->update(true));\r
+        \r
+        // Now check the needsupdate variable, it should have been set to true\r
+        $category->grade_item->update_from_db();\r
+        $this->assertTrue($category->grade_item->needsupdate);\r
+\r
+        // Also check parent\r
+        $category->load_parent_category();\r
+        $category->parent_category->load_grade_item();\r
+        $this->assertTrue($category->parent_category->grade_item->needsupdate);\r
+        \r
+        $iteminfo = get_field('grade_items', 'iteminfo', 'id', $this->grade_items[0]->id);\r
+        $this->assertEqual($grade_item->iteminfo, $iteminfo);\r
+    }\r
+\r
+    function test_grade_item_qualifies_for_update() {\r
+        $grade_item = new grade_item($this->grade_items[0]);\r
+        $this->assertTrue(method_exists($grade_item, 'qualifies_for_update'));\r
+        \r
+        $grade_item->iteminfo = 'Updated info for this unittest grade_item';\r
+        \r
+        $this->assertFalse($grade_item->qualifies_for_update());\r
+\r
+        $grade_item->grademin = 14;\r
+\r
+        $this->assertTrue($grade_item->qualifies_for_update()); \r
+    }\r
+\r
+    function test_grade_item_fetch() {\r
+        $grade_item = new grade_item(); \r
+        $this->assertTrue(method_exists($grade_item, 'fetch'));\r
+\r
+        $grade_item = grade_item::fetch('id', $this->grade_items[0]->id);\r
+        $this->assertEqual($this->grade_items[0]->id, $grade_item->id);\r
+        $this->assertEqual($this->grade_items[0]->iteminfo, $grade_item->iteminfo); \r
+        \r
+        $grade_item = grade_item::fetch('itemtype', $this->grade_items[1]->itemtype, 'itemmodule', $this->grade_items[1]->itemmodule);\r
+        $this->assertEqual($this->grade_items[1]->id, $grade_item->id);\r
+        $this->assertEqual($this->grade_items[1]->iteminfo, $grade_item->iteminfo); \r
+    }\r
+\r
+    function test_grade_item_fetch_all_using_this() {\r
+        $grade_item = new grade_item();\r
+        $grade_item->itemtype = 'mod';\r
+        $this->assertTrue(method_exists($grade_item, 'fetch_all_using_this'));\r
+       \r
+        $grade_items = $grade_item->fetch_all_using_this();\r
+        $this->assertEqual(5, count($grade_items));\r
+        $first_grade_item = reset($grade_items);\r
+        $this->assertEqual($this->grade_items[0]->id, $first_grade_item->id);\r
+    }\r
+    \r
+    /**\r
+     * Retrieve all raw scores for a given grade_item.\r
+     */\r
+    function test_grade_item_get_all_raws() {\r
+        $grade_item = new grade_item($this->grade_items[0]);\r
+        $this->assertTrue(method_exists($grade_item, 'get_raw'));\r
+        \r
+        $raw_grades = $grade_item->get_raw();\r
+        $this->assertEqual(3, count($raw_grades));\r
+    }\r
+\r
+    /**\r
+     * Retrieve the raw score for a specific userid.\r
+     */\r
+    function test_grade_item_get_raw() { \r
+        $grade_item = new grade_item($this->grade_items[0]);\r
+        $this->assertTrue(method_exists($grade_item, 'get_raw'));\r
+        \r
+        $raw_grades = $grade_item->get_raw($this->userid);\r
+        $raw_grade = current($raw_grades);\r
+        $this->assertEqual(1, count($raw_grades));        \r
+        $this->assertEqual($this->grade_grades_raw[0]->gradevalue, $raw_grade->gradevalue);\r
+    }\r
+\r
+    \r
+    /**\r
+     * Retrieve all final scores for a given grade_item.\r
+     */\r
+    function test_grade_item_get_all_finals() {\r
+        $grade_item = new grade_item($this->grade_items[0]);\r
+        $this->assertTrue(method_exists($grade_item, 'get_final'));\r
+        \r
+        $final_grades = $grade_item->get_final();\r
+        $this->assertEqual(3, count($final_grades)); \r
+    }\r
+\r
+    \r
+    /**\r
+     * Retrieve all final scores for a specific userid.\r
+     */\r
+    function test_grade_item_get_final() {\r
+        $grade_item = new grade_item($this->grade_items[0]);\r
+        $this->assertTrue(method_exists($grade_item, 'get_final'));\r
+        \r
+        $final_grades = $grade_item->get_final($this->userid);\r
+        $final_grade = current($final_grades);\r
+        $this->assertEqual(1, count($final_grade));\r
+        $this->assertEqual($this->grade_grades_final[0]->gradevalue, $final_grade->gradevalue); \r
+    }\r
+\r
+    function test_grade_item_get_calculation() {\r
+        $grade_item = new grade_item($this->grade_items[0]);\r
+        $this->assertTrue(method_exists($grade_item, 'get_calculation'));\r
+        \r
+        $grade_calculation = $grade_item->get_calculation();\r
+        $this->assertEqual($this->grade_calculations[0]->id, $grade_calculation->id);\r
+    }\r
+\r
+    function test_grade_item_set_calculation() {\r
+        $grade_item = new grade_item($this->grade_items[1]);\r
+        $this->assertTrue(method_exists($grade_item, 'set_calculation'));\r
+        $this->assertTrue(method_exists($grade_item, 'get_calculation'));\r
+        \r
+        $calculation = 'SUM([unittestgradeitem1], [unittestgradeitem3])';\r
+        $grade_item->set_calculation($calculation);\r
+        $new_calculation = $grade_item->get_calculation();\r
+\r
+        $this->assertEqual($calculation, $new_calculation->calculation);\r
+    }\r
+\r
+    function test_grade_item_get_category() {\r
+        $grade_item = new grade_item($this->grade_items[0]);\r
+        $this->assertTrue(method_exists($grade_item, 'get_category'));\r
+        \r
+        $category = $grade_item->get_category();\r
+        $this->assertEqual($this->grade_categories[1]->fullname, $category->fullname);\r
+    }\r
+\r
+    /**\r
+     * Test update of all final grades, then only 1 grade (give a $userid)\r
+     */\r
+    function test_grade_item_update_final_grades() {\r
+        $grade_item = new grade_item($this->grade_items[0]);\r
+        $this->assertTrue(method_exists($grade_item, 'update_final_grade'));\r
+        $this->assertEqual(3, $grade_item->update_final_grade()); \r
+        $this->assertEqual(1, $grade_item->update_final_grade(1)); \r
+    }\r
+\r
+    /**\r
+     * Test loading of raw and final items into grade_item.\r
+     */\r
+    function test_grade_item_load() {\r
+        $grade_item = new grade_item($this->grade_items[0]);\r
+        $this->assertTrue(method_exists($grade_item, 'load_final'));\r
+        $this->assertTrue(method_exists($grade_item, 'load_raw'));\r
+\r
+        // Check that final and raw items are not yet loaded\r
+        $this->assertTrue(empty($grade_item->grade_grades_final));\r
+        $this->assertTrue(empty($grade_item->grade_grades_raw));\r
+        \r
+        // Load raw and final grades\r
+        $grade_item->load_final();\r
+        $grade_item->load_raw();\r
+        \r
+        // Check that final and raw grades are now loaded\r
+        $this->assertFalse(empty($grade_item->grade_grades_final));\r
+        $this->assertFalse(empty($grade_item->grade_grades_raw));\r
+        $this->assertEqual($this->grade_grades_final[0]->gradevalue, $grade_item->grade_grades_final[1]->gradevalue);\r
+        $this->assertEqual($this->grade_grades_raw[0]->gradevalue, $grade_item->grade_grades_raw[1]->gradevalue);\r
+    }\r
+\r
+    /**\r
+     * Test loading final items, generating fake values to replace missing grades\r
+     */\r
+    function test_grade_item_load_fake_final() {\r
+        $grade_item = new grade_item($this->grade_items[0]);\r
+        $this->assertTrue(method_exists($grade_item, 'load_final'));\r
+        global $CFG;\r
+        $CFG->usenullgrades = true;\r
+\r
+        // Delete one of the final grades\r
+        $final_grade = new grade_grades_final($this->grade_grades_final[0]);\r
+        $final_grade->delete();\r
+        unset($this->grade_grades_final[0]);\r
+\r
+        // Load the final grades\r
+        $final_grades = $grade_item->load_final(true);\r
+        $this->assertEqual(3, count($final_grades));\r
+        $this->assertEqual($grade_item->grademin, $final_grades[1]->gradevalue); \r
+\r
+        // Load normal final grades\r
+        $final_grades = $grade_item->load_final();\r
+        $this->assertEqual(2, count($final_grades));\r
+    }\r
+    \r
+    /**\r
+     * Test the adjust_grade method\r
+     */\r
+    function test_grade_item_adjust_grade() {\r
+        $grade_item = new grade_item($this->grade_items[0]);\r
+        $this->assertTrue(method_exists($grade_item, 'adjust_grade'));\r
+        $grade_raw = new stdClass();\r
+\r
+        $grade_raw->gradevalue = 40;\r
+        $grade_raw->grademax = 100;\r
+        $grade_raw->grademin = 0;\r
+        \r
+        $grade_item->multfactor = 1;\r
+        $grade_item->plusfactor = 0;\r
+        $grade_item->grademax = 50;\r
+        $grade_item->grademin = 0;\r
+        \r
+        $original_grade_raw  = clone($grade_raw);\r
+        $original_grade_item = clone($grade_item);\r
+\r
+        $this->assertEqual(20, $grade_item->adjust_grade($grade_raw)); \r
+        \r
+        // Try a larger maximum grade\r
+        $grade_item->grademax = 150;\r
+        $grade_item->grademin = 0;\r
+        $this->assertEqual(60, $grade_item->adjust_grade($grade_raw)); \r
+\r
+        // Try larger minimum grade\r
+        $grade_item->grademin = 50;\r
+\r
+        $this->assertEqual(90, $grade_item->adjust_grade($grade_raw)); \r
+\r
+        // Rescaling from a small scale (0-50) to a larger scale (0-100)\r
+        $grade_raw->grademax = 50;\r
+        $grade_raw->grademin = 0;\r
+        $grade_item->grademax = 100;\r
+        $grade_item->grademin = 0;\r
+\r
+        $this->assertEqual(80, $grade_item->adjust_grade($grade_raw)); \r
+\r
+        // Rescaling from a small scale (0-50) to a larger scale with offset (40-100)\r
+        $grade_item->grademax = 100;\r
+        $grade_item->grademin = 40;\r
+\r
+        $this->assertEqual(88, $grade_item->adjust_grade($grade_raw)); \r
+\r
+        // Try multfactor and plusfactor\r
+        $grade_raw = clone($original_grade_raw);\r
+        $grade_item = clone($original_grade_item);\r
+        $grade_item->multfactor = 1.23;\r
+        $grade_item->plusfactor = 3;\r
+\r
+        $this->assertEqual(27.6, $grade_item->adjust_grade($grade_raw)); \r
+\r
+        // Try multfactor below 0 and a negative plusfactor\r
+        $grade_raw = clone($original_grade_raw);\r
+        $grade_item = clone($original_grade_item);\r
+        $grade_item->multfactor = 0.23;\r
+        $grade_item->plusfactor = -3;\r
+\r
+        $this->assertEqual(round(1.6), round($grade_item->adjust_grade($grade_raw))); \r
+    }\r
+\r
+    function test_grade_item_adjust_scale_grade() {\r
+        // Load grade item and its scale\r
+        $grade_item = new grade_item(array('scaleid' => $this->scale[1]->id), false);\r
+        $grade_item->gradetype = GRADE_TYPE_SCALE;\r
+        $grade_item->insert();\r
+        $grade_item->load_scale();\r
+        $this->assertEqual('Very Good', $grade_item->scale->scale_items[1]);\r
+        \r
+        // Load raw grade and its scale\r
+        $grade_raw = new grade_grades_raw(array('scaleid' => $this->scale[0]->id), false);\r
+        $grade_raw->gradevalue = 4;\r
+        $grade_raw->itemid = $grade_item->id;\r
+        $grade_raw->userid = 1;\r
+        $grade_raw->insert();\r
+        $grade_raw->load_scale();\r
+        $this->assertEqual('Fairly neutral', $grade_raw->scale->scale_items[2]);\r
+        \r
+        // Test grade_item::adjust_scale\r
+        $this->assertEqual(3, round($grade_item->adjust_grade($grade_raw, null, 'gradevalue')));\r
+        $grade_raw->gradevalue = 6;\r
+        $this->assertEqual(4, $grade_item->adjust_grade($grade_raw, null, 'gradevalue'));\r
+\r
+        // Check that the final grades have the correct values now\r
+        $grade_item->load_raw();\r
+        $grade_item->update_final_grade();\r
+        \r
+        $this->assertFalse(empty($grade_item->grade_grades_final));\r
+        $this->assertEqual($grade_item->id, $grade_item->grade_grades_final[1]->itemid);\r
+        $this->assertEqual(2.66667, round($grade_item->grade_grades_final[1]->gradevalue, 5));\r
+        $this->assertEqual(1, $grade_item->grade_grades_final[1]->userid);\r
+    }\r
+\r
+    function test_grade_item_toggle_locking() {\r
+        $grade_item = new grade_item($this->grade_items[0]);\r
+        $this->assertTrue(method_exists($grade_item, 'toggle_locking'));\r
+\r
+        $this->assertFalse($grade_item->locked);\r
+        $this->assertEqual(0, $grade_item->toggle_locking());\r
+        $this->assertTrue($grade_item->locked);\r
+        $grade_item->load_final();\r
+        $this->assertFalse($grade_item->grade_grades_final[1]->locked);\r
+        \r
+        $grade_item->locked = false;\r
+        $this->assertEqual(3, $grade_item->toggle_locking(true));\r
+        $this->assertTrue($grade_item->locked);\r
+        $this->assertTrue($grade_item->grade_grades_final[1]->locked);\r
+        $this->assertTrue($grade_item->grade_grades_final[2]->locked);\r
+        $this->assertTrue($grade_item->grade_grades_final[3]->locked);\r
+    }\r
+\r
+    function test_grade_item_toggle_hiding() {\r
+        $grade_item = new grade_item($this->grade_items[0]);\r
+        $this->assertTrue(method_exists($grade_item, 'toggle_hiding'));\r
+\r
+        $this->assertFalse($grade_item->hidden);\r
+        $this->assertEqual(0, $grade_item->toggle_hiding());\r
+        $this->assertTrue($grade_item->hidden);\r
+        $grade_item->load_final();\r
+        $this->assertFalse($grade_item->grade_grades_final[1]->hidden);\r
+        \r
+        $grade_item->hidden = false;\r
+        $this->assertEqual(3, $grade_item->toggle_hiding(true));\r
+        $this->assertTrue($grade_item->hidden);\r
+        $this->assertTrue($grade_item->grade_grades_final[1]->hidden);\r
+        $this->assertTrue($grade_item->grade_grades_final[2]->hidden);\r
+        $this->assertTrue($grade_item->grade_grades_final[3]->hidden);\r
+    } \r
+\r
+    function test_grade_item_generate_final() {\r
+        $grade_item = new grade_item();\r
+        $grade_item->courseid = $this->courseid;\r
+        $grade_item->categoryid = $this->grade_categories[1]->id;\r
+        $grade_item->itemname = 'unittestgradeitem4';\r
+        $grade_item->itemtype = 'mod';\r
+        $grade_item->grademin = 0;\r
+        $grade_item->grademax = 100;\r
+        $grade_item->itemmodule = 'quiz';\r
+        $grade_item->iteminfo = 'Grade item used for unit testing';\r
+\r
+        $grade_item->insert();\r
+\r
+        $grade_grades_raw = new grade_grades_raw();\r
+        $grade_grades_raw->itemid = $grade_item->id;\r
+        $grade_grades_raw->userid = 1;\r
+        $grade_grades_raw->gradevalue = 88;\r
+        $grade_grades_raw->grademax = 110;\r
+        $grade_grades_raw->grademin = 18;\r
+        $grade_grades_raw->insert();\r
+\r
+        $grade_grades_raw = new grade_grades_raw();\r
+        $grade_grades_raw->itemid = $grade_item->id;\r
+        $grade_grades_raw->userid = 2;\r
+        $grade_grades_raw->gradevalue = 68;\r
+        $grade_grades_raw->grademax = 110;\r
+        $grade_grades_raw->grademin = 18;\r
+        $grade_grades_raw->insert();\r
+\r
+        $grade_grades_raw = new grade_grades_raw();\r
+        $grade_grades_raw->itemid = $grade_item->id;\r
+        $grade_grades_raw->userid = 3;\r
+        $grade_grades_raw->gradevalue = 81;\r
+        $grade_grades_raw->grademax = 110;\r
+        $grade_grades_raw->grademin = 18;\r
+        $grade_grades_raw->insert();\r
+\r
+        $grade_item->load_raw();\r
+        $this->assertEqual(3, count($grade_item->grade_grades_raw));\r
+\r
+        $grade_item->generate_final();\r
+        $grade_item->load_final();\r
+        $this->assertEqual(3, count($grade_item->grade_grades_final)); \r
+    }\r
+} \r
+?>\r