From 60cf74305d71f82cc3c0246fe4c08da67104dd58 Mon Sep 17 00:00:00 2001 From: nicolasconnault Date: Thu, 26 Apr 2007 08:29:30 +0000 Subject: [PATCH] MDL-9506 More work in the unit tests --- lib/gradelib.php | 736 +------------------------------- lib/simpletest/testgradelib.php | 73 +++- 2 files changed, 59 insertions(+), 750 deletions(-) diff --git a/lib/gradelib.php b/lib/gradelib.php index 1e293fb90e..1cdea49546 100644 --- a/lib/gradelib.php +++ b/lib/gradelib.php @@ -37,6 +37,10 @@ define('GRADE_AGGREGATE_MEDIAN', 1); define('GRADE_AGGREGATE_SUM', 2); define('GRADE_AGGREGATE_MODE', 3); +require_once($CFG->libdir . '/gradebook/grade_category.php'); +require_once($CFG->libdir . '/gradebook/grade_item.php'); +require_once($CFG->libdir . '/gradebook/grade_calculation.php'); + /** * Extracts from the gradebook all the grade items attached to the calling object. * For example, an assignment may want to retrieve all the grade_items for itself, @@ -131,734 +135,4 @@ function grade_is_locked($itemtype, $itemmodule, $iteminstance, $userid=NULL) } } -/** - * Checks whether the given variable name is defined as a variable within the given object. - * @todo Move to moodlelib.php - * @note This will NOT work with stdClass objects, which have no class variables. - * @param string $var The variable name - * @param object $object The object to check - * @return boolean - */ -function in_object_vars($var, $object) -{ - $class_vars = get_class_vars(get_class($object)); - $class_vars = array_keys($class_vars); - return in_array($var, $class_vars); -} - -/** - * Class representing a grade item. It is responsible for handling its DB representation, - * modifying and returning its metadata. - */ -class grade_item extends grade_object -{ - /** - * The table name - * @var string $table - */ - var $table = 'grade_items'; - - /** - * Array of class variables that are not part of the DB table fields - * @var array $nonfields - */ - var $nonfields = array('table', 'nonfields', 'required_fields', 'calculation'); - - /** - * Array of required fields (keys) and their default values (values). - * @var array $required_fields - */ - var $required_fields = array('gradetype' => 0, - 'grademax' => 100.00000, - 'grademin' => 0.00000, - 'gradepass' => 0.00000, - 'multfactor' => 1.00000, - 'plusfactor' => 0.00000, - 'sortorder' => 0, - 'hidden' => 0, - 'locked' => 0, - 'needsupdate' => 0); - - /** - * The course this grade_item belongs to. - * @var int $courseid - */ - var $courseid; - - /** - * The category this grade_item belongs to (optional). - * @var int $categoryid - */ - var $categoryid; - - /** - * The name of this grade_item (pushed by the module). - * @var string $itemname - */ - var $itemname; - - /** - * e.g. 'mod', 'blocks', 'import', 'calculate' etc... - * @var string $itemtype - */ - var $itemtype; - - /** - * The module pushing this grade (e.g. 'forum', 'quiz', 'assignment' etc). - * @var string $itemmodule - */ - var $itemmodule; - - /** - * ID of the item module - * @var int $iteminstance - */ - var $iteminstance; - - /** - * Number of the item in a series of multiple grades pushed by an activity. - * @var int $itemnumber - */ - var $itemnumber; - - /** - * Info and notes about this item. - * @var string $iteminfo - */ - var $iteminfo; - - /** - * The type of grade (0 = value, 1 = scale, 2 = text) - * @var int $gradetype - */ - var $gradetype; - - /** - * Maximum allowable grade. - * @var float $grademax - */ - var $grademax; - - /** - * Minimum allowable grade. - * @var float $grademin - */ - var $grademin; - - /** - * The scale this grade is based on, if applicable. - * @var object $scale - */ - var $scale; - - /** - * The Outcome this grade is associated with, if applicable. - * @var object $outcome - */ - var $outcome; - - /** - * grade required to pass. (grademin < gradepass <= grademax) - * @var float $gradepass - */ - var $gradepass; - - /** - * Multiply all grades by this number. - * @var float $multfactor - */ - var $multfactor; - - /** - * Add this to all grades. - * @var float $plusfactor - */ - var $plusfactor; - - /** - * Sorting order of the columns. - * @var int $sortorder - */ - var $sortorder; - - /** - * Date until which to hide this grade_item. If null, 0 or false, grade_item is not hidden. Hiding prevents viewing. - * @var int $hidden - */ - var $hidden; - - /** - * Date until which to lock this grade_item. If null, 0 or false, grade_item is not locked. Locking prevents updating. - * @var int $locked - */ - var $locked; - - /** - * If set, the whole column will be recalculated, then this flag will be switched off. - * @var boolean $needsupdate - */ - var $needsupdate; - - /** - * Calculation string used for this item. - * @var string $calculation - */ - 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))) { - foreach ($params as $param => $value) { - if (in_object_vars($param, $this)) { - $this->$param = $value; - } - } - $this->set_defaults(); - } - } - - - /** - * Finds and returns a grade_item object based on its ID number. - * - * @param int $id - * @param boolean $static Unless set to true, this method will also set $this object with the returned values. - * @return object grade_item object or false if none found. - */ - function get_by_id($id, $static=false) - { - if ($static) { - return grade_item::get_record(true, 'id', $id); - } else { - return $this->get_record(false, 'id', $id); - } - } - - - /** - * Finds and returns a grade_item 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_item 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_item::$table - if ($grade_item = get_record('grade_items', $field1, $value1, $field2, $value2, $field3, $value3, $fields)) { - if ($static) { - $grade_item = new grade_item($grade_item); - return $grade_item; - } else { - foreach ($grade_item as $param => $value) { - $this->$param = $value; - } - return $this; - } - } else { - return false; - } - } - - - /** - * Returns the raw value for this grade item (as imported by module or other source). - * - * @return mixed grades_Raw object if found, or false. - */ - function get_raw() - { - $grade_raw = get_record('grade_grades_raw', 'itemid', $this->id); - return $grade_raw; - } - - /** - * Returns the final value for this grade item. - * - * @return mixed grades_Final object if found, or false. - */ - function get_final() - { - $grade_final = get_record('grade_grades_final', 'itemid', $this->id); - return $grade_final; - } - - /** - * 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($fetch = false) - { - 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; - } - } - - /** - * 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)) { // 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(); - } - } - } - - /** - * Returns the grade_category object this grade_item belongs to (if any). - * - * @return mixed grade_category object if applicable, NULL otherwise - */ - function get_category() - { - if (!empty($this->categoryid)) { - $grade_category = new grade_category($this->category_id); - return $grade_category; - } else { - return null; - } - } -} - -class grade_category extends grade_object -{ - /** - * The table name - * @var string $table - */ - var $table = 'grade_categories'; - - /** - * 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('aggregation' => 0, - 'keephigh' => 0, - 'fullname' => null, - 'droplow' => 0, - 'hidden' => 0); - - /** - * The course this category belongs to. - * @var int $courseid - */ - var $courseid; - - /** - * The category this category belongs to (optional). - * @var int $categoryid - */ - var $categoryid; - - /** - * The name of this category. - * @var string $fullname - */ - var $fullname; - - /** - * A constant pointing to one of the predefined aggregation strategies (none, mean, median, sum etc) . - * @var int $aggregation - */ - var $aggregation; - - /** - * Keep only the X highest items. - * @var int $keephigh - */ - var $keephigh; - - /** - * Drop the X lowest items. - * @var int $droplow - */ - var $droplow; - - /** - * Date until which to hide this category. If null, 0 or false, category is not hidden. - * @var int $hidden - */ - var $hidden; - - /** - * Array of grade_items or grade_categories nested exactly 1 level below this category - * @var array $children - */ - var $children; - - /** - * Constructor - * @param object $params an object with named parameters for this category. - */ - function grade_category($params=NULL) - { - if (!empty($params) && (is_array($params) || is_object($params))) { - foreach ($params as $param => $value) { - if (in_object_vars($param, $this)) { - $this->$param = $value; - } - } - - $this->set_defaults(); - } - } - - - /** - * Finds and returns a grade_category object based on its ID number. - * - * @param int $id - * @param boolean $static Unless set to true, this method will also set $this object with the returned values. - * @return object grade_category object or false if none found. - */ - function get_by_id($id, $static=false) - { - if ($static) { - return grade_category::get_record(true, 'id', $id); - } else { - return $this->get_record(false, 'id', $id); - } - } - - - /** - * Finds and returns a grade_category 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_category 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_category::$table - if ($grade_category = get_record('grade_categories', $field1, $value1, $field2, $value2, $field3, $value3, $fields)) { - if ($static) { - $grade_category = new grade_category($grade_category); - return $grade_category; - } else { - foreach ($grade_category as $param => $value) { - $this->$param = $value; - } - return $this; - } - } else { - return false; - } - } - -} - -/** - * 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) - { - - } - - - /** - * 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; - } - } - -} - -/** - * 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; - } -} +?> diff --git a/lib/simpletest/testgradelib.php b/lib/simpletest/testgradelib.php index 05c181102f..93233bd5fe 100644 --- a/lib/simpletest/testgradelib.php +++ b/lib/simpletest/testgradelib.php @@ -98,7 +98,10 @@ class gradelib_test extends UnitTestCase { } } } - + + /** + * Load grade_category data into the database, and adds the corresponding objects to this class' variable. + */ function load_grade_categories() { $grade_category = new stdClass(); @@ -117,6 +120,9 @@ class gradelib_test extends UnitTestCase { } } + /** + * Load grade_item data into the database, and adds the corresponding objects to this class' variable. + */ function load_grade_items() { $grade_item = new stdClass(); @@ -168,6 +174,9 @@ class gradelib_test extends UnitTestCase { } } + /** + * Load grade_calculation data into the database, and adds the corresponding objects to this class' variable. + */ function load_grade_calculations() { $grade_calculation = new stdClass(); @@ -182,26 +191,59 @@ class gradelib_test extends UnitTestCase { } } + /** + * Load grade_grades_raw data into the database, and adds the corresponding objects to this class' variable. + */ function load_grade_grades_raw() { + $grade_raw = new stdClass(); + $grade_raw->itemid = $this->grade_items[0]->id; + $grade_raw->userid = $this->userid; + $grade_raw->gradevalue = 78; + $grade_raw->timecreated = mktime(); + $grade_raw->timemodified = mktime(); + if ($grade_raw->id = insert_record('grade_grades_raw', $grade_raw)) { + $this->grade_grades_raw[] = $grade_raw; + } } + /** + * Load grade_grades_final data into the database, and adds the corresponding objects to this class' variable. + */ function load_grade_grades_final() { + $grade_final = new stdClass(); + $grade_final->itemid = $this->grade_items[0]->id; + $grade_final->userid = $this->userid; + $grade_final->gradevalue = 83; + $grade_final->timecreated = mktime(); + $grade_final->timemodified = mktime(); + if ($grade_final->id = insert_record('grade_grades_final', $grade_final)) { + $this->grade_grades_final[] = $grade_final; + } } + /** + * Load grade_grades_text data into the database, and adds the corresponding objects to this class' variable. + */ function load_grade_grades_text() { - + } + /** + * Load grade_outcome data into the database, and adds the corresponding objects to this class' variable. + */ function load_grade_outcomes() { } + /** + * Load grade_history data into the database, and adds the corresponding objects to this class' variable. + */ function load_grade_history() { @@ -210,6 +252,9 @@ class gradelib_test extends UnitTestCase { /** * TESTS BEGIN HERE */ + +// API FUNCTIONS + function test_grade_get_items() { $grade_items = grade_get_items($this->courseid); @@ -260,6 +305,8 @@ class gradelib_test extends UnitTestCase { $this->assertTrue(grade_is_locked($grade_item->itemtype, $grade_item->itemmodule, $grade_item->iteminstance)); } +// GRADE_ITEM OBJECT + function test_grade_item_construct() { $params = new stdClass(); @@ -276,24 +323,7 @@ class gradelib_test extends UnitTestCase { $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); - - $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() @@ -401,6 +431,8 @@ class gradelib_test extends UnitTestCase { } +// GRADE_CATEGORY OBJECT + function test_grade_category_construct() { @@ -430,6 +462,9 @@ class gradelib_test extends UnitTestCase { { } + +// GRADE_CALCULATION OBJECT + } ?> -- 2.39.5