]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-9506
authornicolasconnault <nicolasconnault>
Thu, 10 May 2007 08:08:43 +0000 (08:08 +0000)
committernicolasconnault <nicolasconnault>
Thu, 10 May 2007 08:08:43 +0000 (08:08 +0000)
grade_grades_raw
    added grade_item object
    added load_grade_item()
    added call to grade_item->flag_for_update() when object is inserted, deleted or updated
grade_grades_final
    added grade_item object
    added load_grade_item()
grade_grades_text
    added grade_item object
    added load_grade_item()
grade_item
    added qualifies_for_update()
    added call to grade_category->flag_for_update() when object is inserted, deleted or updated (only when qualifies_for_update() is true)

However since I have made this last set of changes, the unit tests are performing extremely slow, and several of them fail. I suspect that there is a serious performance issue involved in using objects too heavily, instead of performing more SQL queries, especially when updates are concerned. Often a complete object is SELECTed before it is amended in an object form then UPDATEd.

In the next iteration I will look at this seriously, and put together some tests with thousands of users and many grade_items, to see how well the API responds.

lib/grade/grade_category.php
lib/grade/grade_grades_final.php
lib/grade/grade_grades_raw.php
lib/grade/grade_grades_text.php
lib/grade/grade_item.php
lib/simpletest/grade/simpletest/testgradecategory.php
lib/simpletest/grade/simpletest/testgradefinal.php
lib/simpletest/grade/simpletest/testgradeitem.php
lib/simpletest/grade/simpletest/testgraderaw.php
lib/simpletest/grade/simpletest/testgradetext.php
lib/simpletest/testgradelib.php

index 3036ad2085218af3afbe7c6046bc8592691536b7..63064ab8ada99ee206e6567ba44bbf9819639bfe 100644 (file)
@@ -185,6 +185,45 @@ class grade_category extends grade_object {
         }
     }
 
+    /**
+     * In addition to update() as defined in grade_object, call flag_for_update of parent categories, if applicable.
+     */
+    function update() { 
+        $qualifies = $this->qualifies_for_update();
+
+        $result = parent::update();
+       
+       /**
+        // Notify parent category of need to update.
+        if ($result && $qualifies) {
+            $this->load_parent_category();
+            if (!empty($this->parent_category)) {
+                if (!$this->parent_category->flag_for_update()) {
+                    return false;
+                }
+            }
+        } 
+*/
+        return $result;
+    }
+    
+    /**
+     * If parent::delete() is successful, send flag_for_update message to parent category.
+     * @return boolean Success or failure.
+     */
+    function delete() {
+        $result = parent::delete();
+        
+        if ($result) {
+            $this->load_parent_category();
+            if (!empty($this->parent_category)) {
+                $result = $result && $this->parent_category->flag_for_update();
+            }
+        }
+
+        return $result;
+    }
+    
     /**
      * In addition to the normal insert() defined in grade_object, this method sets the depth
      * and path for this object, and update the record accordingly. The reason why this must
@@ -217,9 +256,43 @@ class grade_category extends grade_object {
             
             $this->grade_item = $grade_item;
         }
-
+  /**      
+        // Notify parent category of need to update.
+        if ($result) {
+            $this->load_parent_category();
+            if (!empty($this->parent_category)) {
+                if (!$this->parent_category->flag_for_update()) {
+                    return false;
+                }
+            }
+        } 
+*/
         return $result;
     }
+    
+    /**
+     * Compares the values held by this object with those of the matching record in DB, and returns
+     * whether or not these differences are sufficient to justify an update of all parent objects.
+     * This assumes that this object has an id number and a matching record in DB. If not, it will return false.
+     * @return boolean
+     */
+    function qualifies_for_update() {
+        if (empty($this->id)) {
+            return false;
+        }
+
+        $db_item = new grade_category(array('id' => $this->id));
+        
+        $aggregationdiff = $db_item->aggregation != $this->aggregation;
+        $keephighdiff = $db_item->keephigh != $this->keephigh;
+        $droplowdiff = $db_item->droplow != $this->droplow;
+
+        if ($aggregationdiff || $keephighdiff || $droplowdiff) {
+            return true;
+        } else {
+            return false;
+        }
+    }
 
     /**
      * Sets this category's and its parent's grade_item.needsupdate to true.
@@ -231,9 +304,18 @@ class grade_category extends grade_object {
      */
     function flag_for_update() {
         $result = true;
-
+        
         $this->load_grade_item();
+
+        if (empty($this->grade_item)) {
+            die("Associated grade_item object does not exist for this grade_category!" . print_object($this)); 
+            // TODO Send error message, this is a critical error: each category MUST have a matching grade_item object
+        }
+
         $this->grade_item->needsupdate = true;
+        
+        $result = $result && $this->grade_item->update();
+
         $this->load_parent_category();
         if (!empty($this->parent_category)) {
             $result = $result && $this->parent_category->flag_for_update();
@@ -522,10 +604,12 @@ class grade_category extends grade_object {
      * @return object Grade_item
      */
     function load_grade_item() {
-        $params = get_record('grade_items', 'categoryid', $this->id, 'itemtype', 'category');
+        $grade_items = get_records_select('grade_items', "iteminstance = $this->id AND itemtype = 'category'", null, '*', 0, 1);
+
+        $params = current($grade_items);
         $this->grade_item = new grade_item($params);
         
-        // If the associated grade_item isn't yet created, do it now
+        // If the associated grade_item isn't yet created, do it now. But first try loading it, in case it exists in DB.
         if (empty($this->grade_item->id)) {
             $this->grade_item->iteminstance = $this->id;
             $this->grade_item->itemtype = 'category';
index 16a57394017e410d59e9a15fbc8fa13bed60f758..18221ce1e428b04f5a9e170fbb8d01f9ed1a8990 100644 (file)
@@ -43,6 +43,12 @@ class grade_grades_final extends grade_object {
      * @var int $itemid
      */
     var $itemid;
+
+    /**
+     * The grade_item object referenced by $this->itemid.
+     * @var object $grade_item
+     */
+    var $grade_item;
     
     /**
      * The id of the user this final grade belongs to.
@@ -106,6 +112,17 @@ class grade_grades_final extends grade_object {
         } 
     }
 
+    /**
+     * Loads the grade_item object referenced by $this->itemid and saves it as $this->grade_item for easy access.
+     * @return object grade_item.
+     */
+    function load_grade_item() {
+        if (empty($this->grade_item) && !empty($this->itemid)) {
+            $this->grade_item = grade_item::fetch('id', $this->itemid);
+        }
+        return $this->grade_item;
+    }
+
     /**
      * Finds and returns a grade_grades_final object based on 1-3 field values.
      *
index 4de893e3d24773336afc04d7b33048c08a86c8ff..0e4e298b243f23d1aeb47ead1c290d71e98cc6fc 100644 (file)
@@ -44,6 +44,12 @@ class grade_grades_raw extends grade_object {
      * @var int $itemid
      */
     var $itemid;
+
+    /**
+     * The grade_item object referenced by $this->itemid.
+     * @var object $grade_item
+     */
+    var $grade_item;
     
     /**
      * The id of the user this raw grade belongs to.
@@ -124,8 +130,20 @@ class grade_grades_raw extends grade_object {
      */
     function load_text() {
         if (empty($this->grade_grades_text)) {
-            return $this->grade_grades_text = grade_grades_text::fetch('itemid', $this->itemid, 'userid', $this->userid);
+            $this->grade_grades_text = grade_grades_text::fetch('itemid', $this->itemid, 'userid', $this->userid);
         } 
+        return $this->grade_grades_text;
+    }
+
+    /**
+     * Loads the grade_item object referenced by $this->itemid and saves it as $this->grade_item for easy access.
+     * @return object grade_item.
+     */
+    function load_grade_item() {
+        if (empty($this->grade_item) && !empty($this->itemid)) {
+            $this->grade_item = grade_item::fetch('id', $this->itemid);
+        }
+        return $this->grade_item;
     }
 
     /**
@@ -193,7 +211,8 @@ class grade_grades_raw extends grade_object {
 
     /**
      * In addition to the normal updating set up in grade_object, this object also records
-     * its pre-update value and its new value in the grade_history table.
+     * its pre-update value and its new value in the grade_history table. The grade_item
+     * object is also flagged for update.
      *
      * @param float $newgrade The new gradevalue of this object
      * @param string $howmodified What caused the modification? manual/module/import/cron...
@@ -225,7 +244,12 @@ class grade_grades_raw extends grade_object {
         if ($result) {
             // TODO Handle history recording error, such as displaying a notice, but still return true
             grade_history::insert_change($this, $oldgrade, $howmodified, $note);
-            return true;
+
+            // Notify parent grade_item of need to update
+            $this->load_grade_item();
+            $result = $result && $this->grade_item->flag_for_update();
+
+            return $result;
         } else {
             return false;
         } 
@@ -244,8 +268,27 @@ class grade_grades_raw extends grade_object {
             $this->grademax = count ($this->scale->scale_items);
             $this->grademin = 0;
         }
+        
+        $result = parent::insert();
+
+        // Notify parent grade_item of need to update
+        $this->load_grade_item();
+        $result = $result && $this->grade_item->flag_for_update();
+
+        return $result;
+    }
 
-        return parent::insert();
+    /**
+     * If parent::delete() is successful, send flag_for_update message to parent grade_item.
+     * @return boolean Success or failure.
+     */
+    function delete() {
+        $result = parent::delete();
+        if ($result) {
+            $this->load_grade_item();
+            return $this->grade_item->flag_for_update();
+        }
+        return $result;
     }
 }
 
index c28941b2c2a06eb0b403d545bce5a1e20936babe..0f215264e193845b686084a56a5112798d5fba14 100644 (file)
@@ -48,6 +48,12 @@ class grade_grades_text extends grade_object {
      */
     var $itemid;
 
+    /**
+     * The grade_item object referenced by $this->itemid.
+     * @var object $grade_item
+     */
+    var $grade_item;
+
     /**
      * The user.id this text refers to.
      * @var int $userid
@@ -112,5 +118,16 @@ class grade_grades_text extends grade_object {
             return false;
         }
     }
+
+    /**
+     * Loads the grade_item object referenced by $this->itemid and saves it as $this->grade_item for easy access.
+     * @return object grade_item.
+     */
+    function load_grade_item() {
+        if (empty($this->grade_item) && !empty($this->itemid)) {
+            $this->grade_item = grade_item::fetch('id', $this->itemid);
+        }
+        return $this->grade_item;
+    }
 }
 ?>
index 7fd2fef4ba5a161b36a04a6e7648c76ae0efd63d..6955db9734491c8d71ca3e29de7b4a97e996f34e 100644 (file)
@@ -55,7 +55,7 @@ class grade_item extends grade_object {
     var $categoryid;
     
     /**
-     * The grade_category object referenced by $this->categoryid.
+     * The grade_category object referenced by $this->categoryid or $this->iteminstance (itemtype must be == 'category' in that case).
      * @var object $category 
      */
     var $category;
@@ -237,6 +237,64 @@ class grade_item extends grade_object {
         } 
         return $this->outcome;
     }
+    
+    /**
+     * Loads all the grade_grades_raw objects for this grade_item from the DB into grade_item::$grade_grades_raw array.
+     * @return array grade_grades_raw objects
+     */      
+    function load_raw() {
+        $grade_raw_array = get_records('grade_grades_raw', 'itemid', $this->id);
+
+        if (empty($grade_raw_array)) {
+            return null;
+        }
+
+        foreach ($grade_raw_array as $r) {
+            $this->grade_grades_raw[$r->userid] = new grade_grades_raw($r);
+        }
+        return $this->grade_grades_raw;
+    }
+
+    /**
+     * Loads all the grade_grades_final objects for this grade_item from the DB into grade_item::$grade_grades_final array.
+     * @return array grade_grades_final objects
+     */      
+    function load_final() {
+        $grade_final_array = get_records('grade_grades_final', 'itemid', $this->id);
+        
+        if (empty($grade_final_array)) {
+            $this->generate_final();
+            $grade_final_array = get_records('grade_grades_final', 'itemid', $this->id);
+        }
+        
+        if (empty($grade_final_array)) {
+            return false;
+        }
+
+        foreach ($grade_final_array as $f) {
+            $this->grade_grades_final[$f->userid] = new grade_grades_final($f);
+        }
+        return $this->grade_grades_final;
+    }
+
+    /**
+    * Returns the grade_category object this grade_item belongs to (if any).
+    * This category object may be the parent (referenced by categoryid) or the associated category 
+    * (referenced by iteminstance).
+    * 
+    * @return mixed grade_category object if applicable, NULL otherwise
+    */
+    function get_category() {
+        $category = null;
+        
+        if (!empty($this->categoryid)) {
+            $category = grade_category::fetch('id', $this->categoryid);
+        } elseif (!empty($this->iteminstance) && $this->itemtype == 'category') {
+            $category = grade_category::fetch('id', $this->iteminstance);
+        }
+        
+        return $category;
+    }
 
     /**
      * In addition to update() as defined in grade_object, handle the grade_outcome and grade_scale objects.
@@ -249,8 +307,50 @@ class grade_item extends grade_object {
         if (!empty($this->scale->id)) {
             $this->scaleid = $this->scale->id;
         }
+        
+        $qualifies = $this->qualifies_for_update();
 
-        return parent::update();
+        $result = parent::update();
+        
+        if ($result && $qualifies) {
+            $category = $this->get_category();
+            
+            if (!empty($category)) {
+                $result = $result && $category->flag_for_update();
+            }
+        }
+
+        return $result;
+    }
+
+    /**
+     * Compares the values held by this object with those of the matching record in DB, and returns
+     * whether or not these differences are sufficient to justify an update of all parent objects.
+     * This assumes that this object has an id number and a matching record in DB. If not, it will return false.
+     * @return boolean
+     */
+    function qualifies_for_update() {
+        if (empty($this->id)) {
+            return false;
+        }
+
+        $db_item = new grade_item(array('id' => $this->id));
+        
+        $gradetypediff = $db_item->gradetype != $this->gradetype;
+        $grademaxdiff = $db_item->grademax != $this->grademax;
+        $grademindiff = $db_item->grademin != $this->grademin;
+        $scaleiddiff = $db_item->scaleid != $this->scaleid;
+        $outcomeiddiff = $db_item->outcomeid != $this->outcomeid;
+        $multfactordiff = $db_item->multfactor != $this->multfactor;
+        $plusfactordiff = $db_item->plusfactor != $this->plusfactor;
+        $needsupdatediff = $db_item->needsupdate != $this->needsupdate;
+
+        if ($gradetypediff || $grademaxdiff || $grademindiff || $scaleiddiff || $outcomeiddiff ||
+            $multfactordiff || $plusfactordiff || $needsupdatediff) {
+            return true;
+        } else {
+            return false;
+        }
     }
 
     /**
@@ -281,7 +381,42 @@ class grade_item extends grade_object {
             return false;
         }
     }
+
+    /**
+     * If parent::delete() is successful, send flag_for_update message to parent category.
+     * @return boolean Success or failure.
+     */
+    function delete() {
+        $result = parent::delete();
+        if ($result) {
+            $category = $this->get_category();
+            if (!empty($category)) {
+                return $category->flag_for_update();
+            }
+        }
+        return $result;
+    }
     
+    /**
+     * In addition to perform parent::insert(), this calls the grade_item's category's (if applicable) flag_for_update() method.
+     * @return int ID of the new grade_item record.
+     */
+    function insert() {
+        $result = parent::insert();
+
+        // Notify parent category of need to update. Note that a grade_item may not have a categoryid.
+        if ($result) {
+            $category = $this->get_category();
+            if (!empty($category)) {
+                if (!$category->flag_for_update()) {
+                    return false;
+                }
+            }
+        }
+
+        return $result;
+    }
+
     /**
      * Returns the raw values for this grade item (as imported by module or other source).
      * @param int $userid Optional: to retrieve a single raw grade
@@ -302,23 +437,6 @@ class grade_item extends grade_object {
         return $grade_raw_array;
     }
 
-    /**
-     * Loads all the grade_grades_raw objects for this grade_item from the DB into grade_item::$grade_grades_raw array.
-     * @return array grade_grades_raw objects
-     */      
-    function load_raw() {
-        $grade_raw_array = get_records('grade_grades_raw', 'itemid', $this->id);
-
-        if (empty($grade_raw_array)) {
-            return null;
-        }
-
-        foreach ($grade_raw_array as $r) {
-            $this->grade_grades_raw[$r->userid] = new grade_grades_raw($r);
-        }
-        return $this->grade_grades_raw;
-    }
-
     /**
      * Returns the final values for this grade item (as imported by module or other source).
      * @param int $userid Optional: to retrieve a single final grade
@@ -339,28 +457,6 @@ class grade_item extends grade_object {
         return $grade_final_array;
     }
 
-    /**
-     * Loads all the grade_grades_final objects for this grade_item from the DB into grade_item::$grade_grades_final array.
-     * @return array grade_grades_final objects
-     */      
-    function load_final() {
-        $grade_final_array = get_records('grade_grades_final', 'itemid', $this->id);
-        
-        if (empty($grade_final_array)) {
-            $this->generate_final();
-            $grade_final_array = get_records('grade_grades_final', 'itemid', $this->id);
-        }
-        
-        if (empty($grade_final_array)) {
-            return false;
-        }
-
-        foreach ($grade_final_array as $f) {
-            $this->grade_grades_final[$f->userid] = new grade_grades_final($f);
-        }
-        return $this->grade_grades_final;
-    }
-
     /**
      * Once the raw_grades are imported or entered, this method uses the grade_item's calculation and rules to 
      * generate final grade entries in the DB.
@@ -445,18 +541,6 @@ class grade_item extends grade_object {
         }
     }
     
-    /**
-    * Returns the grade_category object this grade_item belongs to (if any) and sets $this->category.
-    * 
-    * @return mixed grade_category object if applicable, NULL otherwise
-    */
-    function load_category() {
-        if (empty($this->category) && !empty($this->categoryid)) {
-            $this->category = grade_category::fetch('id', $this->categoryid);
-        }
-        return $this->category;
-    }
-
     /**
      * Returns the locked state of this grade_item (if the grade_item is locked OR no specific
      * $userid is given) or the locked state of a specific grade within this item if a specific
@@ -678,9 +762,10 @@ class grade_item extends grade_object {
         $result = true;
 
         $this->needsupdate = true;
-        $this->load_parent_category();
-        if (!empty($this->parent_category)) {
-            $result = $result && $this->parent_category->flag_for_update();
+        $category = $this->get_category();
+
+        if (!empty($category)) {
+            $result = $result && $category->flag_for_update();
         }
 
         return $result;
index 2c44cdab1739674b9f11f65436f3956e7318f6a2..3d3a176813bb4a7e046c6e32469b001740eb6e54 100755 (executable)
@@ -40,7 +40,7 @@ class grade_category_test extends gradelib_test {
         $params = new stdClass();
 
         $params->courseid = $this->courseid;
-        $params->fullname = 'unittestcategory8';
+        $params->fullname = 'unittestcategory4';
 
         $grade_category = new grade_category($params, false);
         $grade_category->insert();
@@ -56,6 +56,7 @@ class grade_category_test extends gradelib_test {
         $params->fullname = 'unittestcategory5';
         $grade_category = new grade_category($params, false);
         $grade_category->insert();
+        
         $this->assertEqual(2, $grade_category->depth);
         $this->assertEqual("$parentpath/$grade_category->id", $grade_category->path); 
         $parentpath = $grade_category->path;
@@ -73,7 +74,7 @@ class grade_category_test extends gradelib_test {
         $grade_category = new grade_category();
         $this->assertTrue(method_exists($grade_category, 'insert'));
         
-        $grade_category->fullname    = 'unittestcategory3';
+        $grade_category->fullname    = 'unittestcategory4';
         $grade_category->courseid    = $this->courseid;
         $grade_category->aggregation = GRADE_AGGREGATE_MODE;
         $grade_category->keephigh    = 100;
@@ -102,6 +103,7 @@ class grade_category_test extends gradelib_test {
         $this->assertTrue($grade_category->update());
         $fullname = get_field('grade_categories', 'fullname', 'id', $this->grade_categories[0]->id);
         $this->assertEqual($grade_category->fullname, $fullname); 
+
     }
 
     function test_grade_category_delete() {
index ff90461cc5f09cdb1cc63728f27b9af4a772bae0..f4a76faa20f437dfafc3096edcdf46c36a78288e 100644 (file)
@@ -91,5 +91,14 @@ class grade_final_test extends gradelib_test {
         $this->assertEqual($this->grade_grades_final[0]->gradevalue, $grade_grades_final->gradevalue); 
     } 
 
+    function test_grade_grades_final_load_grade_item() {
+        $grade_grades_final = new grade_grades_final($this->grade_grades_final[0]);
+        $this->assertTrue(method_exists($grade_grades_final, 'load_grade_item'));
+        $this->assertNull($grade_grades_final->grade_item);
+        $this->assertTrue($grade_grades_final->itemid);
+        $this->assertNotNull($grade_grades_final->load_grade_item());
+        $this->assertNotNull($grade_grades_final->grade_item);
+        $this->assertEqual($this->grade_items[0]->id, $grade_grades_final->grade_item->id);
+    }
 } 
 ?>
index c9f647635918873a0ca915204113a9a4483a822e..f8019b6f7afc86b46a3c27499d481c7ffbfdd456 100755 (executable)
@@ -22,7 +22,7 @@
 //          http://www.gnu.org/copyleft/gpl.html                         //
 //                                                                       //
 ///////////////////////////////////////////////////////////////////////////
-
+@set_time_limit(0);
 /**
  * Unit tests for grade_item object.
  *
@@ -64,8 +64,17 @@ class grade_item_test extends gradelib_test {
         $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();
+        $this->assertNotNull($category->grade_item);
+        $this->assertFalse($category->grade_item->needsupdate);
+
         $grade_item->insert();
 
+        // Now check the needsupdate variable, it should have been set to true
+        $this->assertTrue($category->grade_item->needsupdate);
+
         $last_grade_item = end($this->grade_items);
 
         $this->assertEqual($grade_item->id, $last_grade_item->id + 1);
@@ -75,7 +84,17 @@ class grade_item_test extends gradelib_test {
         $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);
+        $this->assertFalse($category->grade_item->needsupdate);
+        
         $this->assertTrue($grade_item->delete());
+
+        // Now check the needsupdate variable, it should have been set to true
+        $this->assertTrue($category->grade_item->needsupdate);
+
         $this->assertFalse(get_record('grade_items', 'id', $grade_item->id));
     }
 
@@ -84,11 +103,42 @@ class grade_item_test extends gradelib_test {
         $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);
+        $this->assertFalse($category->grade_item->needsupdate);
+        
         $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
+        $this->assertTrue($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_set_timecreated() {
         $grade_item = new grade_item($this->grade_items[0]);
         $this->assertTrue(method_exists($grade_item, 'set_timecreated'));
@@ -192,12 +242,12 @@ class grade_item_test extends gradelib_test {
         $this->assertEqual($calculation, $new_calculation->calculation);
     }
 
-    function test_grade_item_load_category() {
+    function test_grade_item_get_category() {
         $grade_item = new grade_item($this->grade_items[0]);
-        $this->assertTrue(method_exists($grade_item, 'load_category'));
+        $this->assertTrue(method_exists($grade_item, 'get_category'));
         
-        $grade_item->load_category();
-        $this->assertEqual($this->grade_categories[1]->fullname, $grade_item->category->fullname);
+        $category = $grade_item->get_category();
+        $this->assertEqual($this->grade_categories[1]->fullname, $category->fullname);
     }
 
     /**
index d918915da30e854759d11b9619a8353b16092a9f..0b40bc9da3745e26f6cc78098888765b25d1eb19 100755 (executable)
@@ -60,8 +60,15 @@ class grade_raw_test extends gradelib_test {
         $grade_grades_raw->grademax = 110;
         $grade_grades_raw->grademin = 18;
 
+        // Check the grade_item's needsupdate variable first
+        $grade_grades_raw->load_grade_item(); 
+        $this->assertFalse($grade_grades_raw->grade_item->needsupdate);
+
         $grade_grades_raw->insert();
 
+        // Now check the needsupdate variable, it should have been set to true
+        $this->assertTrue($grade_grades_raw->grade_item->needsupdate);
+        
         $last_grade_grades_raw = end($this->grade_grades_raw);
 
         $this->assertEqual($grade_grades_raw->id, $last_grade_grades_raw->id + 1);
@@ -86,17 +93,31 @@ class grade_raw_test extends gradelib_test {
         $grade_grades_raw = new grade_grades_raw($this->grade_grades_raw[0]);
         $this->assertTrue(method_exists($grade_grades_raw, 'update'));
         
+        // Check the grade_item's needsupdate variable first
+        $grade_grades_raw->load_grade_item();
+        $this->assertFalse($grade_grades_raw->grade_item->needsupdate);
+
         $this->assertTrue($grade_grades_raw->update(89));
         $gradevalue = get_field('grade_grades_raw', 'gradevalue', 'id', $this->grade_grades_raw[0]->id);
         $this->assertEqual($grade_grades_raw->gradevalue, $gradevalue); 
+
+        // Now check the needsupdate variable, it should have been set to true
+        $this->assertTrue($grade_grades_raw->grade_item->needsupdate);
     }
 
     function test_grade_grades_raw_delete() {
         $grade_grades_raw = new grade_grades_raw($this->grade_grades_raw[0]);
         $this->assertTrue(method_exists($grade_grades_raw, 'delete'));
         
+        // Check the grade_item's needsupdate variable first
+        $grade_grades_raw->load_grade_item(); 
+        $this->assertFalse($grade_grades_raw->grade_item->needsupdate);
+
         $this->assertTrue($grade_grades_raw->delete());
         $this->assertFalse(get_record('grade_grades_raw', 'id', $grade_grades_raw->id)); 
+        
+        // Now check the needsupdate variable, it should have been set to true
+        $this->assertTrue($grade_grades_raw->grade_item->needsupdate);
     }
 
     function test_grade_grades_raw_fetch() {
@@ -134,7 +155,23 @@ class grade_raw_test extends gradelib_test {
     }
 
     function test_grade_raw_load_text() {
+        $grade_grades_raw = new grade_grades_raw($this->grade_grades_raw[0]);
+        $this->assertTrue(method_exists($grade_grades_raw, 'load_text'));
+        $this->assertNull($grade_grades_raw->grade_grades_text);
+        $this->assertNotNull($grade_grades_raw->load_text());
+        $this->assertNotNull($grade_grades_raw->grade_grades_text);
+        $this->assertEqual($this->grade_grades_text[0]->id, $grade_grades_raw->grade_grades_text->id); 
+    }
 
+    function test_grade_grades_raw_load_grade_item() {
+        $grade_grades_raw = new grade_grades_raw($this->grade_grades_raw[0]);
+        $this->assertTrue(method_exists($grade_grades_raw, 'load_grade_item'));
+        $this->assertNull($grade_grades_raw->grade_item);
+        $this->assertTrue($grade_grades_raw->itemid);
+        $this->assertNotNull($grade_grades_raw->load_grade_item());
+        $this->assertNotNull($grade_grades_raw->grade_item);
+        $this->assertEqual($this->grade_items[0]->id, $grade_grades_raw->grade_item->id);
     }
+
 } 
 ?>
index e09e30c097c884db0d52742bb5b5cae3df2a7ad7..638082a0d12860bb31af697117c7d073a31ce2be 100755 (executable)
@@ -103,5 +103,15 @@ class grade_text_test extends gradelib_test {
         $this->assertEqual($this->grade_grades_text[0]->id, $grade_grades_text->id);
         $this->assertEqual($this->grade_grades_text[0]->information, $grade_grades_text->information); 
     } 
+
+    function test_grade_grades_text_load_grade_item() {
+        $grade_grades_text = new grade_grades_text($this->grade_grades_text[0]);
+        $this->assertTrue(method_exists($grade_grades_text, 'load_grade_item'));
+        $this->assertNull($grade_grades_text->grade_item);
+        $this->assertTrue($grade_grades_text->itemid);
+        $this->assertNotNull($grade_grades_text->load_grade_item());
+        $this->assertNotNull($grade_grades_text->grade_item);
+        $this->assertEqual($this->grade_items[0]->id, $grade_grades_text->grade_item->id);
+    }
 } 
 ?>
index 67241456b23d86a66aafa801248003ef50eb9ddb..e34d5e60458643d85875974eeef0fd91c77b2784 100644 (file)
@@ -880,7 +880,8 @@ class gradelib_test extends UnitTestCase {
     function load_grade_grades_text() {
         $grade_grades_text = new stdClass();
 
-        $grade_grades_text->gradesid = $this->grade_grades_raw[0]->id;
+        $grade_grades_text->itemid = $this->grade_grades_raw[0]->itemid;
+        $grade_grades_text->userid = $this->grade_grades_raw[0]->userid;
         $grade_grades_text->information = 'Thumbs down';
         $grade_grades_text->informationformat = FORMAT_PLAIN;
         $grade_grades_text->feedback = 'Good, but not good enough..';