MDL-9506 Refactored gradelib.php: an abstract class (php5 in mind) holds data and methods common

to all grade_* objects. The unit test file has also been refactored to improve clarity.
This commit is contained in:
nicolasconnault
2007-04-26 07:14:12 +00:00
parent 85414e846a
commit f9f4a93b4e
2 changed files with 178 additions and 32 deletions
+70 -10
View File
@@ -317,9 +317,7 @@ class grade_item extends grade_object
$this->$param = $value;
}
}
$this->set_defaults();
$this->set_calculation();
}
}
@@ -397,15 +395,24 @@ class grade_item extends grade_object
/**
* Returns this object's calculation.
* @param boolean $fetch Whether to fetch the value from the DB or not (false == just use the object's value)
* @return mixed $calculation A string if found, false otherwise.
*/
function get_calculation()
function get_calculation($fetch = false)
{
$grade_calculation = get_record('grade_calculations', 'itemid', $this->id);
if ($grade_calculation) {
return $grade_calculation->calculation;
} else {
if (!$fetch) {
return $this->calculation;
}
$grade_calculation = grade_calculation::get_record(true, 'itemid', $this->id);
if (empty($grade_calculation)) { // There is no calculation in DB
return false;
} elseif ($grade_calculation->calculation != $this->calculation->calculation) { // The object's calculation is not in sync with the DB (new value??)
$this->calculation = $grade_calculation;
return $grade_calculation;
} else { // The object's calculation is already in sync with the database
return $this->calculation;
}
}
@@ -419,10 +426,32 @@ class grade_item extends grade_object
*/
function set_calculation($calculation = null)
{
if (empty($calculation)) {
$this->calculation = new grade_calculation();
} else {
if (empty($calculation)) { // We are setting this item object's calculation variable from the DB
$grade_calculation = $this->get_calculation(true);
if (empty($grade_calculation)) {
return false;
} else {
$this->calculation = $grade_calculation;
}
} else { // We are updating or creating the calculation entry in the DB
$grade_calculation = $this->get_calculation();
if (empty($grade_calculation)) { // Creating
$grade_calculation = new grade_calculation();
$grade_calculation->calculation = $calculation;
$grade_calculation->itemid = $this->id;
if ($grade_calculation->insert()) {
$this->calculation = $grade_calculation;
return true;
} else {
return false;
}
} else { // Updating
$grade_calculation->calculation = $calculation;
$this->calculation = $grade_calculation;
return $grade_calculation->update();
}
}
}
@@ -621,6 +650,37 @@ class grade_calculation extends grade_object
}
/**
* Finds and returns a grade_calculation object based on 1-3 field values.
*
* @param boolean $static Unless set to true, this method will also set $this object with the returned values.
* @param string $field1
* @param string $value1
* @param string $field2
* @param string $value2
* @param string $field3
* @param string $value3
* @param string $fields
* @return object grade_calculation object or false if none found.
*/
function get_record($static=false, $field1, $value1, $field2='', $value2='', $field3='', $value3='', $fields="*")
{
// In Moodle 2.0 (PHP5) we can replace table names with the static class var grade_calculation::$table
if ($grade_calculation = get_record('grade_calculations', $field1, $value1, $field2, $value2, $field3, $value3, $fields)) {
if ($static) {
$grade_calculation = new grade_calculation($grade_calculation);
return $grade_calculation;
} else {
foreach ($grade_calculation as $param => $value) {
$this->$param = $value;
}
return $this;
}
} else {
return false;
}
}
}
+108 -22
View File
@@ -40,10 +40,33 @@ require_once($CFG->libdir . '/gradelib.php');
require_once($CFG->libdir . '/dmllib.php');
class gradelib_test extends UnitTestCase {
/**
* Each database table receives a number of test entries. These are saved as
* arrays of stcClass objects available to this class. This means that
* every test has access to these test data. The order of the following array is
* crucial, because of the interrelationships between objects.
*/
var $tables = array('grade_categories',
'grade_items',
'grade_calculations',
'grade_grades_raw',
'grade_grades_final',
'grade_grades_text',
'grade_outcomes',
'grade_history');
var $grade_items = array();
var $grade_categories = array();
var $grade_calculations = array();
var $grade_grades_raw = array();
var $grade_grades_final = array();
var $grade_grades_text = array();
var $grade_outcomes = array();
var $grade_history = array();
var $courseid = 1;
var $userid = 1;
/**
* Create temporary entries in the database for these tests.
@@ -52,6 +75,31 @@ class gradelib_test extends UnitTestCase {
* data have to be artificially inseminated (:-) in the DB.
*/
function setUp()
{
foreach ($this->tables as $table) {
$function = "load_$table";
$this->$function();
}
}
/**
* Delete temporary entries from the database
*/
function tearDown()
{
foreach ($this->tables as $table) {
foreach ($this->$table as $object) {
delete_records($table, 'id', $object->id);
}
// If data has been entered in DB for any table, unset corresponding array
if (count($this->$table) > 0) {
unset ($this->$table);
}
}
}
function load_grade_categories()
{
$grade_category = new stdClass();
@@ -66,12 +114,15 @@ class gradelib_test extends UnitTestCase {
if ($grade_category->id = insert_record('grade_categories', $grade_category)) {
$this->grade_categories[] = $grade_category;
}
}
}
function load_grade_items()
{
$grade_item = new stdClass();
$grade_item->courseid = $this->courseid;
$grade_item->categoryid = $grade_category->id;
$grade_item->categoryid = $this->grade_categories[0]->id;
$grade_item->itemname = 'unittestgradeitem1';
$grade_item->itemtype = 'mod';
$grade_item->itemmodule = 'quiz';
@@ -79,7 +130,7 @@ class gradelib_test extends UnitTestCase {
$grade_item->iteminfo = 'Grade item used for unit testing';
$grade_item->timecreated = mktime();
$grade_item->timemodified = mktime();
if ($grade_item->id = insert_record('grade_items', $grade_item)) {
$this->grade_items[] = $grade_item;
}
@@ -103,7 +154,7 @@ class gradelib_test extends UnitTestCase {
$grade_item = new stdClass();
$grade_item->courseid = $this->courseid;
$grade_item->categoryid = $grade_category->id;
$grade_item->categoryid = $this->grade_categories[0]->id;
$grade_item->itemname = 'unittestgradeitem3';
$grade_item->itemtype = 'mod';
$grade_item->itemmodule = 'forum';
@@ -111,31 +162,54 @@ class gradelib_test extends UnitTestCase {
$grade_item->iteminfo = 'Grade item used for unit testing';
$grade_item->timecreated = mktime();
$grade_item->timemodified = mktime();
// $grade_item->set_calculation('MEAN([unittestgradeitem1],[unittestgradeitem2])');
if ($grade_item->id = insert_record('grade_items', $grade_item)) {
$this->grade_items[] = $grade_item;
}
}
}
/**
* Delete temporary entries from the database
*/
function tearDown()
function load_grade_calculations()
{
foreach ($this->grade_items as $grade_item) {
delete_records('grade_items', 'id', $grade_item->id);
}
foreach ($this->grade_categories as $grade_category) {
delete_records('grade_categories', 'id', $grade_category->id);
}
unset($this->grade_items);
unset($this->grade_categories);
$grade_calculation = new stdClass();
$grade_calculation->itemid = $this->grade_items[0]->id;
$grade_calculation->calculation = 'MEAN([unittestgradeitem2], [unittestgradeitem3])';
$grade_calculation->timecreated = mktime();
$grade_calculation->timemodified = mktime();
if ($grade_calculation->id = insert_record('grade_calculations', $grade_calculation)) {
$this->grade_calculations[] = $grade_calculation;
$this->grade_items[0]->calculation = $grade_calculation;
}
}
function load_grade_grades_raw()
{
}
function load_grade_grades_final()
{
}
function load_grade_grades_text()
{
}
function load_grade_outcomes()
{
}
function load_grade_history()
{
}
/**
* TESTS BEGIN HERE
*/
function test_grade_get_items()
{
$grade_items = grade_get_items($this->courseid);
@@ -307,7 +381,19 @@ class gradelib_test extends UnitTestCase {
function test_grade_item_get_calculation()
{
$grade_item = new grade_item($this->grade_items[0]);
$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]);
$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()