. /** * Test datarange element. * * @package customcertelement_daterange * @copyright 2018 Dmitrii Metelkin * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); global $CFG; require_once($CFG->dirroot . '/mod/customcert/element/daterange/tests/fixtures/fake_datarange_element.php'); class customcertelement_daterange_element_test extends advanced_testcase { /** * Helper function to build element data. * * @param stdClass $data Element data. * * @return object */ protected function build_element_data(stdClass $data) { return (object) [ 'id' => 1, 'pageid' => 1, 'name' => 'Test', 'data' => json_encode($data), 'font' => 'Font', 'fontsize' => 1, 'colour' => '#EEE', 'posx' => 0, 'posy' => 0, 'width' => 100, 'refpoint' => 1 ]; } /** * Helper function to build datarange data. * * @param array $dataranges A list of dataranges. * @param string $fallbackstring Fall back string. * * @return object */ protected function build_datarange_data(array $dataranges, $fallbackstring = '') { return (object) [ 'dateitem' => 1, 'fallbackstring' => $fallbackstring, 'numranges' => count($dataranges), 'dateranges' => $dataranges, ]; } /** * A helper function to get datarange element for testing. * * @param array $dataranges A list of dataranges. * @param string $fallbackstring Fall back strin * * @return \fake_datarange_element */ protected function get_datarange_element(array $dataranges, $fallbackstring = '') { $datarangedata = $this->build_datarange_data($dataranges, $fallbackstring); $elementdata = $this->build_element_data($datarangedata); return new fake_datarange_element($elementdata); } /** * Data provider for test_get_daterange_string_for_recurring_ranges. * @return array */ public function get_test_get_daterange_string_for_recurring_ranges_data_provider() { return [ ['1.11.2016', 'WS 2016/2017'], ['1.11.2017', 'WS 2017/2018'], ['1.11.2018', 'WS 2018/2019'], ['1.11.2019', 'WS 2019/2020'], ['1.02.2017', 'WS 2016/2017'], ['1.02.2018', 'WS 2017/2018'], ['1.02.2019', 'WS 2018/2019'], ['1.02.2020', 'WS 2019/2020'], ['1.05.2016', 'SS 2016'], ['1.05.2017', 'SS 2017'], ['1.05.2018', 'SS 2018'], ['1.05.2019', 'SS 2019'], ]; } /** * Test get correct strings for recurring ranges. * * @dataProvider get_test_get_daterange_string_for_recurring_ranges_data_provider * * @param string $date Date to test. * @param string $expected Expected result. */ public function test_get_daterange_string_for_recurring_ranges($date, $expected) { $dateranges = [ (object)[ 'startdate' => strtotime('01.04.2017'), 'enddate' => strtotime('30.09.2017'), 'datestring' => 'SS {{date_year}}', 'recurring' => true, ], (object)[ 'startdate' => strtotime('01.10.2017'), 'enddate' => strtotime('31.03.2018'), 'datestring' => 'WS {{recurring_range_first_year}}/{{recurring_range_last_year}}', 'recurring' => true, ], ]; $element = $this->get_datarange_element($dateranges); $date = strtotime($date); $this->assertEquals($expected, $element->get_daterange_string($date)); } /** * Test that first found element matched. */ public function test_that_first_matched_range_applied_first() { $dateranges = [ (object)[ 'startdate' => strtotime('01.04.2017'), 'enddate' => strtotime('30.09.2017'), 'datestring' => 'First range', 'recurring' => false, ], (object)[ 'startdate' => strtotime('01.05.2017'), 'enddate' => strtotime('01.07.2018'), 'datestring' => 'Second range', 'recurring' => false, ], ]; $element = $this->get_datarange_element($dateranges); $date = strtotime('1.06.2017'); $this->assertEquals('First range', $element->get_daterange_string($date)); } /** * Test that placeholders correctly applied to matched range and fall back string. */ public function test_placeholders_and_fall_back_string() { $dateranges = [ (object)[ 'startdate' => strtotime('01.04.2017'), 'enddate' => strtotime('30.09.2018'), 'datestring' => '{{current_year}} - {{range_first_year}} - {{range_last_year}} - {{date_year}}', 'recurring' => false, ], ]; $fallbackstring = '{{current_year}} - {{range_first_year}} - {{range_last_year}} - {{date_year}}'; $element = $this->get_datarange_element($dateranges, $fallbackstring); $date = strtotime('1.01.2000'); $expected = date('Y', time()) . ' - {{range_first_year}} - {{range_last_year}} - 2000'; $this->assertEquals($expected, $element->get_daterange_string($date)); $date = strtotime('1.07.2017'); $expected = date('Y', time()) . ' - 2017 - 2018 - 2017'; $this->assertEquals($expected, $element->get_daterange_string($date)); } /** * Test that nothing will be displayed if not matched and empty fall back string. */ public function test_nothing_will_be_displayed_if_empty_fallback_string() { $dateranges = [ (object)[ 'startdate' => strtotime('01.04.2017'), 'enddate' => strtotime('30.09.2018'), 'datestring' => '{{current_year}} - {{range_first_year}} - {{range_last_year}} - {{date_year}}', 'recurring' => false, ], ]; $fallbackstring = ''; $element = $this->get_datarange_element($dateranges, $fallbackstring); $date = strtotime('1.07.2011'); $this->assertEquals($fallbackstring, $element->get_daterange_string($date)); } /** * Test that display recurring_range_first_year and recurring_range_last_year placeholders. */ public function test_recurring_range_first_year_and_recurring_range_last_year_placeholders() { $datestring = '{{range_first_year}}-{{range_last_year}}-{{recurring_range_first_year}}-{{recurring_range_last_year}}'; $dateranges = [ (object) [ 'startdate' => strtotime('01.04.2017'), 'enddate' => strtotime('30.09.2017'), 'datestring' => $datestring, 'recurring' => true, ], (object)[ 'startdate' => strtotime('01.10.2017'), 'enddate' => strtotime('31.03.2018'), 'datestring' => $datestring, 'recurring' => true, ], ]; $element = $this->get_datarange_element($dateranges); $date = strtotime('1.05.2020'); $this->assertEquals('2017-2017-2020-2020', $element->get_daterange_string($date)); $date = strtotime('1.05.2024'); $this->assertEquals('2017-2017-2024-2024', $element->get_daterange_string($date)); $date = strtotime('1.02.2020'); $this->assertEquals('2017-2018-2019-2020', $element->get_daterange_string($date)); $date = strtotime('1.02.2024'); $this->assertEquals('2017-2018-2023-2024', $element->get_daterange_string($date)); } }