ISO8601: Removed non-extended forms

- Removed support for non-extended forms, which is approximately half of the
  formats.  These include:
    YYYYMMDD
    YYYYWww
    YYYYWwwD
    hhmmѕsZ
    hhmmZ
    hhZ
  and combinations thereof. Essentially all forms that contains run-on sequences
  of integers, without separators. These removed forms will still be supported
  via rc.dateformat.
- Removed unsupported forms from iso8601d.t.cpp.
- Removed unsupported forms from datetime-negative.t, and corrected the tests
  that now succeed.
This commit is contained in:
Paul Beckingham 2015-06-27 13:48:42 -04:00
parent 6f38d531a1
commit 4b8fdd0fbe
4 changed files with 8 additions and 396 deletions

View file

@ -61,16 +61,9 @@ void ISO8601d::ambiguity (bool value)
// | date-ext 'T' time-ext offset-ext # Specified TZ // | date-ext 'T' time-ext offset-ext # Specified TZ
// | date-ext 'T' time-ext # Local // | date-ext 'T' time-ext # Local
// | date-ext # Local // | date-ext # Local
// | date 'T' time 'Z'
// | date 'T' time offset-ext
// | date 'T' time
// | date
// | time-ext 'Z' // | time-ext 'Z'
// | time-ext offset-ext Not needed // | time-ext offset-ext Not needed
// | time-ext // | time-ext
// | time 'Z'
// | time offset
// | time
// ; // ;
// //
// date-ext ::= ±YYYYY-MM-DD Νot needed // date-ext ::= ±YYYYY-MM-DD Νot needed
@ -83,37 +76,14 @@ void ISO8601d::ambiguity (bool value)
// | YYYY-Www // | YYYY-Www
// ; // ;
// //
// date ::= ±YYYYYMMDD Νot needed
// | ±YYYYYWwwD Νot needed
// | ±YYYYYWww Νot needed
// | ±YYYYYDDD Νot needed
// | ±YYYYYMM Νot needed
// | ±YYYYY Νot needed
// | ±YYY Νot needed
// | YYYYMMDD Ambiguous (number)
// | YYYYWwwD
// | YYYYWww
// | YYYYDDD Ambiguous (number)
// | YYYY-MM
// | YYYY Ambiguous (number)
// | YY Ambiguous (number)
// ;
//
// time-ext ::= hh:mm:ss[,ss] // time-ext ::= hh:mm:ss[,ss]
// | hh:mm[,mm] // | hh:mm[,mm]
// | hh[,hh] Ambiguous (number) // | hh[,hh] Ambiguous (number)
// ; // ;
// //
// time ::= hhmmss[,ss] Ambiguous (number)
// | hhmm[,mm] Ambiguous (number)
// | hh[,hh] Ambiguous (number)
// ;
//
// time-utc-ext ::= hh:mm[:ss] 'Z' ; // time-utc-ext ::= hh:mm[:ss] 'Z' ;
// time-utc ::= hh[mm[ss]] 'Z' ;
// //
// offset-ext ::= ±hh[:mm] ; // offset-ext ::= ±hh[:mm] ;
// offset ::= ±hh[mm] ;
// //
// Not yet supported: // Not yet supported:
// //
@ -136,12 +106,7 @@ bool ISO8601d::parse (const std::string& input, std::string::size_type& start)
parse_date_ext (n) || parse_date_ext (n) ||
parse_time_utc_ext (n) || parse_time_utc_ext (n) ||
parse_time_off_ext (n) || parse_time_off_ext (n) ||
parse_date_time (n) || parse_time_ext (n)) // Time last, as it is the most permissive.
parse_date (n, _ambiguity) ||
parse_time_utc (n) ||
parse_time_off (n) ||
parse_time_ext (n) || // Time last, as it is the most permissive.
parse_time (n, _ambiguity))
{ {
// Check the values and determine time_t. // Check the values and determine time_t.
if (validate ()) if (validate ())
@ -214,47 +179,6 @@ bool ISO8601d::parse_date_time_ext (Nibbler& n)
return false; return false;
} }
////////////////////////////////////////////////////////////////////////////////
// date 'T' time 'Z'
// date 'T' time offset
// date 'T' time
bool ISO8601d::parse_date_time (Nibbler& n)
{
Nibbler backup (n);
if (parse_date (n, true))
{
if (n.skip ('T') &&
parse_time (n, true))
{
if (n.skip ('Z'))
{
_utc = true;
if (!Lexer::isDigit (n.next ()))
return true;
}
else if (parse_off (n))
{
if (!Lexer::isDigit (n.next ()))
return true;
}
if (!Lexer::isDigit (n.next ()))
return true;
}
// Restore date
_year = 0;
_month = 0;
_week = 0;
_weekday = 0;
_julian = 0;
_day = 0;
}
n = backup;
return false;
}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// YYYY-MM-DD // YYYY-MM-DD
// YYYY-DDD // YYYY-DDD
@ -303,64 +227,6 @@ bool ISO8601d::parse_date_ext (Nibbler& n)
return false; return false;
} }
////////////////////////////////////////////////////////////////////////////////
// YYYYMMDD Ambiguous (number)
// YYYYWwwD
// YYYYWww
// YYYYDDD Ambiguous (number)
// YYYY-MM
bool ISO8601d::parse_date (Nibbler& n, bool ambiguous)
{
Nibbler backup (n);
int year;
if (n.getDigit4 (year))
{
int month;
if (n.skip ('W'))
{
int week;
if (n.getDigit2 (week))
{
_week = week;
int day;
if (n.getDigit (day))
_weekday = day;
_year = year;
if (!Lexer::isDigit (n.next ()))
return true;
}
}
else if (n.skip ('-'))
{
if (n.getDigit2 (_month))
{
_year = year;
if (!Lexer::isDigit (n.next ()))
return true;
}
}
else if (n.getDigit4 (month))
{
_year = year;
_month = month / 100;
_day = month % 100;
if (!Lexer::isDigit (n.next ()))
return true;
}
else if (ambiguous && n.getDigit3 (_julian))
{
_year = year;
if (!Lexer::isDigit (n.next ()))
return true;
}
}
n = backup;
return false;
}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// ±hh[:mm] // ±hh[:mm]
bool ISO8601d::parse_off_ext (Nibbler& n) bool ISO8601d::parse_off_ext (Nibbler& n)
@ -394,37 +260,7 @@ bool ISO8601d::parse_off_ext (Nibbler& n)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// ±hh[mm] // hh:mm[:ss]
bool ISO8601d::parse_off (Nibbler& n)
{
Nibbler backup (n);
std::string sign;
if (n.getN (1, sign))
{
if (sign == "+" || sign == "-")
{
int offset;
int hh;
if (n.getDigit2 (hh))
{
offset = hh * 3600;
int mm;
if (n.getDigit2 (mm))
offset += mm * 60;
_offset = (sign == "-") ? -offset : offset;
if (!Lexer::isDigit (n.next ()))
return true;
}
}
}
n = backup;
return false;
}
////////////////////////////////////////////////////////////////////////////////
// hh[:mm[:ss]]
bool ISO8601d::parse_time_ext (Nibbler& n) bool ISO8601d::parse_time_ext (Nibbler& n)
{ {
Nibbler backup (n); Nibbler backup (n);
@ -433,20 +269,15 @@ bool ISO8601d::parse_time_ext (Nibbler& n)
int mm; int mm;
int ss; int ss;
if (n.getDigit2 (hh) && if (n.getDigit2 (hh) &&
!n.getDigit (mm)) n.skip (':') &&
n.getDigit2 (mm))
{ {
seconds = hh * 3600; seconds = (hh * 3600) + (mm * 60);
if (n.skip (':') &&
n.getDigit2 (mm) &&
!n.getDigit (ss))
{
seconds += mm * 60;
if (n.skip (':') && if (n.skip (':') &&
n.getDigit2 (ss)) n.getDigit2 (ss))
{
seconds += ss; seconds += ss;
_seconds = seconds; _seconds = seconds;
return true; return true;
} }
@ -463,35 +294,6 @@ bool ISO8601d::parse_time_ext (Nibbler& n)
return false; return false;
} }
////////////////////////////////////////////////////////////////////////////////
// hhmm[ss]
bool ISO8601d::parse_time (Nibbler& n, bool ambiguous)
{
if (!ambiguous)
return false;
Nibbler backup (n);
int seconds = 0;
int hh;
int mm;
if (n.getDigit2 (hh) &&
n.getDigit2 (mm))
{
seconds = hh * 3600 + mm * 60;
int ss;
if (n.getDigit2 (ss))
seconds += ss;
_seconds = seconds;
if (!Lexer::isDigit (n.next ()))
return true;
}
n = backup;
return false;
}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// time-ext 'Z' // time-ext 'Z'
bool ISO8601d::parse_time_utc_ext (Nibbler& n) bool ISO8601d::parse_time_utc_ext (Nibbler& n)
@ -509,23 +311,6 @@ bool ISO8601d::parse_time_utc_ext (Nibbler& n)
return false; return false;
} }
////////////////////////////////////////////////////////////////////////////////
// time 'Z'
bool ISO8601d::parse_time_utc (Nibbler& n)
{
n.save ();
if (parse_time (n, true) &&
n.skip ('Z'))
{
_utc = true;
if (!Lexer::isDigit (n.next ()))
return true;
}
n.restore ();
return false;
}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// time-ext offset-ext // time-ext offset-ext
bool ISO8601d::parse_time_off_ext (Nibbler& n) bool ISO8601d::parse_time_off_ext (Nibbler& n)
@ -542,22 +327,6 @@ bool ISO8601d::parse_time_off_ext (Nibbler& n)
return false; return false;
} }
////////////////////////////////////////////////////////////////////////////////
// time offset
bool ISO8601d::parse_time_off (Nibbler& n)
{
Nibbler backup (n);
if (parse_time (n, true) &&
parse_off (n))
{
if (!Lexer::isDigit (n.next ()))
return true;
}
n = backup;
return false;
}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Using Zeller's Congruence. // Using Zeller's Congruence.
int ISO8601d::dayOfWeek (int year, int month, int day) int ISO8601d::dayOfWeek (int year, int month, int day)

View file

@ -45,17 +45,11 @@ public:
private: private:
bool parse_date_time_ext (Nibbler&); bool parse_date_time_ext (Nibbler&);
bool parse_date_time (Nibbler&);
bool parse_date_ext (Nibbler&); bool parse_date_ext (Nibbler&);
bool parse_date (Nibbler&, bool);
bool parse_off_ext (Nibbler&); bool parse_off_ext (Nibbler&);
bool parse_off (Nibbler&);
bool parse_time_ext (Nibbler&); bool parse_time_ext (Nibbler&);
bool parse_time (Nibbler&, bool);
bool parse_time_utc_ext (Nibbler&); bool parse_time_utc_ext (Nibbler&);
bool parse_time_utc (Nibbler&);
bool parse_time_off_ext (Nibbler&); bool parse_time_off_ext (Nibbler&);
bool parse_time_off (Nibbler&);
int dayOfWeek (int, int, int); int dayOfWeek (int, int, int);
bool validate (); bool validate ();
void resolve (); void resolve ();

View file

@ -103,38 +103,6 @@ class TestIncorrectDate(BaseDateTimeNegativeTest):
def test_set_incorrect_datetime_day_two_hundred_in_YYYY_WwwD(self): def test_set_incorrect_datetime_day_two_hundred_in_YYYY_WwwD(self):
self.assertInvalidDatetimeFormat('2014-W24200') self.assertInvalidDatetimeFormat('2014-W24200')
@unittest.expectedFailure
def test_set_incorrect_datetime_week_with_the_number_zero_in_YYYYWww(self):
self.assertInvalidDatetimeFormat('2014W00')
def test_set_incorrect_datetime_overflow_in_week_in_YYYYWww(self):
self.assertInvalidDatetimeFormat('2014W54')
@unittest.expectedFailure
def test_set_incorrect_datetime_week_zero_in_YYYYWwwD(self):
self.assertInvalidDatetimeFormat('2014W001')
@unittest.expectedFailure
def test_set_incorrect_datetime_fifth_day_of_week_zero_in_YYYYWwwD(self):
self.assertInvalidDatetimeFormat('2014W005')
def test_set_incorrect_datetime_overflow_week_in_YYYYWwwD(self):
self.assertInvalidDatetimeFormat('2014W541')
def test_set_incorrect_datetime_huge_overflow_week_in_YYYYWwwD(self):
self.assertInvalidDatetimeFormat('2014W991')
@unittest.expectedFailure
def test_set_incorrect_datetime_day_zero_in_YYYYWwwD(self):
self.assertInvalidDatetimeFormat('2014W240')
def test_set_incorrect_datetime_day_eight_in_YYYYWwwD(self):
self.assertInvalidDatetimeFormat('2014W248')
def test_set_incorrect_datetime_day_two_hundred_in_YYYYWwwD(self):
self.assertInvalidDatetimeFormat('2014W24200')
@unittest.expectedFailure
def test_set_incorrect_datetime_month_zero_in_YYYY_MM(self): def test_set_incorrect_datetime_month_zero_in_YYYY_MM(self):
self.assertInvalidDatetimeFormat('2014-00') self.assertInvalidDatetimeFormat('2014-00')
@ -211,18 +179,15 @@ class TestIncorrectTime(BaseDateTimeNegativeTest):
def test_set_incorrect_datetime_negative_minutes_in_hh_mmZ(self): def test_set_incorrect_datetime_negative_minutes_in_hh_mmZ(self):
self.assertInvalidDatetimeFormat('12:-12Z') self.assertInvalidDatetimeFormat('12:-12Z')
@unittest.expectedFailure
def test_set_incorrect_datetime_hour_overflow_in_hh_mm_plus_hh_mm(self): def test_set_incorrect_datetime_hour_overflow_in_hh_mm_plus_hh_mm(self):
self.assertInvalidDatetimeFormat('24:00+01:00') self.assertInvalidDatetimeFormat('24:00+01:00')
def test_set_incorrect_datetime_huge_hour_overflow_in_hh_mm_plus_hh_mm(self): def test_set_incorrect_datetime_huge_hour_overflow_in_hh_mm_plus_hh_mm(self):
self.assertInvalidDatetimeFormat('99:00+01:00') self.assertInvalidDatetimeFormat('99:00+01:00')
@unittest.expectedFailure
def test_set_incorrect_datetime_minute_overflow_in_hh_mm_plus_hh_mm(self): def test_set_incorrect_datetime_minute_overflow_in_hh_mm_plus_hh_mm(self):
self.assertInvalidDatetimeFormat('12:60+01:00') self.assertInvalidDatetimeFormat('12:60+01:00')
@unittest.expectedFailure
def test_set_incorrect_datetime_huge_minute_overflow_in_hh_mm_plus_hh_mm(self): def test_set_incorrect_datetime_huge_minute_overflow_in_hh_mm_plus_hh_mm(self):
self.assertInvalidDatetimeFormat('12:99+01:00') self.assertInvalidDatetimeFormat('12:99+01:00')
@ -241,18 +206,15 @@ class TestIncorrectTime(BaseDateTimeNegativeTest):
def test_set_incorrect_datetime_negative_minutes_in_hh_mm_plus_hh_mm(self): def test_set_incorrect_datetime_negative_minutes_in_hh_mm_plus_hh_mm(self):
self.assertInvalidDatetimeFormat('12:-12+01:00') self.assertInvalidDatetimeFormat('12:-12+01:00')
@unittest.expectedFailure
def test_set_incorrect_datetime_hour_overflow_in_hh_mm_minus_hh_mm(self): def test_set_incorrect_datetime_hour_overflow_in_hh_mm_minus_hh_mm(self):
self.assertInvalidDatetimeFormat('24:00-01:00') self.assertInvalidDatetimeFormat('24:00-01:00')
def test_set_incorrect_datetime_huge_hour_overflow_in_hh_mm_minus_hh_mm(self): def test_set_incorrect_datetime_huge_hour_overflow_in_hh_mm_minus_hh_mm(self):
self.assertInvalidDatetimeFormat('99:00-01:00') self.assertInvalidDatetimeFormat('99:00-01:00')
@unittest.expectedFailure
def test_set_incorrect_datetime_minute_overflow_in_hh_mm_minus_hh_mm(self): def test_set_incorrect_datetime_minute_overflow_in_hh_mm_minus_hh_mm(self):
self.assertInvalidDatetimeFormat('12:60-01:00') self.assertInvalidDatetimeFormat('12:60-01:00')
@unittest.expectedFailure
def test_set_incorrect_datetime_huge_minute_overflow_in_hh_mm_minus_hh_mm(self): def test_set_incorrect_datetime_huge_minute_overflow_in_hh_mm_minus_hh_mm(self):
self.assertInvalidDatetimeFormat('12:99-01:00') self.assertInvalidDatetimeFormat('12:99-01:00')
@ -312,7 +274,6 @@ class TestIncorrectTime(BaseDateTimeNegativeTest):
def test_set_incorrect_datetime_negative_minutes_in_hh_mm_ss(self): def test_set_incorrect_datetime_negative_minutes_in_hh_mm_ss(self):
self.assertInvalidDatetimeFormat('12:-12:12') self.assertInvalidDatetimeFormat('12:-12:12')
@unittest.expectedFailure
def test_set_incorrect_datetime_negative_seconds_in_hh_mm_ss(self): def test_set_incorrect_datetime_negative_seconds_in_hh_mm_ss(self):
self.assertInvalidDatetimeFormat('12:12:-12') self.assertInvalidDatetimeFormat('12:12:-12')
@ -445,7 +406,6 @@ class TestIncorrectTime(BaseDateTimeNegativeTest):
def test_set_incorrect_datetime_negative_minutes_in_hh_mm_ss_minus_hh_mm(self): def test_set_incorrect_datetime_negative_minutes_in_hh_mm_ss_minus_hh_mm(self):
self.assertInvalidDatetimeFormat('12:-12:12-01:00') self.assertInvalidDatetimeFormat('12:-12:12-01:00')
@unittest.expectedFailure
def test_set_incorrect_datetime_negative_seconds_in_hh_mm_ss_minus_hh_mm(self): def test_set_incorrect_datetime_negative_seconds_in_hh_mm_ss_minus_hh_mm(self):
self.assertInvalidDatetimeFormat('12:12:-12-01:00') self.assertInvalidDatetimeFormat('12:12:-12-01:00')
@ -505,22 +465,18 @@ class TestIncorrectTime(BaseDateTimeNegativeTest):
def test_set_incorrect_datetime_invalid_negative_offset_length_in_hh_mm_ss(self): def test_set_incorrect_datetime_invalid_negative_offset_length_in_hh_mm_ss(self):
self.assertInvalidDatetimeFormat('12:12:12-3:2') self.assertInvalidDatetimeFormat('12:12:12-3:2')
@unittest.expectedFailure
def test_set_incorrect_datetime_invalid_hour_positive_offset_in_hh_mm(self): def test_set_incorrect_datetime_invalid_hour_positive_offset_in_hh_mm(self):
self.assertInvalidDatetimeFormat('12:12+13:00') self.assertInvalidDatetimeFormat('12:12+13:00')
@unittest.expectedFailure
def test_set_incorrect_datetime_invalid_medium_hour_positive_offset_in_hh_mm(self): def test_set_incorrect_datetime_invalid_medium_hour_positive_offset_in_hh_mm(self):
self.assertInvalidDatetimeFormat('12:12+24:00') self.assertInvalidDatetimeFormat('12:12+24:00')
def test_set_incorrect_datetime_invalid_huge_hour_positive_offset_in_hh_mm(self): def test_set_incorrect_datetime_invalid_huge_hour_positive_offset_in_hh_mm(self):
self.assertInvalidDatetimeFormat('12:12+99:00') self.assertInvalidDatetimeFormat('12:12+99:00')
@unittest.expectedFailure
def test_set_incorrect_datetime_invalid_minute_positive_offset_in_hh_mm(self): def test_set_incorrect_datetime_invalid_minute_positive_offset_in_hh_mm(self):
self.assertInvalidDatetimeFormat('12:12+03:60') self.assertInvalidDatetimeFormat('12:12+03:60')
@unittest.expectedFailure
def test_set_incorrect_datetime_invalid_huge_minute_positive_offset_in_hh_mm(self): def test_set_incorrect_datetime_invalid_huge_minute_positive_offset_in_hh_mm(self):
self.assertInvalidDatetimeFormat('12:12+03:99') self.assertInvalidDatetimeFormat('12:12+03:99')
@ -533,22 +489,18 @@ class TestIncorrectTime(BaseDateTimeNegativeTest):
def test_set_incorrect_datetime_invalid_positive_offset_length_in_hh_mm(self): def test_set_incorrect_datetime_invalid_positive_offset_length_in_hh_mm(self):
self.assertInvalidDatetimeFormat('12:12+3:2') self.assertInvalidDatetimeFormat('12:12+3:2')
@unittest.expectedFailure
def test_set_incorrect_datetime_invalid_hour_negative_offset_in_hh_mm(self): def test_set_incorrect_datetime_invalid_hour_negative_offset_in_hh_mm(self):
self.assertInvalidDatetimeFormat('12:12-13:00') self.assertInvalidDatetimeFormat('12:12-13:00')
@unittest.expectedFailure
def test_set_incorrect_datetime_invalid_medium_hour_negative_offset_in_hh_mm(self): def test_set_incorrect_datetime_invalid_medium_hour_negative_offset_in_hh_mm(self):
self.assertInvalidDatetimeFormat('12:12-24:00') self.assertInvalidDatetimeFormat('12:12-24:00')
def test_set_incorrect_datetime_invalid_huge_hour_negative_offset_in_hh_mm(self): def test_set_incorrect_datetime_invalid_huge_hour_negative_offset_in_hh_mm(self):
self.assertInvalidDatetimeFormat('12:12-99:00') self.assertInvalidDatetimeFormat('12:12-99:00')
@unittest.expectedFailure
def test_set_incorrect_datetime_invalid_minute_negative_offset_in_hh_mm(self): def test_set_incorrect_datetime_invalid_minute_negative_offset_in_hh_mm(self):
self.assertInvalidDatetimeFormat('12:12-03:60') self.assertInvalidDatetimeFormat('12:12-03:60')
@unittest.expectedFailure
def test_set_incorrect_datetime_invalid_huge_minute_negative_offset_in_hh_mm(self): def test_set_incorrect_datetime_invalid_huge_minute_negative_offset_in_hh_mm(self):
self.assertInvalidDatetimeFormat('12:12-03:99') self.assertInvalidDatetimeFormat('12:12-03:99')

View file

@ -33,9 +33,6 @@
Context context; Context context;
#define AMBIGUOUS // Include ambiguous forms
#undef AMBIGUOUS // Exclude ambiguous forms
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
void testParse ( void testParse (
UnitTest& t, UnitTest& t,
@ -74,11 +71,7 @@ void testParse (
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int main (int argc, char** argv) int main (int argc, char** argv)
{ {
UnitTest t (1214 UnitTest t (734);
#ifdef AMBIGUOUS
+ 48
#endif
);
ISO8601d iso; ISO8601d iso;
std::string::size_type start = 0; std::string::size_type start = 0;
@ -139,7 +132,6 @@ int main (int argc, char** argv)
int hms = (12 * 3600) + (34 * 60) + 56; // The time 12:34:56 in seconds. int hms = (12 * 3600) + (34 * 60) + 56; // The time 12:34:56 in seconds.
int hm = (12 * 3600) + (34 * 60); // The time 12:34:00 in seconds. int hm = (12 * 3600) + (34 * 60); // The time 12:34:00 in seconds.
int h = (12 * 3600); // The time 12:00:00 in seconds.
int z = 3600; // TZ offset. int z = 3600; // TZ offset.
int ld = local_s > hms ? 86400 : 0; // Local extra day if now > hms. int ld = local_s > hms ? 86400 : 0; // Local extra day if now > hms.
@ -155,31 +147,12 @@ int main (int argc, char** argv)
// input i Year Mo Wk WD Jul Da Secs TZ UTC time_t // input i Year Mo Wk WD Jul Da Secs TZ UTC time_t
testParse (t, "12:34:56Z", 9, 0, 0, 0, 0, 0, 0, hms, 0, true, utc+hms+ud ); testParse (t, "12:34:56Z", 9, 0, 0, 0, 0, 0, 0, hms, 0, true, utc+hms+ud );
testParse (t, "12:34Z", 6, 0, 0, 0, 0, 0, 0, hm, 0, true, utc+hm+ud ); testParse (t, "12:34Z", 6, 0, 0, 0, 0, 0, 0, hm, 0, true, utc+hm+ud );
testParse (t, "12Z", 3, 0, 0, 0, 0, 0, 0, h, 0, true, utc+h+ud );
testParse (t, "12:34:56+01:00", 14, 0, 0, 0, 0, 0, 0, hms, 3600, false, utc+hms-z+ud ); testParse (t, "12:34:56+01:00", 14, 0, 0, 0, 0, 0, 0, hms, 3600, false, utc+hms-z+ud );
testParse (t, "12:34:56+01", 11, 0, 0, 0, 0, 0, 0, hms, 3600, false, utc+hms-z+ud ); testParse (t, "12:34:56+01", 11, 0, 0, 0, 0, 0, 0, hms, 3600, false, utc+hms-z+ud );
testParse (t, "12:34+01:00", 11, 0, 0, 0, 0, 0, 0, hm, 3600, false, utc+hm-z+ud ); testParse (t, "12:34+01:00", 11, 0, 0, 0, 0, 0, 0, hm, 3600, false, utc+hm-z+ud );
testParse (t, "12:34+01", 8, 0, 0, 0, 0, 0, 0, hm, 3600, false, utc+hm-z+ud ); testParse (t, "12:34+01", 8, 0, 0, 0, 0, 0, 0, hm, 3600, false, utc+hm-z+ud );
// testParse (t, "12+01:00", 8, 0, 0, 0, 0, 0, 0, h, 3600, false, utc+h-z+ud );
// testParse (t, "12+01", 5, 0, 0, 0, 0, 0, 0, h, 3600, false, utc+h-z+ud );
testParse (t, "12:34:56", 8, 0, 0, 0, 0, 0, 0, hms, 0, false, local+hms+ld ); testParse (t, "12:34:56", 8, 0, 0, 0, 0, 0, 0, hms, 0, false, local+hms+ld );
testParse (t, "12:34", 5, 0, 0, 0, 0, 0, 0, hm, 0, false, local+hm+ld ); testParse (t, "12:34", 5, 0, 0, 0, 0, 0, 0, hm, 0, false, local+hm+ld );
#ifdef AMBIGUOUS
testParse (t, "12", 2, 0, 0, 0, 0, 0, 0, h, 0, false, local+h+ld );
#endif
// time
// input i Year Mo Wk WD Jul Da Secs TZ UTC time_t
testParse (t, "123456Z", 7, 0, 0, 0, 0, 0, 0, hms, 0, true, utc+hms+ud );
testParse (t, "1234Z", 5, 0, 0, 0, 0, 0, 0, hm, 0, true, utc+hm+ud );
testParse (t, "123456+0100", 11, 0, 0, 0, 0, 0, 0, hms, 3600, false, utc+hms-z+ud );
testParse (t, "123456+01", 9, 0, 0, 0, 0, 0, 0, hms, 3600, false, utc+hms-z+ud );
testParse (t, "1234+0100", 9, 0, 0, 0, 0, 0, 0, hm, 3600, false, utc+hm-z+ud );
testParse (t, "1234+01", 7, 0, 0, 0, 0, 0, 0, hm, 3600, false, utc+hm-z+ud );
// testParse (t, "12+0100", 7, 0, 0, 0, 0, 0, 0, h, 3600, false, utc+h-z+ud );
#ifdef AMBIGUOUS
testParse (t, "123456", 6, 0, 0, 0, 0, 0, 0, hms, 0, false, local+hms+ld );
#endif
// datetime-ext // datetime-ext
// input i Year Mo Wk WD Jul Da Secs TZ UTC time_t // input i Year Mo Wk WD Jul Da Secs TZ UTC time_t
@ -239,82 +212,6 @@ int main (int argc, char** argv)
testParse (t, "2013-W49T12:34-01:00", 20, 2013, 0, 49, 0, 0, 0, hm, -3600, false, utc1+hm+z ); testParse (t, "2013-W49T12:34-01:00", 20, 2013, 0, 49, 0, 0, 0, hm, -3600, false, utc1+hm+z );
testParse (t, "2013-W49T12:34-01", 17, 2013, 0, 49, 0, 0, 0, hm, -3600, false, utc1+hm+z ); testParse (t, "2013-W49T12:34-01", 17, 2013, 0, 49, 0, 0, 0, hm, -3600, false, utc1+hm+z );
// datetime
#ifdef AMBIGUOUS
testParse (t, "20131206", 8, 2013, 12, 0, 0, 0, 6, 0, 0, false, local6 );
#endif
testParse (t, "2013W495", 8, 2013, 0, 49, 5, 0, 0, 0, 0, false, local6 );
testParse (t, "2013W49", 7, 2013, 0, 49, 0, 0, 0, 0, 0, false, local1 );
#ifdef AMBIGUOUS
testParse (t, "2013340", 7, 2013, 0, 0, 0, 340, 0, 0, 0, false, local6 );
#endif
testParse (t, "2013-12", 7, 2013, 12, 0, 0, 0, 0, 0, 0, false, local1 );
testParse (t, "20131206T123456", 15, 2013, 12, 0, 0, 0, 6, hms, 0, false, local6+hms);
// testParse (t, "20131206T12", 11, 2013, 12, 0, 0, 0, 6, h, 0, false, local6+h );
testParse (t, "2013W495T123456", 15, 2013, 0, 49, 5, 0, 0, hms, 0, false, local6+hms);
// testParse (t, "2013W495T12", 11, 2013, 0, 49, 5, 0, 0, h, 0, false, local6+h );
testParse (t, "2013W49T123456", 14, 2013, 0, 49, 0, 0, 0, hms, 0, false, local1+hms);
// testParse (t, "2013W49T12", 10, 2013, 0, 49, 0, 0, 0, h, 0, false, local1+h );
testParse (t, "2013340T123456", 14, 2013, 0, 0, 0, 340, 0, hms, 0, false, local6+hms);
// testParse (t, "2013340T12", 10, 2013, 0, 0, 0, 340, 0, h, 0, false, local6+h );
testParse (t, "2013-12T1234", 12, 2013, 12, 0, 0, 0, 0, hm, 0, false, local1+hm );
// testParse (t, "2013-12T12", 10, 2013, 12, 0, 0, 0, 0, h, 0, false, local1+h );
testParse (t, "20131206T123456Z", 16, 2013, 12, 0, 0, 0, 6, hms, 0, true, utc6+hms );
// testParse (t, "20131206T12Z", 12, 2013, 12, 0, 0, 0, 6, h, 0, true, utc6+h );
testParse (t, "2013W495T123456Z", 16, 2013, 0, 49, 5, 0, 0, hms, 0, true, utc6+hms );
// testParse (t, "2013W495T12Z", 12, 2013, 0, 49, 5, 0, 0, h, 0, true, utc6+h );
testParse (t, "2013W49T123456Z", 15, 2013, 0, 49, 0, 0, 0, hms, 0, true, utc1+hms );
// testParse (t, "2013W49T12Z", 11, 2013, 0, 49, 0, 0, 0, h, 0, true, utc1+h );
testParse (t, "2013340T123456Z", 15, 2013, 0, 0, 0, 340, 0, hms, 0, true, utc6+hms );
// testParse (t, "2013340T12Z", 11, 2013, 0, 0, 0, 340, 0, h, 0, true, utc6+h );
testParse (t, "2013-12T123456Z", 15, 2013, 12, 0, 0, 0, 0, hms, 0, true, utc1+hms );
// testParse (t, "2013-12T12Z", 11, 2013, 12, 0, 0, 0, 0, h, 0, true, utc1+h );
testParse (t, "20131206T123456+0100", 20, 2013, 12, 0, 0, 0, 6, hms, 3600, false, utc6+hms-z);
testParse (t, "20131206T123456+01", 18, 2013, 12, 0, 0, 0, 6, hms, 3600, false, utc6+hms-z);
testParse (t, "20131206T123456-0100", 20, 2013, 12, 0, 0, 0, 6, hms, -3600, false, utc6+hms+z);
testParse (t, "20131206T123456-01", 18, 2013, 12, 0, 0, 0, 6, hms, -3600, false, utc6+hms+z);
// testParse (t, "20131206T12+0100", 16, 2013, 12, 0, 0, 0, 6, h, 3600, false, utc6+h-z );
// testParse (t, "20131206T12+01", 14, 2013, 12, 0, 0, 0, 6, h, 3600, false, utc6+h-z );
// testParse (t, "20131206T12-0100", 16, 2013, 12, 0, 0, 0, 6, h, -3600, false, utc6+h+z );
// testParse (t, "20131206T12-01", 14, 2013, 12, 0, 0, 0, 6, h, -3600, false, utc6+h+z );
testParse (t, "2013W495T123456+0100", 20, 2013, 0, 49, 5, 0, 0, hms, 3600, false, utc6+hms-z);
testParse (t, "2013W495T123456+01", 18, 2013, 0, 49, 5, 0, 0, hms, 3600, false, utc6+hms-z);
testParse (t, "2013W495T123456-0100", 20, 2013, 0, 49, 5, 0, 0, hms, -3600, false, utc6+hms+z);
testParse (t, "2013W495T123456-01", 18, 2013, 0, 49, 5, 0, 0, hms, -3600, false, utc6+hms+z);
// testParse (t, "2013W495T12+0100", 16, 2013, 0, 49, 5, 0, 0, h, 3600, false, utc6+h-z );
// testParse (t, "2013W495T12+01", 14, 2013, 0, 49, 5, 0, 0, h, 3600, false, utc6+h-z );
// testParse (t, "2013W495T12-0100", 16, 2013, 0, 49, 5, 0, 0, h, -3600, false, utc6+h+z );
// testParse (t, "2013W495T12-01", 14, 2013, 0, 49, 5, 0, 0, h, -3600, false, utc6+h+z );
testParse (t, "2013W49T123456+0100", 19, 2013, 0, 49, 0, 0, 0, hms, 3600, false, utc1+hms-z);
testParse (t, "2013W49T123456+01", 17, 2013, 0, 49, 0, 0, 0, hms, 3600, false, utc1+hms-z);
testParse (t, "2013W49T123456-0100", 19, 2013, 0, 49, 0, 0, 0, hms, -3600, false, utc1+hms+z);
testParse (t, "2013W49T123456-01", 17, 2013, 0, 49, 0, 0, 0, hms, -3600, false, utc1+hms+z);
// testParse (t, "2013W49T12+0100", 15, 2013, 0, 49, 0, 0, 0, h, 3600, false, utc1+h-z );
// testParse (t, "2013W49T12+01", 13, 2013, 0, 49, 0, 0, 0, h, 3600, false, utc1+h-z );
// testParse (t, "2013W49T12-0100", 15, 2013, 0, 49, 0, 0, 0, h, -3600, false, utc1+h+z );
// testParse (t, "2013W49T12-01", 13, 2013, 0, 49, 0, 0, 0, h, -3600, false, utc1+h+z );
testParse (t, "2013340T123456+0100", 19, 2013, 0, 0, 0, 340, 0, hms, 3600, false, utc6+hms-z);
testParse (t, "2013340T123456+01", 17, 2013, 0, 0, 0, 340, 0, hms, 3600, false, utc6+hms-z);
testParse (t, "2013340T123456-0100", 19, 2013, 0, 0, 0, 340, 0, hms, -3600, false, utc6+hms+z);
testParse (t, "2013340T123456-01", 17, 2013, 0, 0, 0, 340, 0, hms, -3600, false, utc6+hms+z);
// testParse (t, "2013340T12+0100", 15, 2013, 0, 0, 0, 340, 0, h, 3600, false, utc6+h-z );
// testParse (t, "2013340T12+01", 13, 2013, 0, 0, 0, 340, 0, h, 3600, false, utc6+h-z );
// testParse (t, "2013340T12-0100", 15, 2013, 0, 0, 0, 340, 0, h, -3600, false, utc6+h+z );
// testParse (t, "2013340T12-01", 13, 2013, 0, 0, 0, 340, 0, h, -3600, false, utc6+h+z );
testParse (t, "2013-12T123456+0100", 19, 2013, 12, 0, 0, 0, 0, hms, 3600, false, utc1+hms-z);
testParse (t, "2013-12T123456+01", 17, 2013, 12, 0, 0, 0, 0, hms, 3600, false, utc1+hms-z);
testParse (t, "2013-12T123456-0100", 19, 2013, 12, 0, 0, 0, 0, hms, -3600, false, utc1+hms+z);
testParse (t, "2013-12T123456-01", 17, 2013, 12, 0, 0, 0, 0, hms, -3600, false, utc1+hms+z);
// testParse (t, "2013-12T12+0100", 15, 2013, 12, 0, 0, 0, 0, h, 3600, false, utc1+h-z );
// testParse (t, "2013-12T12+01", 13, 2013, 12, 0, 0, 0, 0, h, 3600, false, utc1+h-z );
// testParse (t, "2013-12T12-0100", 15, 2013, 12, 0, 0, 0, 0, h, -3600, false, utc1+h+z );
// testParse (t, "2013-12T12-01", 13, 2013, 12, 0, 0, 0, 0, h, -3600, false, utc1+h+z );
// TODO Test validation of individual values.
return 0; return 0;
} }