]> git.mjollnir.org Git - moodle.git/commitdiff
Managed to remove static calls from the core gradebook classes without removing suppo...
authornicolasconnault <nicolasconnault>
Tue, 13 Nov 2007 09:08:43 +0000 (09:08 +0000)
committernicolasconnault <nicolasconnault>
Tue, 13 Nov 2007 09:08:43 +0000 (09:08 +0000)
lib/grade/grade_category.php
lib/grade/grade_item.php
lib/grade/grade_object.php
lib/grade/simpletest/testgradecategory.php
lib/simpletest/fixtures/gradetest.php

index 815999d10aa516a8bf6ad9e598e5153bbcfe5e72..3984c1b28bf7b3284fad120a57c72af57acd633c 100644 (file)
@@ -170,7 +170,8 @@ class grade_category extends grade_object {
      * @return object grade_category instance or false if none found.
      */
     function fetch($params) {
-        return $this->fetch_helper('grade_categories', 'grade_category', $params);
+        $obj = grade_object::get_instance('grade_category');
+        return $obj->fetch_helper('grade_categories', 'grade_category', $params);
     }
 
     /**
@@ -181,7 +182,8 @@ class grade_category extends grade_object {
      * @return array array of grade_category insatnces or false if none found.
      */
     function fetch_all($params) {
-        return $this->fetch_all_helper('grade_categories', 'grade_category', $params);
+        $obj = grade_object::get_instance('grade_category');
+        return $obj->fetch_all_helper('grade_categories', 'grade_category', $params);
     }
 
     /**
index a0ecfd7e02fccfbec21af291cdc233997964f068..36076cb86ce79a1efc766f1afe985d2e17cc294d 100644 (file)
@@ -310,7 +310,8 @@ class grade_item extends grade_object {
      * @return object grade_item instance or false if none found.
      */
     function fetch($params) {
-        return $this->fetch_helper('grade_items', 'grade_item', $params);
+        $obj = grade_object::get_instance('grade_item');
+        return $obj->fetch_helper('grade_items', 'grade_item', $params);
     }
 
     /**
@@ -321,7 +322,8 @@ class grade_item extends grade_object {
      * @return array array of grade_item insatnces or false if none found.
      */
     function fetch_all($params) {
-        return $this->fetch_all_helper('grade_items', 'grade_item', $params);
+        $obj = grade_object::get_instance('grade_item');
+        return $obj->fetch_all_helper('grade_items', 'grade_item', $params);
     }
 
     /**
index 79b1379c25338b3b0b22551aa1b890fe77160392..bfec6927f6ae14bfc19b60e6b9f67b8a761ee5ae 100644 (file)
@@ -360,20 +360,46 @@ class grade_object {
      * The following function is a helper for making the code more testable. It allows
      * unit tests to mock the objects instantiated and used within method bodies. If no params are given,
      * a static instance is returned.
+     * @param string $class
+     * @param array $params
+     * @param bool $fetch
+     * @param bool $set Whether or not to set the instance instead of getting it
      */
-    function get_instance($class, $params=NULL, $fetch=true) {
+    function get_instance($class, $params=NULL, $fetch=true, $set=false, $object=null) {
+        static $grade_instances = array();  
         $classes = array('grade_item', 'grade_category', 'grade_grade', 'grade_outcome', 'grade_scale');
-        if (!in_array($class, $classes)) {
-            return false;
-        } elseif (is_null($params)) {
-            static $grade_instances = array();  
-            if (!array_key_exists($class, $grade_instances)) {
-                $grade_instances[$class] =& new $class;
+        
+        if ($set) {
+            if (!is_object($object)) {
+                debugging('grade_object::set_instance was given a non-object as parameter!');
+                return false;
+            }
+            
+            if (in_array($class, $classes)) {
+                // Only set the static instance if it isn't already a mock object
+                if (!isset($grade_instances[$class]) || get_class($grade_instances[$class]) != get_class($object)) {
+                    $grade_instances[$class] =& $object;
+                    return true;
+                } else {
+                    return false;
+                }
+            } else {
+                debugging("grade_object::set_instance was given an object that is not supported ($class)!");
+                return false;
             }
-            $instance =& $grade_instances[$class];
-            return $instance;
-        } else { 
-            return new $class($params, $fetch);
+
+        } else {
+            if (!in_array($class, $classes)) {
+                return false;
+            } elseif (is_null($params)) {
+                if (!array_key_exists($class, $grade_instances)) {
+                    $grade_instances[$class] =& new $class;
+                }
+                $instance =& $grade_instances[$class];
+                return $instance;
+            } else { 
+                return new $class($params, $fetch);
+            } 
         }
     }
 }
index d165a2aa24e611e8cacc904864a8dbdda0ca0751..c06b15a976cdd7d690c3145d3c170fdb3d998669 100755 (executable)
@@ -69,10 +69,9 @@ class grade_category_test extends grade_test {
         $grade_category->lib_wrapper = new mock_lib_wrapper();
         $this->assertTrue(method_exists($grade_category, 'fetch'));
         
-        $grade_category->lib_wrapper->expectOnce('get_records_select');
-        $grade_category->lib_wrapper->setReturnValue('get_records_select', array($this->grade_categories[1]));
-
-        $grade_category = $grade_category->fetch(array('id'=>$this->grade_categories[1]->id));
+        $obj = grade_object::get_instance('grade_category');
+        $obj->setReturnValue('fetch', $this->grade_categories[1]);
+        $grade_category = $obj->fetch(array('id'=>$this->grade_categories[1]->id));
         $this->assertEqual($this->grade_categories[1]->id, $grade_category->id);
         $this->assertEqual($this->grade_categories[1]->fullname, $grade_category->fullname);
     }
@@ -82,10 +81,10 @@ class grade_category_test extends grade_test {
         $grade_category->lib_wrapper = new mock_lib_wrapper();
         $this->assertTrue(method_exists($grade_category, 'fetch_all'));
 
-        $grade_category->lib_wrapper->expectOnce('get_records_select');
-        $grade_category->lib_wrapper->setReturnValue('get_records_select', $this->grade_categories);
+        $obj = grade_object::get_instance('grade_category');
+        $obj->setReturnValue('fetch_all', $this->grade_categories);
         
-        $grade_categories = $grade_category->fetch_all(array('courseid'=>$this->courseid));
+        $grade_categories = $obj->fetch_all(array('courseid'=>$this->courseid));
         $this->assertEqual(count($this->grade_categories), count($grade_categories));
     }
 
index 53ad417e2421d55566a7f477f71a33992edf97f6..745ff9a5c2deec4cf0ab146b45b15e3a67939e14 100644 (file)
@@ -46,6 +46,13 @@ Mock::generate('grade_lib_wrapper', 'mock_lib_wrapper');
 Mock::generate('ADODB_' . $CFG->dbtype, 'mock_db');
 Mock::generate('ADORecordSet_' . $CFG->dbtype, 'mock_rs');
 
+// Prepare partial mocks for the static grade object instances
+Mock::generatePartial('grade_category', 'mock_grade_category_partial', array('fetch', 'fetch_all'));
+Mock::generatePartial('grade_item', 'mock_grade_item_partial', array('fetch', 'fetch_all'));
+Mock::generatePartial('grade_grade', 'mock_grade_grade_partial', array('fetch', 'fetch_all'));
+Mock::generatePartial('grade_outcome', 'mock_grade_outcome_partial', array('fetch', 'fetch_all'));
+Mock::generatePartial('grade_scale', 'mock_grade_scale_partial', array('fetch', 'fetch_all'));
+
 /**
  * Here is a brief explanation of the test data set up in these unit tests.
  * category1 => array(category2 => array(grade_item1, grade_item2), category3 => array(grade_item3))
@@ -106,6 +113,11 @@ class grade_test extends UnitTestCase {
         $CFG->disablegradehistory = false;
                $this->real_db = fullclone($db);
         // $this->reset_mocks();
+        grade_object::get_instance('grade_item', null, false, true, new mock_grade_item_partial($this));
+        grade_object::get_instance('grade_category', null, false, true, new mock_grade_category_partial($this));
+        grade_object::get_instance('grade_grade', null, false, true, new mock_grade_grade_partial($this));
+        grade_object::get_instance('grade_outcome', null, false, true, new mock_grade_outcome_partial($this));
+        grade_object::get_instance('grade_scale', null, false, true, new mock_grade_scale_partial($this)); 
     }
 
     /**