DateTimePlusTest.php

Definition of Drupal\system\Tests\Datetime\DateTimePlusTest.

Namespace

Drupal\system\Tests\Datetime

File

drupal/core/modules/system/lib/Drupal/system/Tests/Datetime/DateTimePlusTest.php
View source
<?php

/**
 * @file
 * Definition of Drupal\system\Tests\Datetime\DateTimePlusTest.
 */
namespace Drupal\system\Tests\Datetime;

use Drupal\simpletest\UnitTestBase;
use Drupal\Component\Datetime\DateTimePlus;
use DateTimeZone;
class DateTimePlusTest extends UnitTestBase {

  /**
   * Test information.
   */
  public static function getInfo() {
    return array(
      'name' => 'DateTimePlus',
      'description' => 'Test DateTimePlus functionality.',
      'group' => 'Datetime',
    );
  }

  /**
   * Set up required modules.
   */
  public static $modules = array();

  /**
   * Test creating dates from string input.
   */
  public function testDateStrings() {

    // Create date object from datetime string.
    $input = '2009-03-07 10:30';
    $timezone = 'America/Chicago';
    $date = new DateTimePlus($input, $timezone);
    $value = $date
      ->format('c');
    $expected = '2009-03-07T10:30:00-06:00';
    $this
      ->assertEqual($expected, $value, "Test new DateTimePlus({$input}, {$timezone}): should be {$expected}, found {$value}.");

    // Same during daylight savings time.
    $input = '2009-06-07 10:30';
    $timezone = 'America/Chicago';
    $date = new DateTimePlus($input, $timezone);
    $value = $date
      ->format('c');
    $expected = '2009-06-07T10:30:00-05:00';
    $this
      ->assertEqual($expected, $value, "Test new DateTimePlus({$input}, {$timezone}): should be {$expected}, found {$value}.");

    // Create date object from date string.
    $input = '2009-03-07';
    $timezone = 'America/Chicago';
    $date = new DateTimePlus($input, $timezone);
    $value = $date
      ->format('c');
    $expected = '2009-03-07T00:00:00-06:00';
    $this
      ->assertEqual($expected, $value, "Test new DateTimePlus({$input}, {$timezone}): should be {$expected}, found {$value}.");

    // Same during daylight savings time.
    $input = '2009-06-07';
    $timezone = 'America/Chicago';
    $date = new DateTimePlus($input, $timezone);
    $value = $date
      ->format('c');
    $expected = '2009-06-07T00:00:00-05:00';
    $this
      ->assertEqual($expected, $value, "Test new DateTimePlus({$input}, {$timezone}): should be {$expected}, found {$value}.");

    // Create date object from date string.
    $input = '2009-03-07 10:30';
    $timezone = 'Australia/Canberra';
    $date = new DateTimePlus($input, $timezone);
    $value = $date
      ->format('c');
    $expected = '2009-03-07T10:30:00+11:00';
    $this
      ->assertEqual($expected, $value, "Test new DateTimePlus({$input}, {$timezone}): should be {$expected}, found {$value}.");

    // Same during daylight savings time.
    $input = '2009-06-07 10:30';
    $timezone = 'Australia/Canberra';
    $date = new DateTimePlus($input, $timezone);
    $value = $date
      ->format('c');
    $expected = '2009-06-07T10:30:00+10:00';
    $this
      ->assertEqual($expected, $value, "Test new DateTimePlus({$input}, {$timezone}): should be {$expected}, found {$value}.");
  }

  /**
   * Test creating dates from arrays of date parts.
   */
  function testDateArrays() {

    // Create date object from date array, date only.
    $input = array(
      'year' => 2010,
      'month' => 2,
      'day' => 28,
    );
    $timezone = 'America/Chicago';
    $date = new DateTimePlus($input, $timezone);
    $value = $date
      ->format('c');
    $expected = '2010-02-28T00:00:00-06:00';
    $this
      ->assertEqual($expected, $value, "Test new DateTimePlus(array('year' => 2010, 'month' => 2, 'day' => 28), {$timezone}): should be {$expected}, found {$value}.");

    // Create date object from date array with hour.
    $input = array(
      'year' => 2010,
      'month' => 2,
      'day' => 28,
      'hour' => 10,
    );
    $timezone = 'America/Chicago';
    $date = new DateTimePlus($input, $timezone);
    $value = $date
      ->format('c');
    $expected = '2010-02-28T10:00:00-06:00';
    $this
      ->assertEqual($expected, $value, "Test new DateTimePlus(array('year' => 2010, 'month' => 2, 'day' => 28, 'hour' => 10), {$timezone}): should be {$expected}, found {$value}.");

    // Create date object from date array, date only.
    $input = array(
      'year' => 2010,
      'month' => 2,
      'day' => 28,
    );
    $timezone = 'Europe/Berlin';
    $date = new DateTimePlus($input, $timezone);
    $value = $date
      ->format('c');
    $expected = '2010-02-28T00:00:00+01:00';
    $this
      ->assertEqual($expected, $value, "Test new DateTimePlus(array('year' => 2010, 'month' => 2, 'day' => 28), {$timezone}): should be {$expected}, found {$value}.");

    // Create date object from date array with hour.
    $input = array(
      'year' => 2010,
      'month' => 2,
      'day' => 28,
      'hour' => 10,
    );
    $timezone = 'Europe/Berlin';
    $date = new DateTimePlus($input, $timezone);
    $value = $date
      ->format('c');
    $expected = '2010-02-28T10:00:00+01:00';
    $this
      ->assertEqual($expected, $value, "Test new DateTimePlus(array('year' => 2010, 'month' => 2, 'day' => 28, 'hour' => 10), {$timezone}): should be {$expected}, found {$value}.");
  }

  /**
   * Test creating dates from timestamps.
   */
  function testDateTimestamp() {

    // Create date object from a unix timestamp and display it in
    // local time.
    $input = 0;
    $timezone = 'UTC';
    $date = new DateTimePlus($input, $timezone);
    $value = $date
      ->format('c');
    $expected = '1970-01-01T00:00:00+00:00';
    $this
      ->assertEqual($expected, $value, "Test new DateTimePlus({$input}, {$timezone}): should be {$expected}, found {$value}.");
    $expected = 'UTC';
    $value = $date
      ->getTimeZone()
      ->getName();
    $this
      ->assertEqual($expected, $value, "The current timezone is {$value}: should be {$expected}.");
    $expected = 0;
    $value = $date
      ->getOffset();
    $this
      ->assertEqual($expected, $value, "The current offset is {$value}: should be {$expected}.");
    $timezone = 'America/Los_Angeles';
    $date
      ->setTimezone(new DateTimeZone($timezone));
    $value = $date
      ->format('c');
    $expected = '1969-12-31T16:00:00-08:00';
    $this
      ->assertEqual($expected, $value, "Test \$date->setTimezone(new DateTimeZone({$timezone})): should be {$expected}, found {$value}.");
    $expected = 'America/Los_Angeles';
    $value = $date
      ->getTimeZone()
      ->getName();
    $this
      ->assertEqual($expected, $value, "The current timezone should be {$expected}, found {$value}.");
    $expected = '-28800';
    $value = $date
      ->getOffset();
    $this
      ->assertEqual($expected, $value, "The current offset should be {$expected}, found {$value}.");

    // Create a date using the timestamp of zero, then display its
    // value both in UTC and the local timezone.
    $input = 0;
    $timezone = 'America/Los_Angeles';
    $date = new DateTimePlus($input, $timezone);
    $offset = $date
      ->getOffset();
    $value = $date
      ->format('c');
    $expected = '1969-12-31T16:00:00-08:00';
    $this
      ->assertEqual($expected, $value, "Test new DateTimePlus({$input}, {$timezone}):  should be {$expected}, found {$value}.");
    $expected = 'America/Los_Angeles';
    $value = $date
      ->getTimeZone()
      ->getName();
    $this
      ->assertEqual($expected, $value, "The current timezone should be {$expected}, found {$value}.");
    $expected = '-28800';
    $value = $date
      ->getOffset();
    $this
      ->assertEqual($expected, $value, "The current offset should be {$expected}, found {$value}.");
    $timezone = 'UTC';
    $date
      ->setTimezone(new DateTimeZone($timezone));
    $value = $date
      ->format('c');
    $expected = '1970-01-01T00:00:00+00:00';
    $this
      ->assertEqual($expected, $value, "Test \$date->setTimezone(new DateTimeZone({$timezone})): should be {$expected}, found {$value}.");
    $expected = 'UTC';
    $value = $date
      ->getTimeZone()
      ->getName();
    $this
      ->assertEqual($expected, $value, "The current timezone should be {$expected}, found {$value}.");
    $expected = '0';
    $value = $date
      ->getOffset();
    $this
      ->assertEqual($expected, $value, "The current offset should be {$expected}, found {$value}.");
  }

  /**
   * Test timezone manipulation.
   */
  function testTimezoneConversion() {

    // Create date object from datetime string in UTC, and convert
    // it to a local date.
    $input = '1970-01-01 00:00:00';
    $timezone = 'UTC';
    $date = new DateTimePlus($input, $timezone);
    $value = $date
      ->format('c');
    $expected = '1970-01-01T00:00:00+00:00';
    $this
      ->assertEqual($expected, $value, "Test new DateTimePlus('{$input}', '{$timezone}'): should be {$expected}, found {$value}.");
    $expected = 'UTC';
    $value = $date
      ->getTimeZone()
      ->getName();
    $this
      ->assertEqual($expected, $value, "The current timezone is {$value}: should be {$expected}.");
    $expected = 0;
    $value = $date
      ->getOffset();
    $this
      ->assertEqual($expected, $value, "The current offset is {$value}: should be {$expected}.");
    $timezone = 'America/Los_Angeles';
    $date
      ->setTimezone(new DateTimeZone($timezone));
    $value = $date
      ->format('c');
    $expected = '1969-12-31T16:00:00-08:00';
    $this
      ->assertEqual($expected, $value, "Test \$date->setTimezone(new DateTimeZone({$timezone})): should be {$expected}, found {$value}.");
    $expected = 'America/Los_Angeles';
    $value = $date
      ->getTimeZone()
      ->getName();
    $this
      ->assertEqual($expected, $value, "The current timezone should be {$expected}, found {$value}.");
    $expected = '-28800';
    $value = $date
      ->getOffset();
    $this
      ->assertEqual($expected, $value, "The current offset should be {$expected}, found {$value}.");

    // Convert the local time to UTC using string input.
    $input = '1969-12-31 16:00:00';
    $timezone = 'America/Los_Angeles';
    $date = new DateTimePlus($input, $timezone);
    $offset = $date
      ->getOffset();
    $value = $date
      ->format('c');
    $expected = '1969-12-31T16:00:00-08:00';
    $this
      ->assertEqual($expected, $value, "Test new DateTimePlus('{$input}', '{$timezone}'):  should be {$expected}, found {$value}.");
    $expected = 'America/Los_Angeles';
    $value = $date
      ->getTimeZone()
      ->getName();
    $this
      ->assertEqual($expected, $value, "The current timezone should be {$expected}, found {$value}.");
    $expected = '-28800';
    $value = $date
      ->getOffset();
    $this
      ->assertEqual($expected, $value, "The current offset should be {$expected}, found {$value}.");
    $timezone = 'UTC';
    $date
      ->setTimezone(new DateTimeZone($timezone));
    $value = $date
      ->format('c');
    $expected = '1970-01-01T00:00:00+00:00';
    $this
      ->assertEqual($expected, $value, "Test \$date->setTimezone(new DateTimeZone({$timezone})): should be {$expected}, found {$value}.");
    $expected = 'UTC';
    $value = $date
      ->getTimeZone()
      ->getName();
    $this
      ->assertEqual($expected, $value, "The current timezone should be {$expected}, found {$value}.");
    $expected = '0';
    $value = $date
      ->getOffset();
    $this
      ->assertEqual($expected, $value, "The current offset should be {$expected}, found {$value}.");

    // Convert the local time to UTC using string input.
    $input = '1969-12-31 16:00:00';
    $timezone = 'Europe/Warsaw';
    $date = new DateTimePlus($input, $timezone);
    $offset = $date
      ->getOffset();
    $value = $date
      ->format('c');
    $expected = '1969-12-31T16:00:00+01:00';
    $this
      ->assertEqual($expected, $value, "Test new DateTimePlus('{$input}', '{$timezone}'):  should be {$expected}, found {$value}.");
    $expected = 'Europe/Warsaw';
    $value = $date
      ->getTimeZone()
      ->getName();
    $this
      ->assertEqual($expected, $value, "The current timezone should be {$expected}, found {$value}.");
    $expected = '+3600';
    $value = $date
      ->getOffset();
    $this
      ->assertEqual($expected, $value, "The current offset should be {$expected}, found {$value}.");
  }

  /**
   * Test creating dates from format strings.
   */
  function testDateFormat() {

    // Create a year-only date.
    $input = '2009';
    $timezone = NULL;
    $format = 'Y';
    $date = new DateTimePlus($input, $timezone, $format);
    $value = $date
      ->format('Y');
    $expected = '2009';
    $this
      ->assertEqual($expected, $value, "Test new DateTimePlus({$input}, {$timezone}, {$format}): should be {$expected}, found {$value}.");

    // Create a month and year-only date.
    $input = '2009-10';
    $timezone = NULL;
    $format = 'Y-m';
    $date = new DateTimePlus($input, $timezone, $format);
    $value = $date
      ->format('Y-m');
    $expected = '2009-10';
    $this
      ->assertEqual($expected, $value, "Test new DateTimePlus({$input}, {$timezone}, {$format}): should be {$expected}, found {$value}.");

    // Create a time-only date.
    $input = 'T10:30:00';
    $timezone = NULL;
    $format = '\\TH:i:s';
    $date = new DateTimePlus($input, $timezone, $format);
    $value = $date
      ->format('H:i:s');
    $expected = '10:30:00';
    $this
      ->assertEqual($expected, $value, "Test new DateTimePlus({$input}, {$timezone}, {$format}): should be {$expected}, found {$value}.");

    // Create a time-only date.
    $input = '10:30:00';
    $timezone = NULL;
    $format = 'H:i:s';
    $date = new DateTimePlus($input, $timezone, $format);
    $value = $date
      ->format('H:i:s');
    $expected = '10:30:00';
    $this
      ->assertEqual($expected, $value, "Test new DateTimePlus({$input}, {$timezone}, {$format}): should be {$expected}, found {$value}.");
  }

  /**
   * Test invalid date handling.
   */
  function testInvalidDates() {

    // Test for invalid month names when we are using a short version
    // of the month.
    $input = '23 abc 2012';
    $timezone = NULL;
    $format = 'd M Y';
    $date = new DateTimePlus($input, $timezone, $format);
    $this
      ->assertNotEqual(count($date
      ->getErrors()), 0, "{$input} contains an invalid month name and produces errors.");

    // Test for invalid hour.
    $input = '0000-00-00T45:30:00';
    $timezone = NULL;
    $format = 'Y-m-d\\TH:i:s';
    $date = new DateTimePlus($input, $timezone, $format);
    $this
      ->assertNotEqual(count($date
      ->getErrors()), 0, "{$input} contains an invalid hour and produces errors.");

    // Test for invalid day.
    $input = '0000-00-99T05:30:00';
    $timezone = NULL;
    $format = 'Y-m-d\\TH:i:s';
    $date = new DateTimePlus($input, $timezone, $format);
    $this
      ->assertNotEqual(count($date
      ->getErrors()), 0, "{$input} contains an invalid day and produces errors.");

    // Test for invalid month.
    $input = '0000-75-00T15:30:00';
    $timezone = NULL;
    $format = 'Y-m-d\\TH:i:s';
    $date = new DateTimePlus($input, $timezone, $format);
    $this
      ->assertNotEqual(count($date
      ->getErrors()), 0, "{$input} contains an invalid month and produces errors.");

    // Test for invalid year.
    $input = '11-08-01T15:30:00';
    $timezone = NULL;
    $format = 'Y-m-d\\TH:i:s';
    $date = new DateTimePlus($input, $timezone, $format);
    $this
      ->assertNotEqual(count($date
      ->getErrors()), 0, "{$input} contains an invalid year and produces errors.");

    // Test for invalid year from date array. 10000 as a year will
    // create an exception error in the PHP DateTime object.
    $input = array(
      'year' => 10000,
      'month' => 7,
      'day' => 8,
      'hour' => 8,
      'minute' => 0,
      'second' => 0,
    );
    $timezone = 'America/Chicago';
    $date = new DateTimePlus($input, $timezone);
    $this
      ->assertNotEqual(count($date
      ->getErrors()), 0, "array('year' => 10000, 'month' => 7, 'day' => 8, 'hour' => 8, 'minute' => 0, 'second' => 0) contains an invalid year and produces errors.");

    // Test for invalid month from date array.
    $input = array(
      'year' => 2010,
      'month' => 27,
      'day' => 8,
      'hour' => 8,
      'minute' => 0,
      'second' => 0,
    );
    $timezone = 'America/Chicago';
    $date = new DateTimePlus($input, $timezone);
    $this
      ->assertNotEqual(count($date
      ->getErrors()), 0, "array('year' => 2010, 'month' => 27, 'day' => 8, 'hour' => 8, 'minute' => 0, 'second' => 0) contains an invalid month and produces errors.");

    // Test for invalid hour from date array.
    $input = array(
      'year' => 2010,
      'month' => 2,
      'day' => 28,
      'hour' => 80,
      'minute' => 0,
      'second' => 0,
    );
    $timezone = 'America/Chicago';
    $date = new DateTimePlus($input, $timezone);
    $this
      ->assertNotEqual(count($date
      ->getErrors()), 0, "array('year' => 2010, 'month' => 2, 'day' => 28, 'hour' => 80, 'minute' => 0, 'second' => 0) contains an invalid hour and produces errors.");

    // Test for invalid minute from date array.
    $input = array(
      'year' => 2010,
      'month' => 7,
      'day' => 8,
      'hour' => 8,
      'minute' => 88,
      'second' => 0,
    );
    $timezone = 'America/Chicago';
    $date = new DateTimePlus($input, $timezone);
    $this
      ->assertNotEqual(count($date
      ->getErrors()), 0, "array('year' => 2010, 'month' => 7, 'day' => 8, 'hour' => 8, 'minute' => 88, 'second' => 0) contains an invalid minute and produces errors.");
  }

  /**
   * Test that DrupalDateTime can detect the right timezone to use.
   * When specified or not.
   */
  public function testDateTimezone() {
    global $user;
    $date_string = '2007-01-31 21:00:00';

    // Detect the system timezone.
    $system_timezone = date_default_timezone_get();

    // Create a date object with an unspecified timezone, which should
    // end up using the system timezone.
    $date = new DateTimePlus($date_string);
    $timezone = $date
      ->getTimezone()
      ->getName();
    $this
      ->assertTrue($timezone == $system_timezone, 'DateTimePlus uses the system timezone when there is no site timezone.');

    // Create a date object with a specified timezone name.
    $date = new DateTimePlus($date_string, 'America/Yellowknife');
    $timezone = $date
      ->getTimezone()
      ->getName();
    $this
      ->assertTrue($timezone == 'America/Yellowknife', 'DateTimePlus uses the specified timezone if provided.');

    // Create a date object with a timezone object.
    $date = new DateTimePlus($date_string, new \DateTimeZone('Australia/Canberra'));
    $timezone = $date
      ->getTimezone()
      ->getName();
    $this
      ->assertTrue($timezone == 'Australia/Canberra', 'DateTimePlus uses the specified timezone if provided.');

    // Create a date object with another date object.
    $new_date = new DateTimePlus('now', 'Pacific/Midway');
    $date = new DateTimePlus($new_date);
    $timezone = $date
      ->getTimezone()
      ->getName();
    $this
      ->assertTrue($timezone == 'Pacific/Midway', 'DateTimePlus uses the specified timezone if provided.');
  }

}

Classes

Namesort descending Description
DateTimePlusTest