You are here

class DateTimePlusTest in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 core/tests/Drupal/Tests/Component/Datetime/DateTimePlusTest.php \Drupal\Tests\Component\Datetime\DateTimePlusTest

@coversDefaultClass \Drupal\Component\Datetime\DateTimePlus @group Datetime

Hierarchy

Expanded class hierarchy of DateTimePlusTest

File

core/tests/Drupal/Tests/Component/Datetime/DateTimePlusTest.php, line 17
Contains \Drupal\Tests\Component\Datetime\DateTimePlusTest.

Namespace

Drupal\Tests\Component\Datetime
View source
class DateTimePlusTest extends UnitTestCase {

  /**
   * Test creating dates from string and array input.
   *
   * @param mixed $input
   *   Input argument for DateTimePlus.
   * @param string $timezone
   *   Timezone argument for DateTimePlus.
   * @param string $expected
   *   Expected output from DateTimePlus::format().
   *
   * @dataProvider providerTestDates
   */
  public function testDates($input, $timezone, $expected) {
    $date = new DateTimePlus($input, $timezone);
    $value = $date
      ->format('c');
    if (is_array($input)) {
      $input = var_export($input, TRUE);
    }
    $this
      ->assertEquals($expected, $value, sprintf("Test new DateTimePlus(%s, %s): should be %s, found %s.", $input, $timezone, $expected, $value));
  }

  /**
   * Test creating dates from string and array input.
   *
   * @param mixed $input
   *   Input argument for DateTimePlus.
   * @param string $timezone
   *   Timezone argument for DateTimePlus.
   * @param string $expected
   *   Expected output from DateTimePlus::format().
   *
   * @dataProvider providerTestDateArrays
   */
  public function testDateArrays($input, $timezone, $expected) {
    $date = DateTimePlus::createFromArray($input, $timezone);
    $value = $date
      ->format('c');
    if (is_array($input)) {
      $input = var_export($input, TRUE);
    }
    $this
      ->assertEquals($expected, $value, sprintf("Test new DateTimePlus(%s, %s): should be %s, found %s.", $input, $timezone, $expected, $value));
  }

  /**
   * Test creating dates from invalid array input.
   *
   * @param mixed $input
   *   Input argument for DateTimePlus.
   * @param string $timezone
   *   Timezone argument for DateTimePlus.
   *
   * @dataProvider providerTestInvalidDateArrays
   * @expectedException \Exception
   */
  public function testInvalidDateArrays($input, $timezone) {
    $this
      ->assertInstanceOf('\\Drupal\\Component\\DateTimePlus', DateTimePlus::createFromArray($input, $timezone));
  }

  /**
   * Test creating dates from timestamps, and manipulating timezones.
   *
   * @param int $input
   *   Input argument for DateTimePlus::createFromTimestamp().
   * @param array $initial
   *   An array containing:
   *   - 'timezone_initial' - Timezone argument for DateTimePlus.
   *   - 'format_initial' - Format argument for DateTimePlus.
   *   - 'expected_initial_date' - Expected output from DateTimePlus::format().
   *   - 'expected_initial_timezone' - Expected output from
   *      DateTimePlus::getTimeZone()::getName().
   *   - 'expected_initial_offset' - Expected output from DateTimePlus::getOffset().
   * @param array $transform
   *   An array containing:
   *   - 'timezone_transform' - Argument to transform date to another timezone via
   *     DateTimePlus::setTimezone().
   *   - 'format_transform' - Format argument to use when transforming date to
   *     another timezone.
   *   - 'expected_transform_date' - Expected output from DateTimePlus::format(),
   *     after timezone transform.
   *   - 'expected_transform_timezone' - Expected output from
   *     DateTimePlus::getTimeZone()::getName(), after timezone transform.
   *   - 'expected_transform_offset' - Expected output from
   *      DateTimePlus::getOffset(), after timezone transform.
   *
   * @dataProvider providerTestTimestamp
   */
  public function testTimestamp($input, array $initial, array $transform) {

    // Initialize a new date object.
    $date = DateTimePlus::createFromTimestamp($input, $initial['timezone']);
    $this
      ->assertDateTimestamp($date, $input, $initial, $transform);
  }

  /**
   * Test creating dates from datetime strings.
   *
   * @param string $input
   *   Input argument for DateTimePlus().
   * @param array $initial
   *   @see testTimestamp()
   * @param array $transform
   *   @see testTimestamp()
   *
   * @dataProvider providerTestDateTimestamp
   */
  public function testDateTimestamp($input, array $initial, array $transform) {

    // Initialize a new date object.
    $date = new DateTimePlus($input, $initial['timezone']);
    $this
      ->assertDateTimestamp($date, $input, $initial, $transform);
  }

  /**
   * Assertion helper for testTimestamp and testDateTimestamp since they need
   * different dataProviders.
   *
   * @param DateTimePlus $date
   *   DateTimePlus to test.
   * @input mixed $input
   *   The original input passed to the test method.
   * @param array $initial
   *   @see testTimestamp()
   * @param array $transform
   *   @see testTimestamp()
   */
  public function assertDateTimestamp($date, $input, $initial, $transform) {

    // Check format.
    $value = $date
      ->format($initial['format']);
    $this
      ->assertEquals($initial['expected_date'], $value, sprintf("Test new DateTimePlus(%s, %s): should be %s, found %s.", $input, $initial['timezone'], $initial['expected_date'], $value));

    // Check timezone name.
    $value = $date
      ->getTimeZone()
      ->getName();
    $this
      ->assertEquals($initial['expected_timezone'], $value, sprintf("The current timezone is %s: should be %s.", $value, $initial['expected_timezone']));

    // Check offset.
    $value = $date
      ->getOffset();
    $this
      ->assertEquals($initial['expected_offset'], $value, sprintf("The current offset is %s: should be %s.", $value, $initial['expected_offset']));

    // Transform the date to another timezone.
    $date
      ->setTimezone(new \DateTimeZone($transform['timezone']));

    // Check transformed format.
    $value = $date
      ->format($transform['format']);
    $this
      ->assertEquals($transform['expected_date'], $value, sprintf("Test \$date->setTimezone(new \\DateTimeZone(%s)): should be %s, found %s.", $transform['timezone'], $transform['expected_date'], $value));

    // Check transformed timezone.
    $value = $date
      ->getTimeZone()
      ->getName();
    $this
      ->assertEquals($transform['expected_timezone'], $value, sprintf("The current timezone should be %s, found %s.", $transform['expected_timezone'], $value));

    // Check transformed offset.
    $value = $date
      ->getOffset();
    $this
      ->assertEquals($transform['expected_offset'], $value, sprintf("The current offset should be %s, found %s.", $transform['expected_offset'], $value));
  }

  /**
   * Test creating dates from format strings.
   *
   * @param string $input
   *   Input argument for DateTimePlus.
   * @param string $timezone
   *   Timezone argument for DateTimePlus.
   * @param string $format_date
   *   Format argument for DateTimePlus::format().
   * @param string $expected
   *   Expected output from DateTimePlus::format().
   *
   * @dataProvider providerTestDateFormat
   */
  public function testDateFormat($input, $timezone, $format, $format_date, $expected) {
    $date = DateTimePlus::createFromFormat($format, $input, $timezone);
    $value = $date
      ->format($format_date);
    $this
      ->assertEquals($expected, $value, sprintf("Test new DateTimePlus(%s, %s, %s): should be %s, found %s.", $input, $timezone, $format, $expected, $value));
  }

  /**
   * Test invalid date handling.
   *
   * @param mixed $input
   *   Input argument for DateTimePlus.
   * @param string $timezone
   *   Timezone argument for DateTimePlus.
   * @param string $format
   *   Format argument for DateTimePlus.
   * @param string $message
   *   Message to print if no errors are thrown by the invalid dates.
   *
   * @dataProvider providerTestInvalidDates
   * @expectedException \Exception
   */
  public function testInvalidDates($input, $timezone, $format, $message) {
    DateTimePlus::createFromFormat($format, $input, $timezone);
  }

  /**
   * Tests that DrupalDateTime can detect the right timezone to use.
   * When specified or not.
   *
   * @param mixed $input
   *   Input argument for DateTimePlus.
   * @param mixed $timezone
   *   Timezone argument for DateTimePlus.
   * @param string $expected_timezone
   *   Expected timezone returned from DateTimePlus::getTimezone::getName().
   * @param string $message
   *   Message to print on test failure.
   *
   * @dataProvider providerTestDateTimezone
   */
  public function testDateTimezone($input, $timezone, $expected_timezone, $message) {
    $date = new DateTimePlus($input, $timezone);
    $timezone = $date
      ->getTimezone()
      ->getName();
    $this
      ->assertEquals($timezone, $expected_timezone, $message);
  }

  /**
   * Test that DrupalDateTime can detect the right timezone to use when
   * constructed from a datetime object.
   */
  public function testDateTimezoneWithDateTimeObject() {

    // Create a date object with another date object.
    $input = new \DateTime('now', new \DateTimeZone('Pacific/Midway'));
    $timezone = NULL;
    $expected_timezone = 'Pacific/Midway';
    $message = 'DateTimePlus uses the specified timezone if provided.';
    $date = DateTimePlus::createFromDateTime($input, $timezone);
    $timezone = $date
      ->getTimezone()
      ->getName();
    $this
      ->assertEquals($timezone, $expected_timezone, $message);
  }

  /**
   * Provides data for date tests.
   *
   * @return array
   *   An array of arrays, each containing the input parameters for
   *   DateTimePlusTest::testDates().
   *
   * @see DateTimePlusTest::testDates().
   */
  public function providerTestDates() {
    return array(
      // String input.
      // Create date object from datetime string.
      array(
        '2009-03-07 10:30',
        'America/Chicago',
        '2009-03-07T10:30:00-06:00',
      ),
      // Same during daylight savings time.
      array(
        '2009-06-07 10:30',
        'America/Chicago',
        '2009-06-07T10:30:00-05:00',
      ),
      // Create date object from date string.
      array(
        '2009-03-07',
        'America/Chicago',
        '2009-03-07T00:00:00-06:00',
      ),
      // Same during daylight savings time.
      array(
        '2009-06-07',
        'America/Chicago',
        '2009-06-07T00:00:00-05:00',
      ),
      // Create date object from date string.
      array(
        '2009-03-07 10:30',
        'Australia/Canberra',
        '2009-03-07T10:30:00+11:00',
      ),
      // Same during daylight savings time.
      array(
        '2009-06-07 10:30',
        'Australia/Canberra',
        '2009-06-07T10:30:00+10:00',
      ),
    );
  }

  /**
   * Provides data for date tests.
   *
   * @return array
   *   An array of arrays, each containing the input parameters for
   *   DateTimePlusTest::testDates().
   *
   * @see DateTimePlusTest::testDates().
   */
  public function providerTestDateArrays() {
    return array(
      // Array input.
      // Create date object from date array, date only.
      array(
        array(
          'year' => 2010,
          'month' => 2,
          'day' => 28,
        ),
        'America/Chicago',
        '2010-02-28T00:00:00-06:00',
      ),
      // Create date object from date array with hour.
      array(
        array(
          'year' => 2010,
          'month' => 2,
          'day' => 28,
          'hour' => 10,
        ),
        'America/Chicago',
        '2010-02-28T10:00:00-06:00',
      ),
      // Create date object from date array, date only.
      array(
        array(
          'year' => 2010,
          'month' => 2,
          'day' => 28,
        ),
        'Europe/Berlin',
        '2010-02-28T00:00:00+01:00',
      ),
      // Create date object from date array with hour.
      array(
        array(
          'year' => 2010,
          'month' => 2,
          'day' => 28,
          'hour' => 10,
        ),
        'Europe/Berlin',
        '2010-02-28T10:00:00+01:00',
      ),
    );
  }

  /**
   * Provides data for testDateFormats.
   *
   * @return array
   *   An array of arrays, each containing:
   *   - 'input' - Input to DateTimePlus.
   *   - 'timezone' - Timezone for DateTimePlus.
   *   - 'format' - Date format for DateTimePlus.
   *   - 'format_date' - Date format for use in $date->format() method.
   *   - 'expected' - The expected return from DateTimePlus.
   *
   * @see testDateFormats()
   */
  public function providerTestDateFormat() {
    return array(
      // Create a year-only date.
      array(
        '2009',
        NULL,
        'Y',
        'Y',
        '2009',
      ),
      // Create a month and year-only date.
      array(
        '2009-10',
        NULL,
        'Y-m',
        'Y-m',
        '2009-10',
      ),
      // Create a time-only date.
      array(
        'T10:30:00',
        NULL,
        '\\TH:i:s',
        'H:i:s',
        '10:30:00',
      ),
      // Create a time-only date.
      array(
        '10:30:00',
        NULL,
        'H:i:s',
        'H:i:s',
        '10:30:00',
      ),
    );
  }

  /**
   * Provides data for testInvalidDates.
   *
   * @return array
   *   An array of arrays, each containing:
   *   - 'input' - Input for DateTimePlus.
   *   - 'timezone' - Timezone for DateTimePlus.
   *   - 'format' - Format for DateTimePlus.
   *   - 'message' - Message to display on failure.
   *
   * @see testInvalidDates
   */
  public function providerTestInvalidDates() {
    return array(
      // Test for invalid month names when we are using a short version
      // of the month.
      array(
        '23 abc 2012',
        NULL,
        'd M Y',
        "23 abc 2012 contains an invalid month name and did not produce errors.",
      ),
      // Test for invalid hour.
      array(
        '0000-00-00T45:30:00',
        NULL,
        'Y-m-d\\TH:i:s',
        "0000-00-00T45:30:00 contains an invalid hour and did not produce errors.",
      ),
      // Test for invalid day.
      array(
        '0000-00-99T05:30:00',
        NULL,
        'Y-m-d\\TH:i:s',
        "0000-00-99T05:30:00 contains an invalid day and did not produce errors.",
      ),
      // Test for invalid month.
      array(
        '0000-75-00T15:30:00',
        NULL,
        'Y-m-d\\TH:i:s',
        "0000-75-00T15:30:00 contains an invalid month and did not produce errors.",
      ),
      // Test for invalid year.
      array(
        '11-08-01T15:30:00',
        NULL,
        'Y-m-d\\TH:i:s',
        "11-08-01T15:30:00 contains an invalid year and did not produce errors.",
      ),
    );
  }

  /**
   * Data provider for testInvalidDateArrays.
   *
   * @return array
   *   An array of arrays, each containing:
   *   - 'input' - Input for DateTimePlus.
   *   - 'timezone' - Timezone for DateTimePlus.
   *
   * @see testInvalidDateArrays
   */
  public function providerTestInvalidDateArrays() {
    return array(
      // One year larger than the documented upper limit of checkdate().
      array(
        array(
          'year' => 32768,
          'month' => 1,
          'day' => 8,
          'hour' => 8,
          'minute' => 0,
          'second' => 0,
        ),
        'America/Chicago',
      ),
      // One year smaller than the documented lower limit of checkdate().
      array(
        array(
          'year' => 0,
          'month' => 1,
          'day' => 8,
          'hour' => 8,
          'minute' => 0,
          'second' => 0,
        ),
        'America/Chicago',
      ),
      // Test for invalid month from date array.
      array(
        array(
          'year' => 2010,
          'month' => 27,
          'day' => 8,
          'hour' => 8,
          'minute' => 0,
          'second' => 0,
        ),
        'America/Chicago',
      ),
      // Test for invalid hour from date array.
      array(
        array(
          'year' => 2010,
          'month' => 2,
          'day' => 28,
          'hour' => 80,
          'minute' => 0,
          'second' => 0,
        ),
        'America/Chicago',
      ),
      // Test for invalid minute from date array.
      array(
        array(
          'year' => 2010,
          'month' => 7,
          'day' => 8,
          'hour' => 8,
          'minute' => 88,
          'second' => 0,
        ),
        'America/Chicago',
      ),
      // Regression test for https://www.drupal.org/node/2084455.
      array(
        array(
          'hour' => 59,
          'minute' => 1,
          'second' => 1,
        ),
        'America/Chicago',
      ),
    );
  }

  /**
   * Provides data for testDateTimezone.
   *
   * @return array
   *   An array of arrays, each containing:
   *   - 'date' - Date string or object for DateTimePlus.
   *   - 'timezone' - Timezone string for DateTimePlus.
   *   - 'expected' - Expected return from DateTimePlus::getTimezone()::getName().
   *   - 'message' - Message to display on test failure.
   *
   * @see testDateTimezone
   */
  public function providerTestDateTimezone() {

    // Use a common date for most of the tests.
    $date_string = '2007-01-31 21:00:00';

    // Detect the system timezone.
    $system_timezone = date_default_timezone_get();
    return array(
      // Create a date object with an unspecified timezone, which should
      // end up using the system timezone.
      array(
        $date_string,
        NULL,
        $system_timezone,
        'DateTimePlus uses the system timezone when there is no site timezone.',
      ),
      // Create a date object with a specified timezone name.
      array(
        $date_string,
        'America/Yellowknife',
        'America/Yellowknife',
        'DateTimePlus uses the specified timezone if provided.',
      ),
      // Create a date object with a timezone object.
      array(
        $date_string,
        new \DateTimeZone('Australia/Canberra'),
        'Australia/Canberra',
        'DateTimePlus uses the specified timezone if provided.',
      ),
      // Create a date object with another date object.
      array(
        new DateTimePlus('now', 'Pacific/Midway'),
        NULL,
        'Pacific/Midway',
        'DateTimePlus uses the specified timezone if provided.',
      ),
    );
  }

  /**
   * Provides data for testTimestamp.
   *
   * @return array
   *   An array of arrays, each containing the arguments required for
   *   self::testTimestamp().
   *
   * @see testTimestamp()
   */
  public function providerTestTimestamp() {
    return array(
      // Create date object from a unix timestamp and display it in
      // local time.
      array(
        'input' => 0,
        'initial' => array(
          'timezone' => 'UTC',
          'format' => 'c',
          'expected_date' => '1970-01-01T00:00:00+00:00',
          'expected_timezone' => 'UTC',
          'expected_offset' => 0,
        ),
        'transform' => array(
          'timezone' => 'America/Los_Angeles',
          'format' => 'c',
          'expected_date' => '1969-12-31T16:00:00-08:00',
          'expected_timezone' => 'America/Los_Angeles',
          'expected_offset' => '-28800',
        ),
      ),
      // Create a date using the timestamp of zero, then display its
      // value both in UTC and the local timezone.
      array(
        'input' => 0,
        'initial' => array(
          'timezone' => 'America/Los_Angeles',
          'format' => 'c',
          'expected_date' => '1969-12-31T16:00:00-08:00',
          'expected_timezone' => 'America/Los_Angeles',
          'expected_offset' => '-28800',
        ),
        'transform' => array(
          'timezone' => 'UTC',
          'format' => 'c',
          'expected_date' => '1970-01-01T00:00:00+00:00',
          'expected_timezone' => 'UTC',
          'expected_offset' => 0,
        ),
      ),
    );
  }

  /**
   * Provides data for testDateTimestamp.
   *
   * @return array
   *   An array of arrays, each containing the arguments required for
   *   self::testDateTimestamp().
   *
   * @see testDateTimestamp()
   */
  public function providerTestDateTimestamp() {
    return array(
      // Create date object from datetime string in UTC, and convert
      // it to a local date.
      array(
        'input' => '1970-01-01 00:00:00',
        'initial' => array(
          'timezone' => 'UTC',
          'format' => 'c',
          'expected_date' => '1970-01-01T00:00:00+00:00',
          'expected_timezone' => 'UTC',
          'expected_offset' => 0,
        ),
        'transform' => array(
          'timezone' => 'America/Los_Angeles',
          'format' => 'c',
          'expected_date' => '1969-12-31T16:00:00-08:00',
          'expected_timezone' => 'America/Los_Angeles',
          'expected_offset' => '-28800',
        ),
      ),
      // Convert the local time to UTC using string input.
      array(
        'input' => '1969-12-31 16:00:00',
        'initial' => array(
          'timezone' => 'America/Los_Angeles',
          'format' => 'c',
          'expected_date' => '1969-12-31T16:00:00-08:00',
          'expected_timezone' => 'America/Los_Angeles',
          'expected_offset' => '-28800',
        ),
        'transform' => array(
          'timezone' => 'UTC',
          'format' => 'c',
          'expected_date' => '1970-01-01T00:00:00+00:00',
          'expected_timezone' => 'UTC',
          'expected_offset' => 0,
        ),
      ),
      // Convert the local time to UTC using string input.
      array(
        'input' => '1969-12-31 16:00:00',
        'initial' => array(
          'timezone' => 'Europe/Warsaw',
          'format' => 'c',
          'expected_date' => '1969-12-31T16:00:00+01:00',
          'expected_timezone' => 'Europe/Warsaw',
          'expected_offset' => '+3600',
        ),
        'transform' => array(
          'timezone' => 'UTC',
          'format' => 'c',
          'expected_date' => '1969-12-31T15:00:00+00:00',
          'expected_timezone' => 'UTC',
          'expected_offset' => 0,
        ),
      ),
    );
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DateTimePlusTest::assertDateTimestamp public function Assertion helper for testTimestamp and testDateTimestamp since they need different dataProviders.
DateTimePlusTest::providerTestDateArrays public function Provides data for date tests.
DateTimePlusTest::providerTestDateFormat public function Provides data for testDateFormats.
DateTimePlusTest::providerTestDates public function Provides data for date tests.
DateTimePlusTest::providerTestDateTimestamp public function Provides data for testDateTimestamp.
DateTimePlusTest::providerTestDateTimezone public function Provides data for testDateTimezone.
DateTimePlusTest::providerTestInvalidDateArrays public function Data provider for testInvalidDateArrays.
DateTimePlusTest::providerTestInvalidDates public function Provides data for testInvalidDates.
DateTimePlusTest::providerTestTimestamp public function Provides data for testTimestamp.
DateTimePlusTest::testDateArrays public function Test creating dates from string and array input.
DateTimePlusTest::testDateFormat public function Test creating dates from format strings.
DateTimePlusTest::testDates public function Test creating dates from string and array input.
DateTimePlusTest::testDateTimestamp public function Test creating dates from datetime strings.
DateTimePlusTest::testDateTimezone public function Tests that DrupalDateTime can detect the right timezone to use. When specified or not.
DateTimePlusTest::testDateTimezoneWithDateTimeObject public function Test that DrupalDateTime can detect the right timezone to use when constructed from a datetime object.
DateTimePlusTest::testInvalidDateArrays public function Test creating dates from invalid array input.
DateTimePlusTest::testInvalidDates public function Test invalid date handling.
DateTimePlusTest::testTimestamp public function Test creating dates from timestamps, and manipulating timezones.
UnitTestCase::$randomGenerator protected property The random generator.
UnitTestCase::$root protected property The app root.
UnitTestCase::assertArrayEquals protected function Asserts if two arrays are equal by sorting them first.
UnitTestCase::getBlockMockWithMachineName protected function Mocks a block with a block plugin.
UnitTestCase::getClassResolverStub protected function Returns a stub class resolver.
UnitTestCase::getConfigFactoryStub public function Returns a stub config factory that behaves according to the passed in array.
UnitTestCase::getConfigStorageStub public function Returns a stub config storage that returns the supplied configuration.
UnitTestCase::getContainerWithCacheTagsInvalidator protected function Sets up a container with a cache tags invalidator.
UnitTestCase::getRandomGenerator protected function Gets the random generator for the utility methods.
UnitTestCase::getStringTranslationStub public function Returns a stub translation manager that just returns the passed string.
UnitTestCase::randomMachineName public function Generates a unique random string containing letters and numbers.
UnitTestCase::setUp protected function 259