Skip to content

Commit

Permalink
Update according to discussions
Browse files Browse the repository at this point in the history
  • Loading branch information
thiemowmde committed May 6, 2015
1 parent 4218793 commit 28e9b81
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 78 deletions.
8 changes: 4 additions & 4 deletions src/ValueParsers/IsoTimestampParser.php
Original file line number Diff line number Diff line change
Expand Up @@ -173,10 +173,10 @@ private function getPrecisionFromYear( $year ) {
* Determines the calendar model. The calendar model is determined as follows:
*
* - if $timeParts[7] is set, use $this->calendarModelParser to parse it into a URI.
* - otherwise, if $this->getOption( self::OPT_CALENDAR ) is set not null, return
* - otherwise, if $this->getOption( self::OPT_CALENDAR ) is not null, return
* self::CALENDAR_JULIAN if the option is self::CALENDAR_JULIAN, and self::CALENDAR_GREGORIAN
* otherwise.
* - otherwise, use self::CALENDAR_JULIAN for dates before 1582, and self::CALENDAR_GREGORIAN
* - otherwise, use self::CALENDAR_JULIAN for dates before 1583, and self::CALENDAR_GREGORIAN
* for later dates.
*
* @param string[] $timeParts as returned by splitTimeString()
Expand Down Expand Up @@ -211,9 +211,9 @@ private function getCalendarModel( array $timeParts ) {
return $sign === '+' ? self::CALENDAR_GREGORIAN : self::CALENDAR_JULIAN;
}

// The Gregorian calendar was introduced in 1582,
// The Gregorian calendar was introduced in October 1582,
// so we'll default to Julian for all years before that.
return $year >= 1582 ? self::CALENDAR_GREGORIAN : self::CALENDAR_JULIAN;
return $year < 1583 ? self::CALENDAR_JULIAN : self::CALENDAR_GREGORIAN;
}

}
5 changes: 3 additions & 2 deletions tests/ValueParsers/IsoTimestampParserTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -312,16 +312,17 @@ public function validInputProvider() {
);

$argLists = array();

foreach ( $valid as $key => $value ) {
$timestamp = $value[0];
$precision = isset( $value[1] ) ? $value[1] : TimeValue::PRECISION_DAY;
$calendareModel = isset( $value[2] ) ? $value[2] : $gregorian;
$calendarModel = isset( $value[2] ) ? $value[2] : $gregorian;
$options = isset( $value[3] ) ? $value[3] : null;

$argLists[] = array(
// Because PHP magically turns numeric keys into ints/floats
(string)$key,
new TimeValue( $timestamp, 0, 0, 0, $precision, $calendareModel ),
new TimeValue( $timestamp, 0, 0, 0, $precision, $calendarModel ),
new IsoTimestampParser( new CalendarModelParser( $options ), $options )
);
}
Expand Down
146 changes: 74 additions & 72 deletions tests/ValueParsers/PhpDateTimeParserTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -76,148 +76,150 @@ function( $value ) {
* @see ValueParserTestBase::validInputProvider
*/
public function validInputProvider() {
$gregorian = 'http://www.wikidata.org/entity/Q1985727';
$julian = 'http://www.wikidata.org/entity/Q1985786';
$argList = array();

$valid = array(
// Normal/easy dates
'10/10/2010' =>
array( '+0000000000002010-10-10T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000002010-10-10T00:00:00Z' ),
'10.10.2010' =>
array( '+0000000000002010-10-10T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000002010-10-10T00:00:00Z' ),
' 10. 10. 2010 ' =>
array( '+0000000000002010-10-10T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000002010-10-10T00:00:00Z' ),
'10 10 2010' =>
array( '+0000000000002010-10-10T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000002010-10-10T00:00:00Z' ),
'10/10/0010' =>
array( '+0000000000000010-10-10T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000010-10-10T00:00:00Z', TimeValue::PRECISION_DAY, $julian ),
'1 July 2013' =>
array( '+0000000000002013-07-01T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000002013-07-01T00:00:00Z' ),
'1. July 2013' =>
array( '+0000000000002013-07-01T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000002013-07-01T00:00:00Z' ),
'1 Jul 2013' =>
array( '+0000000000002013-07-01T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000002013-07-01T00:00:00Z' ),
'January 9 1920' =>
array( '+0000000000001920-01-09T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000001920-01-09T00:00:00Z' ),
'Feb 11 1930' =>
array( '+0000000000001930-02-11T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000001930-02-11T00:00:00Z' ),
'1st July 2013' =>
array( '+0000000000002013-07-01T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000002013-07-01T00:00:00Z' ),
'2nd July 2013' =>
array( '+0000000000002013-07-02T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000002013-07-02T00:00:00Z' ),
'3rd July 2013' =>
array( '+0000000000002013-07-03T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000002013-07-03T00:00:00Z' ),
'1th July 2013' =>
array( '+0000000000002013-07-01T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000002013-07-01T00:00:00Z' ),
'2th July 2013' =>
array( '+0000000000002013-07-02T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000002013-07-02T00:00:00Z' ),
'3th July 2013' =>
array( '+0000000000002013-07-03T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000002013-07-03T00:00:00Z' ),
'4th July 2013' =>
array( '+0000000000002013-07-04T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000002013-07-04T00:00:00Z' ),

// Year first dates
'2009-01-09' =>
array( '+0000000000002009-01-09T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000002009-01-09T00:00:00Z' ),
'55-01-09' =>
array( '+0000000000000055-01-09T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000055-01-09T00:00:00Z', TimeValue::PRECISION_DAY, $julian ),
'555-01-09' =>
array( '+0000000000000555-01-09T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000555-01-09T00:00:00Z', TimeValue::PRECISION_DAY, $julian ),
'33300-1-1' =>
array( '+0000000000033300-01-01T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000033300-01-01T00:00:00Z' ),
'3330002-1-1' =>
array( '+0000000003330002-01-01T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000003330002-01-01T00:00:00Z' ),

// Less than 4 digit years
'10/10/10' =>
array( '+0000000000000010-10-10T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000010-10-10T00:00:00Z', TimeValue::PRECISION_DAY, $julian ),
'9 Jan 09' =>
array( '+0000000000000009-01-09T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000009-01-09T00:00:00Z', TimeValue::PRECISION_DAY, $julian ),
'1/1/1' =>
array( '+0000000000000001-01-01T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000001-01-01T00:00:00Z', TimeValue::PRECISION_DAY, $julian ),
'1-1-1' =>
array( '+0000000000000001-01-01T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000001-01-01T00:00:00Z', TimeValue::PRECISION_DAY, $julian ),
'31-1-55' =>
array( '+0000000000000055-01-31T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000055-01-31T00:00:00Z', TimeValue::PRECISION_DAY, $julian ),
'10-10-100' =>
array( '+0000000000000100-10-10T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000100-10-10T00:00:00Z', TimeValue::PRECISION_DAY, $julian ),
'4th July 11' =>
array( '+0000000000000011-07-04T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000011-07-04T00:00:00Z', TimeValue::PRECISION_DAY, $julian ),
'4th July 111' =>
array( '+0000000000000111-07-04T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000111-07-04T00:00:00Z', TimeValue::PRECISION_DAY, $julian ),
'4th July 1' =>
array( '+0000000000000001-07-04T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000001-07-04T00:00:00Z', TimeValue::PRECISION_DAY, $julian ),
'12.Jun.10x' =>
array( '+0000000000000010-06-12T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000010-06-12T00:00:00Z', TimeValue::PRECISION_DAY, $julian ),

// More than 4 digit years
'4th July 10000' =>
array( '+0000000000010000-07-04T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000010000-07-04T00:00:00Z' ),
'10/10/22000' =>
array( '+0000000000022000-10-10T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000022000-10-10T00:00:00Z' ),
'1-1-33300' =>
array( '+0000000000033300-01-01T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000033300-01-01T00:00:00Z' ),
'4th July 7214614279199781' =>
array( '+7214614279199781-07-04T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+7214614279199781-07-04T00:00:00Z' ),
'-10100-02-29' =>
array( '-0000000000010100-03-01T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_JULIAN ),
array( '-0000000000010100-03-01T00:00:00Z', TimeValue::PRECISION_DAY, $julian ),

// Years with leading zeros
'009-08-07' =>
array( '+0000000000000009-08-07T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000009-08-07T00:00:00Z', TimeValue::PRECISION_DAY, $julian ),
'000001-07-04' =>
array( '+0000000000000001-07-04T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000001-07-04T00:00:00Z', TimeValue::PRECISION_DAY, $julian ),
'0000001-07-04' =>
array( '+0000000000000001-07-04T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000001-07-04T00:00:00Z', TimeValue::PRECISION_DAY, $julian ),
'00000001-07-04' =>
array( '+0000000000000001-07-04T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000001-07-04T00:00:00Z', TimeValue::PRECISION_DAY, $julian ),
'000000001-07-04' =>
array( '+0000000000000001-07-04T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000001-07-04T00:00:00Z', TimeValue::PRECISION_DAY, $julian ),
'00000000000-07-04' =>
array( '+0000000000000000-07-04T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000000-07-04T00:00:00Z', TimeValue::PRECISION_DAY, $julian ),
'4th July 00000002015' =>
array( '+0000000000002015-07-04T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000002015-07-04T00:00:00Z' ),
'00000002015-07-04' =>
array( '+0000000000002015-07-04T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000002015-07-04T00:00:00Z' ),
'4th July 00000092015' =>
array( '+0000000000092015-07-04T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000092015-07-04T00:00:00Z' ),
'00000092015-07-04' =>
array( '+0000000000092015-07-04T00:00:00Z', 0, 0, 0, TimeValue::PRECISION_DAY, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000092015-07-04T00:00:00Z' ),

// Hour, minute and second precision
'4 July 2015 23:59' =>
array( '+0000000000002015-07-04T23:59:00Z', 0, 0, 0, TimeValue::PRECISION_MINUTE, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000002015-07-04T23:59:00Z', TimeValue::PRECISION_MINUTE ),
'4 July 100 23:59' =>
array( '+0000000000000100-07-04T23:59:00Z', 0, 0, 0, TimeValue::PRECISION_MINUTE, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000100-07-04T23:59:00Z', TimeValue::PRECISION_MINUTE, $julian ),
'4 July 015 23:59' =>
array( '+0000000000000015-07-04T23:59:00Z', 0, 0, 0, TimeValue::PRECISION_MINUTE, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000015-07-04T23:59:00Z', TimeValue::PRECISION_MINUTE, $julian ),
'4 July 15 23:59' =>
array( '+0000000000000015-07-04T23:59:00Z', 0, 0, 0, TimeValue::PRECISION_MINUTE, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000015-07-04T23:59:00Z', TimeValue::PRECISION_MINUTE, $julian ),
'4.7.015 23:59' =>
array( '+0000000000000015-07-04T23:59:00Z', 0, 0, 0, TimeValue::PRECISION_MINUTE, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000015-07-04T23:59:00Z', TimeValue::PRECISION_MINUTE, $julian ),
'4.7.15 23:59' =>
array( '+0000000000000015-07-04T23:59:00Z', 0, 0, 0, TimeValue::PRECISION_MINUTE, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000015-07-04T23:59:00Z', TimeValue::PRECISION_MINUTE, $julian ),
'4/7/015 23:59' =>
array( '+0000000000000015-04-07T23:59:00Z', 0, 0, 0, TimeValue::PRECISION_MINUTE, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000015-04-07T23:59:00Z', TimeValue::PRECISION_MINUTE, $julian ),
'4/7/15 23:59' =>
array( '+0000000000000015-04-07T23:59:00Z', 0, 0, 0, TimeValue::PRECISION_MINUTE, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000015-04-07T23:59:00Z', TimeValue::PRECISION_MINUTE, $julian ),
'4th July 2015 12:00' =>
array( '+0000000000002015-07-04T12:00:00Z', 0, 0, 0, TimeValue::PRECISION_HOUR, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000002015-07-04T12:00:00Z', TimeValue::PRECISION_HOUR ),
'2015-07-04 12:00' =>
array( '+0000000000002015-07-04T12:00:00Z', 0, 0, 0, TimeValue::PRECISION_HOUR, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000002015-07-04T12:00:00Z', TimeValue::PRECISION_HOUR ),
'2015-07-04 12:30' =>
array( '+0000000000002015-07-04T12:30:00Z', 0, 0, 0, TimeValue::PRECISION_MINUTE, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000002015-07-04T12:30:00Z', TimeValue::PRECISION_MINUTE ),
'2015-07-04 12:30:29' =>
array( '+0000000000002015-07-04T12:30:29Z', 0, 0, 0, TimeValue::PRECISION_SECOND, IsoTimestampParser::CALENDAR_GREGORIAN ),
array( '+0000000000002015-07-04T12:30:29Z', TimeValue::PRECISION_SECOND ),
'15.07.04 23:59' =>
array( '+0000000000000004-07-15T23:59:00Z', 0, 0, 0, TimeValue::PRECISION_MINUTE, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000004-07-15T23:59:00Z', TimeValue::PRECISION_MINUTE, $julian ),
'15.07.04 00:01' =>
array( '+0000000000000004-07-15T00:01:00Z', 0, 0, 0, TimeValue::PRECISION_MINUTE, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000004-07-15T00:01:00Z', TimeValue::PRECISION_MINUTE, $julian ),
'15-07-01 12:37:00' =>
array( '+0000000000000001-07-15T12:37:00Z', 0, 0, 0, TimeValue::PRECISION_MINUTE, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000001-07-15T12:37:00Z', TimeValue::PRECISION_MINUTE, $julian ),
'4th July 15 12:00' =>
array( '+0000000000000015-07-04T12:00:00Z', 0, 0, 0, TimeValue::PRECISION_HOUR, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000015-07-04T12:00:00Z', TimeValue::PRECISION_HOUR, $julian ),
'July 4th 15 12:00' =>
array( '+0000000000000015-07-04T12:00:00Z', 0, 0, 0, TimeValue::PRECISION_HOUR, IsoTimestampParser::CALENDAR_JULIAN ),
array( '+0000000000000015-07-04T12:00:00Z', TimeValue::PRECISION_HOUR, $julian ),

// Testing leap year stuff
'10000-02-29' =>
Expand All @@ -229,15 +231,15 @@ public function validInputProvider() {
);

foreach ( $valid as $value => $args ) {
$expected = new TimeValue(
$args[0],
array_key_exists( 1, $args ) ? $args[1] : 0,
array_key_exists( 2, $args ) ? $args[2] : 0,
array_key_exists( 3, $args ) ? $args[3] : 0,
array_key_exists( 4, $args ) ? $args[4] : TimeValue::PRECISION_DAY,
array_key_exists( 5, $args ) ? $args[5] : IsoTimestampParser::CALENDAR_GREGORIAN
$timestamp = $args[0];
$precision = isset( $args[1] ) ? $args[1] : TimeValue::PRECISION_DAY;
$calendarModel = isset( $args[2] ) ? $args[2] : $gregorian;

$argList[] = array(
// Because PHP magically turns numeric keys into ints/floats
(string)$value,
new TimeValue( $timestamp, 0, 0, 0, $precision, $calendarModel )
);
$argList[] = array( (string)$value, $expected );
}

return $argList;
Expand Down

0 comments on commit 28e9b81

Please sign in to comment.