Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.
<?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/>.

/**
< * Unit tests for forms lib.
> * Unit tests for MoodleQuickForm_duration
*
< * This file contains all unit test related to forms library.
> * Contains test cases for testing MoodleQuickForm_duration
* * @package core_form
< * @category phpunit
> * @category test
* @copyright 2009 Tim Hunt * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */
> namespace core_form; defined('MOODLE_INTERNAL') || die(); > > use moodleform; global $CFG; > use MoodleQuickForm; require_once($CFG->libdir . '/form/duration.php'); >
/** * Unit tests for MoodleQuickForm_duration * * Contains test cases for testing MoodleQuickForm_duration * * @package core_form
< * @category phpunit
> * @category test
* @copyright 2009 Tim Hunt * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */
< class core_form_duration_testcase extends basic_testcase {
> class duration_test extends \basic_testcase {
/** * Get a form that can be used for testing. * * @return MoodleQuickForm */ protected function get_test_form(): MoodleQuickForm { $form = new temp_form_duration(); return $form->getform(); } /** * Get a form with a duration element that can be used for testing. * * @return array with two elements, a MoodleQuickForm and a MoodleQuickForm_duration. */ protected function get_test_form_and_element(): array { $mform = $this->get_test_form(); $element = $mform->addElement('duration', 'duration'); return [$mform, $element]; } /** * Test the constructor error handling. */ public function test_constructor_rejects_invalid_unit(): void { // Test trying to create with an invalid unit. $mform = $this->get_test_form();
< $this->expectException('coding_exception');
> $this->expectException(\coding_exception::class);
$mform->addElement('duration', 'testel', null, ['defaultunit' => 123, 'optional' => false]); } /** * Test constructor only some units. */ public function test_constructor_limited_units(): void { $mform = $this->get_test_form(); $mform->addElement('duration', 'testel', null, ['units' => [MINSECS, 1], 'optional' => false]); $html = $mform->toHtml(); $html = preg_replace('~ +>~', '>', $html); // Clean HTML to avoid spurious errors.
< $this->assertContains('<option value="60" selected>minutes</option>', $html); < $this->assertContains('<option value="1">seconds</option>', $html); < $this->assertNotContains('value="3600"', $html);
> $this->assertStringContainsString('<option value="60" selected>minutes</option>', $html); > $this->assertStringContainsString('<option value="1">seconds</option>', $html); > $this->assertStringNotContainsString('value="3600"', $html);
} /** * Testcase for testing units (seconds, minutes, hours and days) */ public function test_get_units(): void { [$mform, $element] = $this->get_test_form_and_element(); $units = $element->get_units(); $this->assertEquals($units, [1 => get_string('seconds'), 60 => get_string('minutes'), 3600 => get_string('hours'), 86400 => get_string('days'), 604800 => get_string('weeks')]); } /** * Data provider for {@see test_seconds_to_unit()}. * * @return array test cases. */ public function seconds_to_unit_cases(): array { return [ [[0, MINSECS], 0], // Zero minutes, for a nice default unit. [[1, 1], 1], [[3601, 1], 3601], [[1, MINSECS], 60], [[3, MINSECS], 180], [[1, HOURSECS], 3600], [[2, HOURSECS], 7200], [[1, DAYSECS], 86400], [[25, HOURSECS], 90000], ]; } /** * Testcase for testing conversion of seconds to the best possible unit. * * @dataProvider seconds_to_unit_cases * @param array $expected expected return value from seconds_to_unit * @param int $seconds value to pass to seconds_to_unit */ public function test_seconds_to_unit(array $expected, int $seconds): void { [, $element] = $this->get_test_form_and_element(); $this->assertEquals($expected, $element->seconds_to_unit($seconds)); } /** * Testcase for testing conversion of seconds to the best possible unit with a non-default default unit. */ public function test_seconds_to_unit_different_default_unit() { $mform = $this->get_test_form(); $element = $mform->addElement('duration', 'testel', null, ['defaultunit' => DAYSECS, 'optional' => false]); $this->assertEquals([0, DAYSECS], $element->seconds_to_unit(0)); } /** * Data provider for {@see test_export_value()}. * * @return array test cases. */ public function export_value_cases(): array { return [ [10, '10', 1], [9, '9.3', 1], [10, '9.5', 1], [180, '3', MINSECS], [90, '1.5', MINSECS], [7200, '2', HOURSECS], [86400, '1', DAYSECS], [0, '0', HOURSECS], [0, '10', 1, 0, true], [20, '20', 1, 1, true], [0, '10', 1, 0, true, ''], [20, '20', 1, 1, true, ''], ]; } /** * Testcase to check generated timestamp * * @dataProvider export_value_cases * @param int $expected Expected value returned by the element. * @param string $number Number entered into the element. * @param int $unit Unit selected in the element. * @param int $enabled Whether the enabled checkbox on the form was selected. (Only used if $optional is true.) * @param bool $optional Whether the element has the optional option on. * @param string|null $label The element's label. */ public function test_export_value(int $expected, string $number, int $unit, int $enabled = 0, bool $optional = false, ?string $label = null): void { // Create the test element. $mform = $this->get_test_form(); $el = $mform->addElement('duration', 'testel', $label, $optional ? ['optional' => true] : []); // Prepare the submitted values. $values = ['testel' => ['number' => $number, 'timeunit' => $unit]]; if ($optional) { $values['testel']['enabled'] = $enabled; } // Test. $this->assertEquals(['testel' => $expected], $el->exportValue($values, true)); $this->assertEquals($expected, $el->exportValue($values)); } } /** * Form object to be used in test case. */ class temp_form_duration extends moodleform { /** * Form definition. */ public function definition() { // No definition required. } /** * Returns form reference * @return MoodleQuickForm */ public function getform() { $mform = $this->_form; // Set submitted flag, to simulate submission. $mform->_flagSubmitted = true; return $mform; } }