[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
1 <?php 2 // This file is part of Moodle - http://moodle.org/ 3 // 4 // Moodle is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // Moodle is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 16 17 /** 18 * This file contains the class that handles testing the calendar type system. 19 * 20 * @package core_calendar 21 * @copyright 2013 Mark Nelson <markn@moodle.com> 22 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 23 */ 24 25 defined('MOODLE_INTERNAL') || die(); 26 27 global $CFG; 28 29 // The test calendar type. 30 require_once($CFG->dirroot . '/calendar/tests/calendartype_test_example.php'); 31 32 // Used to test the dateselector elements. 33 require_once($CFG->libdir . '/form/dateselector.php'); 34 require_once($CFG->libdir . '/form/datetimeselector.php'); 35 36 // Used to test the calendar/lib.php functions. 37 require_once($CFG->dirroot . '/calendar/lib.php'); 38 39 // Used to test the user datetime profile field. 40 require_once($CFG->dirroot . '/user/profile/lib.php'); 41 require_once($CFG->dirroot . '/user/profile/definelib.php'); 42 require_once($CFG->dirroot . '/user/profile/index_field_form.php'); 43 44 /** 45 * Unit tests for the calendar type system. 46 * 47 * @package core_calendar 48 * @copyright 2013 Mark Nelson <markn@moodle.com> 49 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 50 * @since Moodle 2.6 51 */ 52 class core_calendar_type_testcase extends advanced_testcase { 53 54 /** 55 * The test user. 56 */ 57 private $user; 58 59 /** 60 * Test set up. 61 */ 62 protected function setUp() { 63 // The user we are going to test this on. 64 $this->user = self::getDataGenerator()->create_user(); 65 self::setUser($this->user); 66 } 67 68 /** 69 * Test that setting the calendar type works. 70 */ 71 public function test_calendar_type_set() { 72 // We want to reset the test data after this run. 73 $this->resetAfterTest(); 74 75 // Test setting it as the 'Test' calendar type. 76 $this->set_calendar_type('test_example'); 77 $this->assertEquals('test_example', \core_calendar\type_factory::get_calendar_type()); 78 79 // Test setting it as the 'Gregorian' calendar type. 80 $this->set_calendar_type('gregorian'); 81 $this->assertEquals('gregorian', \core_calendar\type_factory::get_calendar_type()); 82 } 83 84 /** 85 * Test that calling core Moodle functions responsible for displaying the date 86 * have the same results as directly calling the same function in the calendar type. 87 */ 88 public function test_calendar_type_core_functions() { 89 // We want to reset the test data after this run. 90 $this->resetAfterTest(); 91 92 // Test that the core functions reproduce the same results as the Gregorian calendar. 93 $this->core_functions_test('gregorian'); 94 95 // Test that the core functions reproduce the same results as the test calendar. 96 $this->core_functions_test('test_example'); 97 } 98 99 /** 100 * Test that dates selected using the date selector elements are being saved as unixtime, and that the 101 * unixtime is being converted back to a valid date to display in the date selector elements for 102 * different calendar types. 103 */ 104 public function test_calendar_type_dateselector_elements() { 105 global $CFG; 106 107 // We want to reset the test data after this run. 108 $this->resetAfterTest(); 109 110 $this->setTimezone('UTC'); 111 112 // Note: this test is pretty useless because it does not test current user timezones. 113 114 // Check converting dates to Gregorian when submitting a date selector element works. Note: the test 115 // calendar is 2 years, 2 months, 2 days, 2 hours and 2 minutes ahead of the Gregorian calendar. 116 $date1 = array(); 117 $date1['day'] = 4; 118 $date1['month'] = 7; 119 $date1['year'] = 2013; 120 $date1['hour'] = 0; 121 $date1['minute'] = 0; 122 $date1['timestamp'] = 1372896000; 123 $this->convert_dateselector_to_unixtime_test('dateselector', 'gregorian', $date1); 124 125 $date2 = array(); 126 $date2['day'] = 7; 127 $date2['month'] = 9; 128 $date2['year'] = 2015; 129 $date2['hour'] = 0; // The dateselector element does not have hours. 130 $date2['minute'] = 0; // The dateselector element does not have minutes. 131 $date2['timestamp'] = 1372896000; 132 $this->convert_dateselector_to_unixtime_test('dateselector', 'test_example', $date2); 133 134 $date3 = array(); 135 $date3['day'] = 4; 136 $date3['month'] = 7; 137 $date3['year'] = 2013; 138 $date3['hour'] = 23; 139 $date3['minute'] = 15; 140 $date3['timestamp'] = 1372979700; 141 $this->convert_dateselector_to_unixtime_test('datetimeselector', 'gregorian', $date3); 142 143 $date4 = array(); 144 $date4['day'] = 7; 145 $date4['month'] = 9; 146 $date4['year'] = 2015; 147 $date4['hour'] = 1; 148 $date4['minute'] = 17; 149 $date4['timestamp'] = 1372979700; 150 $this->convert_dateselector_to_unixtime_test('datetimeselector', 'test_example', $date4); 151 152 // The date selector element values are set by using the function usergetdate, here we want to check that 153 // the unixtime passed is being successfully converted to the correct values for the calendar type. 154 $this->convert_unixtime_to_dateselector_test('gregorian', $date3); 155 $this->convert_unixtime_to_dateselector_test('test_example', $date4); 156 } 157 158 /** 159 * Test that the user profile field datetime minimum and maximum year settings are saved as the 160 * equivalent Gregorian years. 161 */ 162 public function test_calendar_type_datetime_field_submission() { 163 // We want to reset the test data after this run. 164 $this->resetAfterTest(); 165 166 // Create an array with the input values and expected values once submitted. 167 $date = array(); 168 $date['inputminyear'] = '1970'; 169 $date['inputmaxyear'] = '2013'; 170 $date['expectedminyear'] = '1970'; 171 $date['expectedmaxyear'] = '2013'; 172 $this->datetime_field_submission_test('gregorian', $date); 173 174 // The test calendar is 2 years, 2 months, 2 days in the future, so when the year 1970 is submitted, 175 // the year 1967 should be saved in the DB, as 1/1/1970 converts to 30/10/1967 in Gregorian. 176 $date['expectedminyear'] = '1967'; 177 $date['expectedmaxyear'] = '2010'; 178 $this->datetime_field_submission_test('test_example', $date); 179 } 180 181 /** 182 * Test all the core functions that use the calendar type system. 183 * 184 * @param string $type the calendar type we want to test 185 */ 186 private function core_functions_test($type) { 187 $this->set_calendar_type($type); 188 189 // Get the calendar. 190 $calendar = \core_calendar\type_factory::get_calendar_instance(); 191 192 // Test the userdate function. 193 $this->assertEquals($calendar->timestamp_to_date_string($this->user->timecreated, '', 99, true, true), 194 userdate($this->user->timecreated)); 195 196 // Test the calendar/lib.php functions. 197 $this->assertEquals($calendar->get_weekdays(), calendar_get_days()); 198 $this->assertEquals($calendar->get_starting_weekday(), calendar_get_starting_weekday()); 199 $this->assertEquals($calendar->get_num_days_in_month('1986', '9'), calendar_days_in_month('9', '1986')); 200 $this->assertEquals($calendar->get_next_month('1986', '9'), calendar_add_month('9', '1986')); 201 $this->assertEquals($calendar->get_prev_month('1986', '9'), calendar_sub_month('9', '1986')); 202 203 // Test the lib/moodle.php functions. 204 $this->assertEquals($calendar->get_num_days_in_month('1986', '9'), days_in_month('9', '1986')); 205 $this->assertEquals($calendar->get_weekday('1986', '9', '16'), dayofweek('16', '9', '1986')); 206 } 207 208 /** 209 * Simulates submitting a form with a date selector element and tests that the chosen dates 210 * are converted into unixtime before being saved in DB. 211 * 212 * @param string $element the form element we are testing 213 * @param string $type the calendar type we want to test 214 * @param array $date the date variables 215 */ 216 private function convert_dateselector_to_unixtime_test($element, $type, $date) { 217 $this->set_calendar_type($type); 218 219 if ($element == 'dateselector') { 220 $el = new MoodleQuickForm_date_selector('dateselector', null, array('timezone' => 0.0, 'step' => 1)); 221 } else { 222 $el = new MoodleQuickForm_date_time_selector('dateselector', null, array('timezone' => 0.0, 'step' => 1)); 223 } 224 $el->_createElements(); 225 $submitvalues = array('dateselector' => $date); 226 227 $this->assertSame($el->exportValue($submitvalues), array('dateselector' => $date['timestamp'])); 228 } 229 230 /** 231 * Test converting dates from unixtime to a date for the calendar type specified. 232 * 233 * @param string $type the calendar type we want to test 234 * @param array $date the date variables 235 */ 236 private function convert_unixtime_to_dateselector_test($type, $date) { 237 $this->set_calendar_type($type); 238 239 // Get the calendar. 240 $calendar = \core_calendar\type_factory::get_calendar_instance(); 241 242 $usergetdate = $calendar->timestamp_to_date_array($date['timestamp'], 0.0); 243 $comparedate = array( 244 'minute' => $usergetdate['minutes'], 245 'hour' => $usergetdate['hours'], 246 'day' => $usergetdate['mday'], 247 'month' => $usergetdate['mon'], 248 'year' => $usergetdate['year'], 249 'timestamp' => $date['timestamp'] 250 ); 251 252 $this->assertEquals($comparedate, $date); 253 } 254 255 /** 256 * Test saving the minimum and max year settings for the user datetime field. 257 * 258 * @param string $type the calendar type we want to test 259 * @param array $date the date variables 260 */ 261 private function datetime_field_submission_test($type, $date) { 262 $this->set_calendar_type($type); 263 264 // Get the data we are submitting for the form. 265 $formdata = array(); 266 $formdata['id'] = 0; 267 $formdata['shortname'] = 'Shortname'; 268 $formdata['name'] = 'Name'; 269 $formdata['param1'] = $date['inputminyear']; 270 $formdata['param2'] = $date['inputmaxyear']; 271 272 // Mock submitting this. 273 field_form::mock_submit($formdata); 274 275 // Create the user datetime form. 276 $form = new field_form(null, 'datetime'); 277 278 // Get the data from the submission. 279 $submissiondata = $form->get_data(); 280 // On the user profile field page after get_data, the function define_save is called 281 // in the field base class, which then calls the field's function define_save_preprocess. 282 $field = new profile_define_datetime(); 283 $submissiondata = $field->define_save_preprocess($submissiondata); 284 285 // Create an array we want to compare with the date passed. 286 $comparedate = $date; 287 $comparedate['expectedminyear'] = $submissiondata->param1; 288 $comparedate['expectedmaxyear'] = $submissiondata->param2; 289 290 $this->assertEquals($comparedate, $date); 291 } 292 293 /** 294 * Set the calendar type for this user. 295 * 296 * @param string $type the calendar type we want to set 297 */ 298 private function set_calendar_type($type) { 299 $this->user->calendartype = $type; 300 \core\session\manager::set_user($this->user); 301 } 302 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Thu Aug 11 10:00:09 2016 | Cross-referenced by PHPXref 0.7.1 |