AutorÃa | Ultima modificación | Ver Log |
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Steps definitions for marking guides.
*
* @package gradingform_guide
* @category test
* @copyright 2015 Jun Pataleta
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require_once(__DIR__ . '/../../../../../../lib/behat/behat_base.php');
use Behat\Gherkin\Node\TableNode as TableNode,
Behat\Mink\Exception\ElementNotFoundException as ElementNotFoundException,
Behat\Mink\Exception\ExpectationException as ExpectationException;
/**
* Steps definitions to help with marking guides.
*
* @package gradingform_guide
* @category test
* @copyright 2015 Jun Pataleta
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class behat_gradingform_guide extends behat_base {
/**
* Defines the marking guide with the provided data, following marking guide's definition grid cells.
*
* This method fills the marking guide of the marking guide definition
* form; the provided TableNode should contain one row for
* each criterion and each cell of the row should contain:
* # Criterion name, a.k.a. shortname
* # Description for students
* # Description for markers
* # Max score
*
* Works with both JS and non-JS.
*
* @When /^I define the following marking guide:$/
* @throws ExpectationException
* @param TableNode $guide
*/
public function i_define_the_following_marking_guide(TableNode $guide) {
$steptableinfo = '| Criterion name | Description for students | Description for markers | Maximum score |';
if ($criteria = $guide->getHash()) {
$addcriterionbutton = $this->find_button(get_string('addcriterion', 'gradingform_guide'));
foreach ($criteria as $index => $criterion) {
// Make sure the criterion array has 4 elements.
if (count($criterion) != 4) {
throw new ExpectationException(
'The criterion definition should contain name, description for students and markers, and maximum points. ' .
'Please follow this format: ' . $steptableinfo,
$this->getSession()
);
}
// On load, there's already a criterion template ready.
$shortnamevisible = false;
if ($index > 0) {
// So if the index is greater than 0, we click the Add new criterion button to add a new criterion.
$addcriterionbutton->click();
$shortnamevisible = true;
}
$criterionroot = 'guide[criteria][NEWID' . ($index + 1) . ']';
// Set the field value for the Criterion name.
$this->set_guide_field_value($criterionroot . '[shortname]', $criterion['Criterion name'], $shortnamevisible);
// Set the field value for the Description for students field.
$this->set_guide_field_value($criterionroot . '[description]', $criterion['Description for students']);
// Set the field value for the Description for markers field.
$this->set_guide_field_value($criterionroot . '[descriptionmarkers]', $criterion['Description for markers']);
// Set the field value for the Max score field.
$this->set_guide_field_value($criterionroot . '[maxscore]', $criterion['Maximum score']);
}
}
}
/**
* Defines the marking guide with the provided data, following marking guide's definition grid cells.
*
* This method fills the table of frequently used comments of the marking guide definition form.
* The provided TableNode should contain one row for each frequently used comment.
* Each row contains:
* # Comment
*
* Works with both JS and non-JS.
*
* @When /^I define the following frequently used comments:$/
* @throws ExpectationException
* @param TableNode $commentstable
*/
public function i_define_the_following_frequently_used_comments(TableNode $commentstable) {
$steptableinfo = '| Comment |';
if ($comments = $commentstable->getRows()) {
$addcommentbutton = $this->find_button(get_string('addcomment', 'gradingform_guide'));
foreach ($comments as $index => $comment) {
// Make sure the comment array has only 1 element.
if (count($comment) != 1) {
throw new ExpectationException(
'The comment cannot be empty. Please follow this format: ' . $steptableinfo,
$this->getSession()
);
}
// On load, there's already a comment template ready.
$commentfieldvisible = false;
if ($index > 0) {
// So if the index is greater than 0, we click the Add frequently used comment button to add a new criterion.
$addcommentbutton->click();
$commentfieldvisible = true;
}
$commentroot = 'guide[comments][NEWID' . ($index + 1) . ']';
// Set the field value for the frequently used comment.
$this->set_guide_field_value($commentroot . '[description]', $comment[0], $commentfieldvisible);
}
}
}
/**
* Performs grading of the student by filling out the marking guide.
* Set one line per criterion and for each criterion set "| Criterion name | Points | Remark |".
*
* @When /^I grade by filling the marking guide with:$/
*
* @throws ExpectationException
* @param TableNode $guide
* @return void
*/
public function i_grade_by_filling_the_marking_guide_with(TableNode $guide) {
$criteria = $guide->getRowsHash();
$stepusage = '"I grade by filling the rubric with:" step needs you to provide a table where each row is a criterion' .
' and each criterion has 3 different values: | Criterion name | Number of points | Remark text |';
// First element -> name, second -> points, third -> Remark.
foreach ($criteria as $name => $criterion) {
// We only expect the points and the remark, as the criterion name is $name.
if (count($criterion) !== 2) {
throw new ExpectationException($stepusage, $this->getSession());
}
// Numeric value here.
$points = $criterion[0];
if (!is_numeric($points)) {
throw new ExpectationException($stepusage, $this->getSession());
}
$criterionid = 0;
if ($criterionnamediv = $this->find('xpath', "//div[@class='criterionshortname'][text()='$name']")) {
$criteriondivname = $criterionnamediv->getAttribute('name');
// Criterion's name is of the format "advancedgrading[criteria][ID][shortname]".
// So just explode the string with "][" as delimiter to extract the criterion ID.
if ($nameparts = explode('][', $criteriondivname)) {
$criterionid = $nameparts[1];
}
}
if ($criterionid) {
$criterionroot = 'advancedgrading[criteria]' . '[' . $criterionid . ']';
$this->execute('behat_forms::i_set_the_field_to', array($criterionroot . '[score]', $points));
$this->execute('behat_forms::i_set_the_field_to', array($criterionroot . '[remark]', $criterion[1]));
}
}
}
/**
* Makes a hidden marking guide field visible (if necessary) and sets a value on it.
*
* @param string $name The name of the field
* @param string $value The value to set
* @param bool $visible
* @return void
*/
protected function set_guide_field_value($name, $value, $visible = false) {
// Fields are hidden by default.
if ($this->running_javascript() && $visible === false) {
$xpath = "//*[@name='$name']/following-sibling::*[contains(concat(' ', normalize-space(@class), ' '), ' plainvalue ')]";
$textnode = $this->find('xpath', $xpath);
$textnode->click();
}
// Set the value now.
$field = $this->find_field($name);
$field->setValue($value);
}
}