Merge branch 'MDL-38582' of git://github.com/timhunt/moodle
authorEloy Lafuente (stronk7) <stronk7@moodle.org>
Tue, 26 Mar 2013 15:03:37 +0000 (16:03 +0100)
committerEloy Lafuente (stronk7) <stronk7@moodle.org>
Tue, 26 Mar 2013 15:03:37 +0000 (16:03 +0100)
1  2 
lib/testing/generator/data_generator.php
lib/testing/tests/generator_test.php

@@@ -41,6 -41,16 +41,6 @@@ class testing_data_generator 
      protected $groupcount = 0;
      protected $groupingcount = 0;
  
 -    /**
 -     * @var int keep track of how many forum discussions have been created.
 -     */
 -    protected $forumdiscussioncount = 0;
 -
 -    /**
 -     * @var int keep track of how many forum posts have been created.
 -     */
 -    protected $forumpostcount = 0;
 -
      /** @var array list of plugin generators */
      protected $generators = array();
  
@@@ -82,6 -92,8 +82,6 @@@ EOD
          $this->categorycount = 0;
          $this->coursecount = 0;
          $this->scalecount = 0;
 -        $this->forumdiscussioncount = 0;
 -        $this->forumpostcount = 0;
  
          foreach ($this->generators as $generator) {
              $generator->reset();
      }
  
      /**
-      * Return generator for given plugin
-      * @param string $component
-      * @return mixed plugin data generator
+      * Return generator for given plugin or component.
+      * @param string $component the component name, e.g. 'mod_forum' or 'core_question'.
+      * @return component_generator_base or rather an instance of the appropriate subclass.
       */
      public function get_plugin_generator($component) {
          list($type, $plugin) = normalize_component($component);
+         $cleancomponent = $type . '_' . $plugin;
+         if ($cleancomponent != $component) {
+             debugging("Please specify the component you want a generator for as " .
+                     "{$cleancomponent}, not {$component}.", DEBUG_DEVELOPER);
+             $component = $cleancomponent;
+         }
  
-         if ($type !== 'mod' and $type !== 'block') {
-             throw new coding_exception("Plugin type $type does not support generators yet");
+         if (isset($this->generators[$component])) {
+             return $this->generators[$component];
          }
  
-         $dir = get_plugin_directory($type, $plugin);
+         $dir = get_component_directory($component);
+         $lib = $dir . '/tests/generator/lib.php';
+         if (!$dir || !is_readable($lib)) {
+             throw new coding_exception("Component {$component} does not support " .
+                     "generators yet. Missing tests/generator/lib.php.");
+         }
  
-         if (!isset($this->generators[$type.'_'.$plugin])) {
-             $lib = "$dir/tests/generator/lib.php";
-             if (!include_once($lib)) {
-                 throw new coding_exception("Plugin $component does not support data generator, missing tests/generator/lib");
-             }
-             $classname = $type.'_'.$plugin.'_generator';
-             $this->generators[$type.'_'.$plugin] = new $classname($this);
+         include_once($lib);
+         $classname = $component . '_generator';
+         if (!class_exists($classname)) {
+             throw new coding_exception("Component {$component} does not support " .
+                     "data generators yet. Class {$classname} not found.");
          }
  
-         return $this->generators[$type.'_'.$plugin];
+         $this->generators[$component] = new $classname($this);
+         return $this->generators[$component];
      }
  
      /**
       * Create a test course category
       * @param array|stdClass $record
       * @param array $options
 -     * @return stdClass course category record
 +     * @return coursecat course category record
       */
      public function create_category($record=null, array $options=null) {
          global $DB, $CFG;
 -        require_once("$CFG->dirroot/course/lib.php");
 +        require_once("$CFG->libdir/coursecatlib.php");
  
          $this->categorycount++;
          $i = $this->categorycount;
              $record['name'] = 'Course category '.$i;
          }
  
 -        if (!isset($record['idnumber'])) {
 -            $record['idnumber'] = '';
 -        }
 -
          if (!isset($record['description'])) {
              $record['description'] = "Test course category $i\n$this->loremipsum";
          }
  
 -        if (!isset($record['descriptionformat'])) {
 -            $record['descriptionformat'] = FORMAT_MOODLE;
 -        }
 -
 -        if (!isset($record['parent'])) {
 -            $record['parent'] = 0;
 -        }
 -
 -        if (empty($record['parent'])) {
 -            $parent = new stdClass();
 -            $parent->path = '';
 -            $parent->depth = 0;
 -        } else {
 -            $parent = $DB->get_record('course_categories', array('id'=>$record['parent']), '*', MUST_EXIST);
 +        if (!isset($record['idnumber'])) {
 +            $record['idnumber'] = '';
          }
 -        $record['depth'] = $parent->depth+1;
 -
 -        $record['sortorder'] = 0;
 -        $record['timemodified'] = time();
 -        $record['timecreated'] = $record['timemodified'];
  
 -        $catid = $DB->insert_record('course_categories', $record);
 -        $path = $parent->path . '/' . $catid;
 -        $DB->set_field('course_categories', 'path', $path, array('id'=>$catid));
 -        context_coursecat::instance($catid);
 -
 -        fix_course_sortorder();
 -
 -        return $DB->get_record('course_categories', array('id'=>$catid), '*', MUST_EXIST);
 +        return coursecat::create($record);
      }
  
      /**
          return $DB->get_record('scale', array('id'=>$id), '*', MUST_EXIST);
      }
  
+     /**
+      * Helper method which combines $defaults with the values specified in $record.
+      * If $record is an object, it is converted to an array.
+      * Then, for each key that is in $defaults, but not in $record, the value
+      * from $defaults is copied.
+      * @param array $defaults the default value for each field with
+      * @param array|stdClass $record
+      * @return array updated $record.
+      */
+     public function combine_defaults_and_record(array $defaults, $record) {
+         $record = (array) $record;
+         foreach ($defaults as $key => $defaults) {
+             if (!array_key_exists($key, $record)) {
+                 $record[$key] = $defaults;
+             }
+         }
+         return $record;
+     }
      /**
       * Simplified enrolment of user to course using default options.
       *
  
          return true;
      }
 -
 -    /**
 -     * Function to create a dummy discussion.
 -     *
 -     * @param array|stdClass $record
 -     * @return stdClass the discussion object
 -     */
 -    public function create_forum_discussion($record = null) {
 -        global $DB;
 -
 -        // Increment the forum discussion count.
 -        $this->forumdiscussioncount++;
 -
 -        $record = (array) $record;
 -
 -        if (!isset($record['course'])) {
 -            throw new coding_exception('course must be present in phpunit_util::create_forum_discussion() $record');
 -        }
 -
 -        if (!isset($record['forum'])) {
 -            throw new coding_exception('forum must be present in phpunit_util::create_forum_discussion() $record');
 -        }
 -
 -        if (!isset($record['userid'])) {
 -            throw new coding_exception('userid must be present in phpunit_util::create_forum_discussion() $record');
 -        }
 -
 -        if (!isset($record['name'])) {
 -            $record['name'] = "Discussion " . $this->forumdiscussioncount;
 -        }
 -
 -        if (!isset($record['subject'])) {
 -            $record['subject'] = "Subject for discussion " . $this->forumdiscussioncount;
 -        }
 -
 -        if (!isset($record['message'])) {
 -            $record['message'] = html_writer::tag('p', 'Message for discussion ' . $this->forumdiscussioncount);
 -        }
 -
 -        if (!isset($record['messageformat'])) {
 -            $record['messageformat'] = editors_get_preferred_format();
 -        }
 -
 -        if (!isset($record['messagetrust'])) {
 -            $record['messagetrust'] = "";
 -        }
 -
 -        if (!isset($record['assessed'])) {
 -            $record['assessed'] = '1';
 -        }
 -
 -        if (!isset($record['groupid'])) {
 -            $record['groupid'] = "-1";
 -        }
 -
 -        if (!isset($record['timestart'])) {
 -            $record['timestart'] = "0";
 -        }
 -
 -        if (!isset($record['timeend'])) {
 -            $record['timeend'] = "0";
 -        }
 -
 -        if (!isset($record['mailnow'])) {
 -            $record['mailnow'] = "0";
 -        }
 -
 -        $record = (object) $record;
 -
 -        // Add the discussion.
 -        $record->id = forum_add_discussion($record, null, null, $record->userid);
 -
 -        return $record;
 -    }
 -
 -    /**
 -     * Function to create a dummy post.
 -     *
 -     * @param array|stdClass $record
 -     * @return stdClass the post object
 -     */
 -    public function create_forum_post($record = null) {
 -        global $DB;
 -
 -        // Increment the forum post count.
 -        $this->forumpostcount++;
 -
 -        // Variable to store time.
 -        $time = time() + $this->forumpostcount;
 -
 -        $record = (array) $record;
 -
 -        if (!isset($record['discussion'])) {
 -            throw new coding_exception('discussion must be present in phpunit_util::create_forum_post() $record');
 -        }
 -
 -        if (!isset($record['userid'])) {
 -            throw new coding_exception('userid must be present in phpunit_util::create_forum_post() $record');
 -        }
 -
 -        if (!isset($record['parent'])) {
 -            $record['parent'] = 0;
 -        }
 -
 -        if (!isset($record['subject'])) {
 -            $record['subject'] = 'Forum post subject ' . $this->forumpostcount;
 -        }
 -
 -        if (!isset($record['message'])) {
 -            $record['message'] = html_writer::tag('p', 'Forum message post ' . $this->forumpostcount);
 -        }
 -
 -        if (!isset($record['created'])) {
 -            $record['created'] = $time;
 -        }
 -
 -        if (!isset($record['modified'])) {
 -            $record['modified'] = $time;
 -        }
 -
 -        $record = (object) $record;
 -
 -        // Add the post.
 -        $record->id = $DB->insert_record('forum_posts', $record);
 -
 -        // Update the last post.
 -        forum_discussion_update_last_post($record->discussion);
 -
 -        return $record;
 -    }
  }
  
  /**
@@@ -35,6 -35,24 +35,24 @@@ defined('MOODLE_INTERNAL') || die()
   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
   */
  class core_test_generator_testcase extends advanced_testcase {
+     public function test_get_plugin_generator_good_case() {
+         $generator = $this->getDataGenerator()->get_plugin_generator('core_question');
+         $this->assertInstanceOf('core_question_generator', $generator);
+     }
+     public function test_get_plugin_generator_sloppy_name() {
+         $generator = $this->getDataGenerator()->get_plugin_generator('quiz');
+         $this->assertDebuggingCalled('Please specify the component you want a generator for as ' .
+                     'mod_quiz, not quiz.', DEBUG_DEVELOPER);
+         $this->assertInstanceOf('mod_quiz_generator', $generator);
+     }
+     public function test_get_plugin_generator_no_component_dir() {
+         $this->setExpectedException('coding_exception', 'Component core_completion does not support ' .
+                     'generators yet. Missing tests/generator/lib.php.');
+         $generator = $this->getDataGenerator()->get_plugin_generator('core_completion');
+     }
      public function test_create() {
          global $DB;
  
          $this->assertFalse($result);
  
      }
 -
 -    /**
 -     * Test create_forum_discussion.
 -     */
 -    public function test_create_forum_discussion() {
 -        global $DB;
 -
 -        $this->resetAfterTest(true);
 -
 -        // User that will create the forum.
 -        $user = self::getDataGenerator()->create_user();
 -
 -        // Create course to add the forum to.
 -        $course = self::getDataGenerator()->create_course();
 -
 -        // The forum.
 -        $record = new stdClass();
 -        $record->course = $course->id;
 -        $forum = self::getDataGenerator()->create_module('forum', $record);
 -
 -        // Add a few discussions.
 -        $record = array();
 -        $record['course'] = $course->id;
 -        $record['forum'] = $forum->id;
 -        $record['userid'] = $user->id;
 -        self::getDataGenerator()->create_forum_discussion($record);
 -        self::getDataGenerator()->create_forum_discussion($record);
 -        self::getDataGenerator()->create_forum_discussion($record);
 -
 -        // Check the discussions were correctly created.
 -        $this->assertEquals(3, $DB->count_records_select('forum_discussions', 'forum = :forum',
 -                array('forum' => $forum->id)));
 -    }
 -
 -    /**
 -     * Test create_forum_post.
 -     */
 -    public function test_create_forum_post() {
 -        global $DB;
 -
 -        $this->resetAfterTest(true);
 -
 -        // Create a bunch of users
 -        $user1 = self::getDataGenerator()->create_user();
 -        $user2 = self::getDataGenerator()->create_user();
 -        $user3 = self::getDataGenerator()->create_user();
 -        $user4 = self::getDataGenerator()->create_user();
 -
 -        // Create course to add the forum.
 -        $course = self::getDataGenerator()->create_course();
 -
 -        // The forum.
 -        $record = new stdClass();
 -        $record->course = $course->id;
 -        $forum = self::getDataGenerator()->create_module('forum', $record);
 -
 -        // Add a discussion.
 -        $record->forum = $forum->id;
 -        $record->userid = $user1->id;
 -        $discussion = self::getDataGenerator()->create_forum_discussion($record);
 -
 -        // Add a bunch of replies, changing the userid.
 -        $record = new stdClass();
 -        $record->discussion = $discussion->id;
 -        $record->userid = $user2->id;
 -        self::getDataGenerator()->create_forum_post($record);
 -        $record->userid = $user3->id;
 -        self::getDataGenerator()->create_forum_post($record);
 -        $record->userid = $user4->id;
 -        self::getDataGenerator()->create_forum_post($record);
 -
 -        // Check the posts were correctly created, remember, when creating a discussion a post
 -        // is generated as well, so we should have 4 posts, not 3.
 -        $this->assertEquals(4, $DB->count_records_select('forum_posts', 'discussion = :discussion',
 -                array('discussion' => $discussion->id)));
 -    }
  }