/** * Creates the specified element. * * @Given /^the following "(?P<element_string>(?:[^"]|\\")*)" exist:$/ * * @throws MaharaBehatTestException * @throws PendingException * @param string $elementname The name of the entity to add * @param TableNode $data */ public function the_following_exist($elementname, TableNode $data) { // Now that we need them require the data generators. require_once get_config('docroot') . '/testing/classes/generator/lib.php'; if (empty(self::$elements[$elementname])) { throw new PendingException($elementname . ' data generator is not implemented'); } $this->datagenerator = TestingUtil::get_data_generator(); $elementdatagenerator = self::$elements[$elementname]['datagenerator']; $availablefields = self::$elements[$elementname]['available']; $requiredfields = self::$elements[$elementname]['required']; if (!empty(self::$elements[$elementname]['switchids'])) { $switchids = self::$elements[$elementname]['switchids']; } foreach ($data->getHash() as $elementdata) { // Normalise field values $this->normalise($elementdata); // Validate available fields for given element $this->validate_fields($availablefields, $elementdata); // Check if all the required fields are there. foreach ($requiredfields as $requiredfield) { if (!isset($elementdata[$requiredfield])) { throw new MaharaBehatTestException($elementname . ' requires the field ' . $requiredfield . ' to be specified'); } } // Preprocess the entities that requires a special treatment. if (method_exists($this, 'preprocess_' . $elementdatagenerator)) { $elementdata = $this->{'preprocess_' . $elementdatagenerator}($elementdata); } // Creates element. $methodname = 'create_' . $elementdatagenerator; if (method_exists($this->datagenerator, $methodname)) { // Using data generators directly. $this->datagenerator->{$methodname}($elementdata); } else { if (method_exists($this, 'process_' . $elementdatagenerator)) { // Using an alternative to the direct data generator call. $this->{'process_' . $elementdatagenerator}($elementdata); } else { throw new PendingException($elementname . ' the create_ or process_ method is not implemented'); } } } }