MDL-9506 More implementation of gradebook API and more unit tests.

This commit is contained in:
nicolasconnault
2007-04-26 04:39:40 +00:00
parent af307d4623
commit 27fbffb62b
2 changed files with 308 additions and 145 deletions
+250 -139
View File
@@ -150,7 +150,7 @@ function in_object_vars($var, $object)
* Class representing a grade item. It is responsible for handling its DB representation,
* modifying and returning its metadata.
*/
class grade_item
class grade_item extends grade_object
{
/**
* The table name
@@ -162,7 +162,7 @@ class grade_item
* Array of class variables that are not part of the DB table fields
* @var array $nonfields
*/
var $nonfields = array('table', 'nonfields', 'required_fields');
var $nonfields = array('table', 'nonfields', 'required_fields', 'calculation');
/**
* Array of required fields (keys) and their default values (values).
@@ -178,13 +178,7 @@ class grade_item
'hidden' => 0,
'locked' => 0,
'needsupdate' => 0);
/**
* The grade_item PK.
* @var int $id The grade_item PK
*/
var $id;
/**
* The course this grade_item belongs to.
* @var int $courseid
@@ -304,23 +298,17 @@ class grade_item
* @var boolean $needsupdate
*/
var $needsupdate;
/**
* The first time this grade_item was created
* @var int $timecreated
* Calculation string used for this item.
* @var string $calculation
*/
var $timecreated;
/**
* The last time this grade_item was modified
* @var int $timemodified
*/
var $timemodified;
var $calculation;
/**
* Constructor
* @param object $params an object with named parameters for this grade item.
*/
*/
function grade_item($params=NULL)
{
if (!empty($params) && (is_array($params) || is_object($params))) {
@@ -331,55 +319,10 @@ class grade_item
}
$this->set_defaults();
$this->set_calculation();
}
}
/**
* Replaces NULL values with defaults defined in the DB, for required fields.
* This should use the DB table METADATA, but to start with I am hard-coding it.
*
* @return void
*/
function set_defaults()
{
foreach ($this->required_fields as $field => $default) {
if (is_null($this->$field)) {
$this->$field = $default;
}
}
}
/**
* Records this object in the Database, sets its id to the returned value, and returns that value.
* @return int PK ID if successful, false otherwise
*/
function insert()
{
$this->set_defaults();
$this->id = insert_record($this->table, $this, true);
return $this->id;
}
/**
* Updates this object in the Database, based on its object variables. ID must be set.
*
* @return boolean
*/
function update()
{
$this->set_defaults();
return update_record($this->table, $this);
}
/**
* Deletes this object from the database.
*/
function delete()
{
return delete_records($this->table, 'id', $this->id);
}
/**
* Finds and returns a grade_item object based on its ID number.
@@ -429,26 +372,6 @@ class grade_item
}
}
/**
* Uses the variables of this object to retrieve all matching objects from the DB.
* @return array $objects
*/
function get_records_select()
{
$variables = get_object_vars($this);
$wheresql = '';
foreach ($variables as $var => $value) {
if (!empty($value) && !in_array($var, $this->nonfields)) {
$wheresql .= " $var = '$value' AND ";
}
}
// Trim trailing AND
$wheresql = substr($wheresql, 0, strrpos($wheresql, 'AND'));
return get_records_select($this->table, $wheresql);
}
/**
* Returns the raw value for this grade item (as imported by module or other source).
@@ -485,6 +408,23 @@ class grade_item
return $grade_calculation;
}
}
/**
* Sets this item's calculation (creates it) if not yet set, or
* updates it if already set (in the DB). If no calculation is given,
* the method will attempt to retrieve one from the Database, based on
* the variables set in the current object.
* @param string $calculation
* @return boolean
*/
function set_calculation($calculation = null)
{
if (empty($calculation)) {
$this->calculation = new grade_calculation();
} else {
}
}
/**
* Returns the grade_category object this grade_item belongs to (if any).
@@ -502,7 +442,7 @@ class grade_item
}
}
class grade_category
class grade_category extends grade_object
{
/**
* The table name
@@ -525,11 +465,6 @@ class grade_category
'fullname' => null,
'droplow' => 0,
'hidden' => 0);
/**
* The grade_category PK.
* @var int $id The grade_category PK
*/
var $id;
/**
* The course this category belongs to.
@@ -596,51 +531,6 @@ class grade_category
}
}
/**
* Replaces NULL values with defaults defined in the DB, for required fields.
* This should use the DB table METADATA, but to start with I am hard-coding it.
*
* @return void
*/
function set_defaults()
{
foreach ($this->required_fields as $field => $default) {
if (is_null($this->$field)) {
$this->$field = $default;
}
}
}
/**
* Records this object in the Database, sets its id to the returned value, and returns that value.
* @return int PK ID if successful, false otherwise
*/
function insert()
{
$this->set_defaults();
$this->id = insert_record($this->table, $this, true);
return $this->id;
}
/**
* Updates this object in the Database, based on its object variables. ID must be set.
*
* @return boolean
*/
function update()
{
$this->set_defaults();
return update_record($this->table, $this);
}
/**
* Deletes this object from the database.
*/
function delete()
{
return delete_records($this->table, 'id', $this->id);
}
/**
* Finds and returns a grade_category object based on its ID number.
@@ -690,4 +580,225 @@ class grade_category
}
}
}
}
/**
* A calculation string used to compute the value displayed by a grade_item.
* There can be only one grade_calculation per grade_item (one-to-one).
*/
class grade_calculation extends grade_object
{
/**
* The table name
* @var string $table
*/
var $table = 'grade_calculations';
/**
* A reference to the grade_item this calculation belongs to.
* @var int $itemid
*/
var $itemid;
/**
* The string representation of the calculation.
* @var string $calculation
*/
var $calculation;
/**
* The userid of the person who last modified this calculation.
* @var int $usermodified
*/
var $usermodified;
/**
* Constructor.
* @param object $params Object or array of variables=>values to assign to this object upon creation
*/
function grade_calculation($params = null)
{
}
}
/**
* An abstract object that holds methods and attributes common to all grade_* objects defined here.
* @abstract
*/
class grade_object
{
/**
* The table name
* @var string $table
*/
var $table = null;
/**
* Array of class variables that are not part of the DB table fields
* @var array $nonfields
*/
var $nonfields = array('table', 'nonfields', 'required_fields');
/**
* Array of required fields (keys) and their default values (values).
* @var array $required_fields
*/
var $required_fields = array();
/**
* The PK.
* @var int $id
*/
var $id;
/**
* The first time this grade_calculation was created.
* @var int $timecreated
*/
var $timecreated;
/**
* The last time this grade_calculation was modified.
* @var int $timemodified
*/
var $timemodified;
/**
* Finds and returns a grade_object based on its ID number.
*
* @abstract
* @param int $id
* @param boolean $static Unless set to true, this method will also set $this object with the returned values.
* @return object grade_object or false if none found.
*/
function get_by_id($id, $static=false)
{
// Implemented in child objects
}
/**
* Finds and returns a grade_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_object or false if none found.
*/
function get_record($static=false, $field1, $value1, $field2='', $value2='', $field3='', $value3='', $fields="*")
{
// Implemented in child objects
}
/**
* Updates this object in the Database, based on its object variables. ID must be set.
*
* @return boolean
*/
function update()
{
$this->set_defaults();
$result = update_record($this->table, $this);
if ($result) {
$this->timemodified = mktime();
}
return $result;
}
/**
* Deletes this object from the database.
*/
function delete()
{
return delete_records($this->table, 'id', $this->id);
}
/**
* Replaces NULL values with defaults defined in the DB, for required fields.
* This should use the DB table METADATA, but to start with I am hard-coding it.
*
* @return void
*/
function set_defaults()
{
foreach ($this->required_fields as $field => $default) {
if (is_null($this->$field)) {
$this->$field = $default;
}
}
}
/**
* Records this object in the Database, sets its id to the returned value, and returns that value.
* @return int PK ID if successful, false otherwise
*/
function insert()
{
$this->set_defaults();
$this->set_timecreated();
$this->id = insert_record($this->table, $this, true);
return $this->id;
}
/**
* Uses the variables of this object to retrieve all matching objects from the DB.
* @return array $objects
*/
function get_records_select()
{
$variables = get_object_vars($this);
$wheresql = '';
foreach ($variables as $var => $value) {
if (!empty($value) && !in_array($var, $this->nonfields)) {
$wheresql .= " $var = '$value' AND ";
}
}
// Trim trailing AND
$wheresql = substr($wheresql, 0, strrpos($wheresql, 'AND'));
return get_records_select($this->table, $wheresql, 'id');
}
/**
* If this object hasn't yet been saved in DB (empty $id), this method sets the timecreated variable
* to the current or given time. If a value is already set in DB,
* this method will do nothing, unless the $override parameter is set to true. This is to avoid
* unintentional overwrites.
*
* @param int $timestamp Optional timestamp to override current timestamp.
* @param boolean $override Whether to override an existing value for this field in the DB.
* @return boolean True if successful, false otherwise.
*/
function set_timecreated($timestamp = null, $override = false)
{
if (empty($timestamp)) {
$timestamp = mktime();
}
if (empty($this->id)) {
$this->timecreated = $timestamp;
$this->timemodified = $timestamp;
} else {
$current_time = get_field($this->table, 'timecreated', 'id', $this->id);
if (empty($current_time) || $override) {
$this->timecreated = $timestamp;
$this->timemodified = $timestamp;
return $this->timecreated;
} else {
return false;
}
}
return $this->timecreated;
}
}
+58 -6
View File
@@ -54,13 +54,15 @@ class gradelib_test extends UnitTestCase {
function setUp()
{
$grade_category = new stdClass();
$grade_category->fullname = 'unittestcategory1';
$grade_category->courseid = $this->courseid;
$grade_category->aggregation = GRADE_AGGREGATE_MEAN;
$grade_category->keephigh = 100;
$grade_category->droplow = 10;
$grade_category->hidden = 0;
$grade_category->timecreated = mktime();
$grade_category->timemodified = mktime();
if ($grade_category->id = insert_record('grade_categories', $grade_category)) {
$this->grade_categories[] = $grade_category;
@@ -75,7 +77,9 @@ class gradelib_test extends UnitTestCase {
$grade_item->itemmodule = 'quiz';
$grade_item->iteminstance = 1;
$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;
}
@@ -89,6 +93,8 @@ class gradelib_test extends UnitTestCase {
$grade_item->iteminstance = 2;
$grade_item->iteminfo = 'Grade item used for unit testing';
$grade_item->locked = mktime() + 240000;
$grade_item->timecreated = mktime();
$grade_item->timemodified = mktime();
if ($grade_item->id = insert_record('grade_items', $grade_item)) {
$this->grade_items[] = $grade_item;
@@ -103,6 +109,10 @@ class gradelib_test extends UnitTestCase {
$grade_item->itemmodule = 'forum';
$grade_item->iteminstance = 3;
$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;
@@ -122,6 +132,8 @@ class gradelib_test extends UnitTestCase {
foreach ($this->grade_categories as $grade_category) {
delete_records('grade_categories', 'id', $grade_category->id);
}
unset($this->grade_items);
unset($this->grade_categories);
}
function test_grade_get_items()
@@ -143,6 +155,8 @@ class gradelib_test extends UnitTestCase {
$params->itemmodule = 'database';
$params->iteminstance = 4;
$params->iteminfo = 'Grade item used for unit testing';
$params->timecreated = mktime();
$params->timemodified = mktime();
$params->id = grade_create_item($params);
$last_grade_item = end($this->grade_items);
@@ -154,6 +168,8 @@ class gradelib_test extends UnitTestCase {
function test_grade_create_category()
{
$grade_category = new stdClass();
$grade_category->timecreated = mktime();
$grade_category->timemodified = mktime();
$grade_category->id = grade_create_category($this->courseid, 'unittestcategory2', $this->grade_items, GRADE_AGGREGATE_MEAN);
$last_grade_category = end($this->grade_categories);
@@ -191,6 +207,19 @@ class gradelib_test extends UnitTestCase {
$this->assertEqual($params->itemmodule, $grade_item->itemmodule);
$this->assertEqual($params->iteminstance, $grade_item->iteminstance);
$this->assertEqual($params->iteminfo, $grade_item->iteminfo);
$params = $this->grade_items[0];
$grade_item = new grade_item($params);
$this->assertEqual($params->id, $grade_item->id);
$this->assertEqual($params->courseid, $grade_item->courseid);
$this->assertEqual($params->categoryid, $grade_item->categoryid);
$this->assertEqual($params->itemname, $grade_item->itemname);
$this->assertEqual($params->itemtype, $grade_item->itemtype);
$this->assertEqual($params->itemmodule, $grade_item->itemmodule);
$this->assertEqual($params->iteminstance, $grade_item->iteminstance);
$this->assertEqual($params->iteminfo, $grade_item->iteminfo);
}
function test_grade_item_insert()
@@ -225,22 +254,45 @@ class gradelib_test extends UnitTestCase {
$grade_item = new grade_item($this->grade_items[0]);
$grade_item->iteminfo = 'Updated info for this unittest grade_item';
$this->assertTrue($grade_item->update());
$this->assertEqual($grade_item->iteminfo, get_field('grade_items', 'iteminfo', 'id', $grade_item->id));
$iteminfo = get_field('grade_items', 'iteminfo', 'id', $this->grade_items[0]->id);
$this->assertEqual($grade_item->iteminfo, $iteminfo);
}
function test_grade_item_set_timecreated()
{
$grade_item = new grade_item($this->grade_items[0]);
$timestamp = mktime();
$grade_item->set_timecreated();
$this->assertEqual($timestamp, $grade_item->timecreated);
$this->assertEqual($grade_item->timecreated, get_field('grade_items', 'timecreated', 'id', $grade_item->id));
}
function test_grade_item_get_by_id()
{
$grade_item = grade_item::get_by_id($this->grade_items[0]->id, true);
$this->assertEqual($this->grade_items[0]->id, $grade_item->id);
$this->assertEqual($this->grade_items[0]->iteminfo, $grade_item->iteminfo);
}
function test_grade_item_get_record()
{
$grade_item = grade_item::get_record(true, '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::get_record(true, '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_get_records_select()
{
$grade_item = new grade_item();
$grade_item->itemtype = 'mod';
$grade_items = $grade_item->get_records_select();
$this->assertEqual(2, count($grade_items));
$first_grade_item = reset($grade_items);
$this->assertEqual($this->grade_items[0]->id, $first_grade_item->id);
}
function test_grade_item_get_raw()