Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.10.x will end 8 November 2021 (12 months).
  • Bug fixes for security issues in 3.10.x will end 9 May 2022 (18 months).
  • PHP version: minimum PHP 7.2.0 Note: minimum PHP version has increased since Moodle 3.8. PHP 7.3.x and 7.4.x are supported too.

Differences Between: [Versions 310 and 311] [Versions 310 and 400] [Versions 310 and 401] [Versions 310 and 402] [Versions 310 and 403]

   1  <?php
   2  // This file is part of Moodle - http://moodle.org/
   3  //
   4  // Moodle is free software: you can redistribute it and/or modify
   5  // it under the terms of the GNU General Public License as published by
   6  // the Free Software Foundation, either version 3 of the License, or
   7  // (at your option) any later version.
   8  //
   9  // Moodle is distributed in the hope that it will be useful,
  10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  // GNU General Public License for more details.
  13  //
  14  // You should have received a copy of the GNU General Public License
  15  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  16  
  17  /**
  18   * Unit tests for grade/lib.php.
  19   *
  20   * @package   core_grades
  21   * @category  test
  22   * @copyright 2016 Jun Pataleta
  23   * @license   http://www.gnu.org/copyleft/gpl.html GNU Public License
  24   */
  25  
  26  defined('MOODLE_INTERNAL') || die();
  27  
  28  global $CFG;
  29  require_once($CFG->dirroot . '/grade/lib.php');
  30  
  31  /**
  32   * Unit tests for grade/lib.php.
  33   *
  34   * @package   core_grades
  35   * @category  test
  36   * @copyright 2016 Jun Pataleta <jun@moodle.com>
  37   * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  38   */
  39  class core_grade_lib_test extends advanced_testcase {
  40  
  41      /**
  42       * Test can_output_item.
  43       */
  44      public function test_can_output_item() {
  45          $this->resetAfterTest();
  46  
  47          $generator = $this->getDataGenerator();
  48  
  49          // Course level grade category.
  50          $course = $generator->create_course();
  51          // Grade tree looks something like:
  52          // - Test course    (Rendered).
  53          $gradetree = grade_category::fetch_course_tree($course->id);
  54          $this->assertTrue(grade_tree::can_output_item($gradetree));
  55  
  56          // Add a grade category with default settings.
  57          $generator->create_grade_category(array('courseid' => $course->id));
  58          // Grade tree now looks something like:
  59          // - Test course n        (Rendered).
  60          // -- Grade category n    (Rendered).
  61          $gradetree = grade_category::fetch_course_tree($course->id);
  62          $this->assertNotEmpty($gradetree['children']);
  63          foreach ($gradetree['children'] as $child) {
  64              $this->assertTrue(grade_tree::can_output_item($child));
  65          }
  66  
  67          // Add a grade category with grade type = None.
  68          $nototalcategory = 'No total category';
  69          $nototalparams = [
  70              'courseid' => $course->id,
  71              'fullname' => $nototalcategory,
  72              'aggregation' => GRADE_AGGREGATE_WEIGHTED_MEAN
  73          ];
  74          $nototal = $generator->create_grade_category($nototalparams);
  75          $catnototal = grade_category::fetch(array('id' => $nototal->id));
  76          // Set the grade type of the grade item associated to the grade category.
  77          $catitemnototal = $catnototal->load_grade_item();
  78          $catitemnototal->gradetype = GRADE_TYPE_NONE;
  79          $catitemnototal->update();
  80  
  81          // Grade tree looks something like:
  82          // - Test course n        (Rendered).
  83          // -- Grade category n    (Rendered).
  84          // -- No total category   (Not rendered).
  85          $gradetree = grade_category::fetch_course_tree($course->id);
  86          foreach ($gradetree['children'] as $child) {
  87              if ($child['object']->fullname == $nototalcategory) {
  88                  $this->assertFalse(grade_tree::can_output_item($child));
  89              } else {
  90                  $this->assertTrue(grade_tree::can_output_item($child));
  91              }
  92          }
  93  
  94          // Add another grade category with default settings under 'No total category'.
  95          $normalinnototalparams = [
  96              'courseid' => $course->id,
  97              'fullname' => 'Normal category in no total category',
  98              'parent' => $nototal->id
  99          ];
 100          $generator->create_grade_category($normalinnototalparams);
 101  
 102          // Grade tree looks something like:
 103          // - Test course n                           (Rendered).
 104          // -- Grade category n                       (Rendered).
 105          // -- No total category                      (Rendered).
 106          // --- Normal category in no total category  (Rendered).
 107          $gradetree = grade_category::fetch_course_tree($course->id);
 108          foreach ($gradetree['children'] as $child) {
 109              // All children are now visible.
 110              $this->assertTrue(grade_tree::can_output_item($child));
 111              if (!empty($child['children'])) {
 112                  foreach ($child['children'] as $grandchild) {
 113                      $this->assertTrue(grade_tree::can_output_item($grandchild));
 114                  }
 115              }
 116          }
 117  
 118          // Add a grade category with grade type = None.
 119          $nototalcategory2 = 'No total category 2';
 120          $nototal2params = [
 121              'courseid' => $course->id,
 122              'fullname' => $nototalcategory2,
 123              'aggregation' => GRADE_AGGREGATE_WEIGHTED_MEAN
 124          ];
 125          $nototal2 = $generator->create_grade_category($nototal2params);
 126          $catnototal2 = grade_category::fetch(array('id' => $nototal2->id));
 127          // Set the grade type of the grade item associated to the grade category.
 128          $catitemnototal2 = $catnototal2->load_grade_item();
 129          $catitemnototal2->gradetype = GRADE_TYPE_NONE;
 130          $catitemnototal2->update();
 131  
 132          // Add a category with no total under 'No total category'.
 133          $nototalinnototalcategory = 'Category with no total in no total category';
 134          $nototalinnototalparams = [
 135              'courseid' => $course->id,
 136              'fullname' => $nototalinnototalcategory,
 137              'aggregation' => GRADE_AGGREGATE_WEIGHTED_MEAN,
 138              'parent' => $nototal2->id
 139          ];
 140          $nototalinnototal = $generator->create_grade_category($nototalinnototalparams);
 141          $catnototalinnototal = grade_category::fetch(array('id' => $nototalinnototal->id));
 142          // Set the grade type of the grade item associated to the grade category.
 143          $catitemnototalinnototal = $catnototalinnototal->load_grade_item();
 144          $catitemnototalinnototal->gradetype = GRADE_TYPE_NONE;
 145          $catitemnototalinnototal->update();
 146  
 147          // Grade tree looks something like:
 148          // - Test course n                                    (Rendered).
 149          // -- Grade category n                                (Rendered).
 150          // -- No total category                               (Rendered).
 151          // --- Normal category in no total category           (Rendered).
 152          // -- No total category 2                             (Not rendered).
 153          // --- Category with no total in no total category    (Not rendered).
 154          $gradetree = grade_category::fetch_course_tree($course->id);
 155          foreach ($gradetree['children'] as $child) {
 156              if ($child['object']->fullname == $nototalcategory2) {
 157                  $this->assertFalse(grade_tree::can_output_item($child));
 158              } else {
 159                  $this->assertTrue(grade_tree::can_output_item($child));
 160              }
 161              if (!empty($child['children'])) {
 162                  foreach ($child['children'] as $grandchild) {
 163                      if ($grandchild['object']->fullname == $nototalinnototalcategory) {
 164                          $this->assertFalse(grade_tree::can_output_item($grandchild));
 165                      } else {
 166                          $this->assertTrue(grade_tree::can_output_item($grandchild));
 167                      }
 168                  }
 169              }
 170          }
 171      }
 172  }