mirror of
https://github.com/bspeice/dtparse
synced 2024-12-22 04:18:09 -05:00
Add a lot of tests
And fix up some transcription errors
This commit is contained in:
parent
709b38926d
commit
d49a12d947
17
src/lib.rs
17
src/lib.rs
@ -974,6 +974,8 @@ impl Parser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn build_naive(&self, res: &ParsingResult, default: &NaiveDateTime) -> NaiveDateTime {
|
fn build_naive(&self, res: &ParsingResult, default: &NaiveDateTime) -> NaiveDateTime {
|
||||||
|
// TODO: Handle weekday here
|
||||||
|
|
||||||
// TODO: Change month/day to u32
|
// TODO: Change month/day to u32
|
||||||
let d = NaiveDate::from_ymd(
|
let d = NaiveDate::from_ymd(
|
||||||
res.year.unwrap_or(default.year()),
|
res.year.unwrap_or(default.year()),
|
||||||
@ -999,7 +1001,9 @@ impl Parser {
|
|||||||
default: &NaiveDateTime,
|
default: &NaiveDateTime,
|
||||||
) -> ParseResult<Option<FixedOffset>> {
|
) -> ParseResult<Option<FixedOffset>> {
|
||||||
// TODO: Actual timezone support
|
// TODO: Actual timezone support
|
||||||
if res.tzname.is_none() && res.tzoffset.is_none() || res.tzname == Some(" ".to_owned()) {
|
if res.tzname.is_none() && res.tzoffset.is_none() || res.tzname == Some(" ".to_owned())
|
||||||
|
|| res.tzname == Some(".".to_owned())
|
||||||
|
{
|
||||||
Ok(None)
|
Ok(None)
|
||||||
} else {
|
} else {
|
||||||
println!("Tzname: {:?}, Tzoffset: {:?}", res.tzname, res.tzoffset);
|
println!("Tzname: {:?}, Tzoffset: {:?}", res.tzname, res.tzoffset);
|
||||||
@ -1070,11 +1074,12 @@ impl Parser {
|
|||||||
}
|
}
|
||||||
} else if let Some(hms_idx) = self.find_hms_index(idx, tokens, info, true) {
|
} else if let Some(hms_idx) = self.find_hms_index(idx, tokens, info, true) {
|
||||||
// HH[ ]h or MM[ ]m or SS[.ss][ ]s
|
// HH[ ]h or MM[ ]m or SS[.ss][ ]s
|
||||||
let (idx, hms) = self.parse_hms(idx, tokens, info, Some(hms_idx));
|
let (new_idx, hms) = self.parse_hms(idx, tokens, info, Some(hms_idx));
|
||||||
if hms.is_some() {
|
if hms.is_some() {
|
||||||
// TODO: This unwrap is unjustified.
|
// TODO: This unwrap is unjustified.
|
||||||
self.assign_hms(res, value_repr, hms.unwrap());
|
self.assign_hms(res, value_repr, hms.unwrap());
|
||||||
}
|
}
|
||||||
|
idx = new_idx;
|
||||||
} else if idx + 2 < len_l && tokens[idx + 1] == ":" {
|
} else if idx + 2 < len_l && tokens[idx + 1] == ":" {
|
||||||
// HH:MM[:SS[.ss]]
|
// HH:MM[:SS[.ss]]
|
||||||
// TODO: Better story around Decimal handling
|
// TODO: Better story around Decimal handling
|
||||||
@ -1149,7 +1154,7 @@ impl Parser {
|
|||||||
fn adjust_ampm(&self, hour: i32, ampm: bool) -> i32 {
|
fn adjust_ampm(&self, hour: i32, ampm: bool) -> i32 {
|
||||||
if hour < 12 && ampm {
|
if hour < 12 && ampm {
|
||||||
hour + 12
|
hour + 12
|
||||||
} else if hour == 12 && ampm {
|
} else if hour == 12 && !ampm {
|
||||||
0
|
0
|
||||||
} else {
|
} else {
|
||||||
hour
|
hour
|
||||||
@ -1223,14 +1228,18 @@ impl Parser {
|
|||||||
|
|
||||||
if hms == 0 {
|
if hms == 0 {
|
||||||
res.hour = Some(value.to_i64().unwrap() as i32);
|
res.hour = Some(value.to_i64().unwrap() as i32);
|
||||||
if close_to_integer(&value) {
|
if !close_to_integer(&value) {
|
||||||
// TODO: High probability of issues with rounding here.
|
// TODO: High probability of issues with rounding here.
|
||||||
res.minute = Some((*SIXTY * (value % *ONE)).to_i64().unwrap() as i32);
|
res.minute = Some((*SIXTY * (value % *ONE)).to_i64().unwrap() as i32);
|
||||||
}
|
}
|
||||||
} else if hms == 1 {
|
} else if hms == 1 {
|
||||||
let (min, sec) = self.parse_min_sec(value);
|
let (min, sec) = self.parse_min_sec(value);
|
||||||
|
res.minute = Some(min);
|
||||||
|
res.second = sec;
|
||||||
} else if hms == 2 {
|
} else if hms == 2 {
|
||||||
let (sec, micro) = self.parsems(value_repr).unwrap();
|
let (sec, micro) = self.parsems(value_repr).unwrap();
|
||||||
|
res.second = Some(sec);
|
||||||
|
res.microsecond = Some(micro);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
160
tests/compat.rs
160
tests/compat.rs
@ -45,8 +45,6 @@ fn test_split() {
|
|||||||
|
|
||||||
macro_rules! test_parse {
|
macro_rules! test_parse {
|
||||||
($py:ident, $parser:ident, $datetime:ident, $s:expr) => {
|
($py:ident, $parser:ident, $datetime:ident, $s:expr) => {
|
||||||
println!("Attempting to parse: {}", $s);
|
|
||||||
|
|
||||||
let default_pydate = $datetime
|
let default_pydate = $datetime
|
||||||
.call_method1("datetime", (2003, 9, 25))
|
.call_method1("datetime", (2003, 9, 25))
|
||||||
.expect("Unable to create default datetime");
|
.expect("Unable to create default datetime");
|
||||||
@ -85,49 +83,49 @@ macro_rules! test_parse {
|
|||||||
.expect("Unable to get `year` value")
|
.expect("Unable to get `year` value")
|
||||||
.extract($py)
|
.extract($py)
|
||||||
.expect("Unable to convert `year` to i32");
|
.expect("Unable to convert `year` to i32");
|
||||||
assert_eq!(py_year, rs_dt.year());
|
assert_eq!(py_year, rs_dt.year(), "Mismatched year for '{}'", $s);
|
||||||
|
|
||||||
let py_month: u32 = py_parsed
|
let py_month: u32 = py_parsed
|
||||||
.getattr($py, "month")
|
.getattr($py, "month")
|
||||||
.expect("Unable to get `month` value")
|
.expect("Unable to get `month` value")
|
||||||
.extract($py)
|
.extract($py)
|
||||||
.expect("Unable to convert `month` to u32");
|
.expect("Unable to convert `month` to u32");
|
||||||
assert_eq!(py_month, rs_dt.month());
|
assert_eq!(py_month, rs_dt.month(), "Mismatched month for '{}'", $s);
|
||||||
|
|
||||||
let py_day: u32 = py_parsed
|
let py_day: u32 = py_parsed
|
||||||
.getattr($py, "day")
|
.getattr($py, "day")
|
||||||
.expect("Unable to get `day` value")
|
.expect("Unable to get `day` value")
|
||||||
.extract($py)
|
.extract($py)
|
||||||
.expect("Unable to convert `day` to u32");
|
.expect("Unable to convert `day` to u32");
|
||||||
assert_eq!(py_day, rs_dt.day());
|
assert_eq!(py_day, rs_dt.day(), "Mismatched day for '{}'", $s);
|
||||||
|
|
||||||
let py_hour: u32 = py_parsed
|
let py_hour: u32 = py_parsed
|
||||||
.getattr($py, "hour")
|
.getattr($py, "hour")
|
||||||
.expect("Unable to get `hour` value")
|
.expect("Unable to get `hour` value")
|
||||||
.extract($py)
|
.extract($py)
|
||||||
.expect("Unable to convert `hour` to u32");
|
.expect("Unable to convert `hour` to u32");
|
||||||
assert_eq!(py_hour, rs_dt.hour());
|
assert_eq!(py_hour, rs_dt.hour(), "Mismatched hour for '{}'", $s);
|
||||||
|
|
||||||
let py_minute: u32 = py_parsed
|
let py_minute: u32 = py_parsed
|
||||||
.getattr($py, "minute")
|
.getattr($py, "minute")
|
||||||
.expect("Unable to get `minute` value")
|
.expect("Unable to get `minute` value")
|
||||||
.extract($py)
|
.extract($py)
|
||||||
.expect("Unable to convert `minute` to u32");
|
.expect("Unable to convert `minute` to u32");
|
||||||
assert_eq!(py_minute, rs_dt.minute());
|
assert_eq!(py_minute, rs_dt.minute(), "Mismatched minute for '{}'", $s);
|
||||||
|
|
||||||
let py_second: u32 = py_parsed
|
let py_second: u32 = py_parsed
|
||||||
.getattr($py, "second")
|
.getattr($py, "second")
|
||||||
.expect("Unable to get `second` value")
|
.expect("Unable to get `second` value")
|
||||||
.extract($py)
|
.extract($py)
|
||||||
.expect("Unable to convert `second` to u32");
|
.expect("Unable to convert `second` to u32");
|
||||||
assert_eq!(py_second, rs_dt.second());
|
assert_eq!(py_second, rs_dt.second(), "Mismatched second for '{}'", $s);
|
||||||
|
|
||||||
let py_microsecond: u32 = py_parsed
|
let py_microsecond: u32 = py_parsed
|
||||||
.getattr($py, "microsecond")
|
.getattr($py, "microsecond")
|
||||||
.expect("Unable to get `microsecond` value")
|
.expect("Unable to get `microsecond` value")
|
||||||
.extract($py)
|
.extract($py)
|
||||||
.expect("Unable to convert `microsecond` to u32");
|
.expect("Unable to convert `microsecond` to u32");
|
||||||
assert_eq!(py_microsecond, rs_dt.nanosecond() / 1000);
|
assert_eq!(py_microsecond, rs_dt.nanosecond() / 1000, "Mismatched microsecond for '{}'", $s);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -262,7 +260,147 @@ fn test_dateutil_compat() {
|
|||||||
test_parse!(py, parser, datetime, "03 25 Sep");
|
test_parse!(py, parser, datetime, "03 25 Sep");
|
||||||
// testStrangelyOrderedDate3
|
// testStrangelyOrderedDate3
|
||||||
test_parse!(py, parser, datetime, "25 03 Sep");
|
test_parse!(py, parser, datetime, "25 03 Sep");
|
||||||
// TODO: Fix UnrecognizedToken error
|
|
||||||
// testHourWithLetters
|
// testHourWithLetters
|
||||||
// test_parse!(py, parser, datetime, "10h36m28.5s");
|
test_parse!(py, parser, datetime, "10h36m28.5s");
|
||||||
|
// testHourWithLettersStrip1
|
||||||
|
test_parse!(py, parser, datetime, "10h36m28s");
|
||||||
|
// testHourWithLettersStrip2
|
||||||
|
test_parse!(py, parser, datetime, "10h36m");
|
||||||
|
// testHourWithLettersStrip3
|
||||||
|
test_parse!(py, parser, datetime, "10h");
|
||||||
|
// testHourWithLettersStrip4
|
||||||
|
test_parse!(py, parser, datetime, "10 h 36");
|
||||||
|
|
||||||
|
// TODO: Fix half a minute being 30 seconds
|
||||||
|
// testHourWithLettersStrip5
|
||||||
|
|
||||||
|
// test_parse!(py, parser, datetime, "10 h 36.5");
|
||||||
|
// testMinuteWithLettersSpaces1
|
||||||
|
test_parse!(py, parser, datetime, "36 m 5");
|
||||||
|
// testMinuteWithLettersSpaces2
|
||||||
|
test_parse!(py, parser, datetime, "36 m 5 s");
|
||||||
|
// testMinuteWithLettersSpaces3
|
||||||
|
test_parse!(py, parser, datetime, "36 m 05");
|
||||||
|
// testMinuteWithLettersSpaces4
|
||||||
|
test_parse!(py, parser, datetime, "36 m 05 s");
|
||||||
|
|
||||||
|
// TODO: Add testAMPMNoHour
|
||||||
|
|
||||||
|
// testHourAmPm1
|
||||||
|
test_parse!(py, parser, datetime, "10h am");
|
||||||
|
// testHourAmPm2
|
||||||
|
test_parse!(py, parser, datetime, "10h pm");
|
||||||
|
// testHourAmPm3
|
||||||
|
test_parse!(py, parser, datetime, "10am");
|
||||||
|
// testHourAmPm4
|
||||||
|
test_parse!(py, parser, datetime, "10pm");
|
||||||
|
// testHourAmPm5
|
||||||
|
test_parse!(py, parser, datetime, "10:00 am");
|
||||||
|
// testHourAmPm6
|
||||||
|
test_parse!(py, parser, datetime, "10:00 pm");
|
||||||
|
// testHourAmPm7
|
||||||
|
test_parse!(py, parser, datetime, "10:00am");
|
||||||
|
// testHourAmPm8
|
||||||
|
test_parse!(py, parser, datetime, "10:00pm");
|
||||||
|
// testHourAmPm9
|
||||||
|
test_parse!(py, parser, datetime, "10:00a.m");
|
||||||
|
// testHourAmPm10
|
||||||
|
test_parse!(py, parser, datetime, "10:00p.m");
|
||||||
|
// testHourAmPm11
|
||||||
|
test_parse!(py, parser, datetime, "10:00a.m.");
|
||||||
|
// testHourAmPm12
|
||||||
|
test_parse!(py, parser, datetime, "10:00p.m.");
|
||||||
|
|
||||||
|
// TODO: Add testAMPMRange
|
||||||
|
|
||||||
|
// testPertain
|
||||||
|
test_parse!(py, parser, datetime, "Sep 03");
|
||||||
|
test_parse!(py, parser, datetime, "Sep of 03");
|
||||||
|
|
||||||
|
// TODO: Handle weekdays, rather than absolute days
|
||||||
|
// testWeekdayAlone
|
||||||
|
// test_parse!(py, parser, datetime, "Wed");
|
||||||
|
// testLongWeekday
|
||||||
|
// test_parse!(py, parser, datetime, "Wednesday");
|
||||||
|
|
||||||
|
// testLongMonth
|
||||||
|
test_parse!(py, parser, datetime, "October");
|
||||||
|
// testZeroYear
|
||||||
|
test_parse!(py, parser, datetime, "31-Dec-00");
|
||||||
|
|
||||||
|
// TODO: Handle fuzzy tests
|
||||||
|
|
||||||
|
// testExtraSpace
|
||||||
|
test_parse!(py, parser, datetime, " July 4 , 1976 12:01:02 am ");
|
||||||
|
|
||||||
|
// testRandomFormat1
|
||||||
|
test_parse!(py, parser, datetime, "Wed, July 10, '96");
|
||||||
|
// testRandomFormat2 - Needs `ignoretz`
|
||||||
|
// test_parse!(py, parser, datetime, "1996.07.10 AD at 15:08:56 PDT");
|
||||||
|
|
||||||
|
// testRandomFormat3
|
||||||
|
test_parse!(py, parser, datetime, "1996.July.10 AD 12:08 PM");
|
||||||
|
|
||||||
|
// testRandomFormat4 - Needs `ignoretz`
|
||||||
|
// test_parse!(py, parser, datetime, "Tuesday, April 12, 1952 AD 3:30:42pm PST");
|
||||||
|
// testRandomFormat5 - Needs `ignoretz`
|
||||||
|
// test_parse!(py, parser, datetime, "November 5, 1994, 8:15:30 am EST");
|
||||||
|
// testRandomFormat6 - Needs `ignoretz`
|
||||||
|
// test_parse!(py, parser, datetime, "1994-11-05T08:15:30-05:00");
|
||||||
|
// testRandomFormat7 - Needs `ignoretz`
|
||||||
|
// test_parse!(py, parser, datetime, "1994-11-05T08:15:30Z");
|
||||||
|
// testRandomFormat8
|
||||||
|
test_parse!(py, parser, datetime, "July 4, 1976");
|
||||||
|
// testRandomFormat9
|
||||||
|
test_parse!(py, parser, datetime, "7 4 1976");
|
||||||
|
// testRandomFormat10
|
||||||
|
test_parse!(py, parser, datetime, "4 jul 1976");
|
||||||
|
// testRandomFormat11
|
||||||
|
test_parse!(py, parser, datetime, "7-4-76");
|
||||||
|
// testRandomFormat12
|
||||||
|
test_parse!(py, parser, datetime, "19760704");
|
||||||
|
// testRandomFormat13
|
||||||
|
test_parse!(py, parser, datetime, "0:01:02");
|
||||||
|
// testRandomFormat14
|
||||||
|
test_parse!(py, parser, datetime, "12h 01m02s am");
|
||||||
|
// testRandomFormat15; NB: testRandomFormat16 is exactly the same
|
||||||
|
test_parse!(py, parser, datetime, "0:01:02 on July 4, 1976");
|
||||||
|
// testRandomFormat17 - Needs `ignoretz`
|
||||||
|
// test_parse!(py, parser, datetime, "1976-07-04T00:01:02Z");
|
||||||
|
// testRandomFormat18
|
||||||
|
test_parse!(py, parser, datetime, "July 4, 1976 12:01:02 am");
|
||||||
|
// testRandomFormat19
|
||||||
|
test_parse!(py, parser, datetime, "Mon Jan 2 04:24:27 1995");
|
||||||
|
// testRandomFormat20 - Needs `ignoretz`
|
||||||
|
// test_parse!(py, parser, datetime, "Tue Apr 4 00:22:12 PDT 1995");
|
||||||
|
// testRandomFormat21
|
||||||
|
test_parse!(py, parser, datetime, "04.04.95 00:22");
|
||||||
|
// testRandomFormat22
|
||||||
|
test_parse!(py, parser, datetime, "Jan 1 1999 11:23:34.578");
|
||||||
|
// testRandomFormat23
|
||||||
|
test_parse!(py, parser, datetime, "950404 122212");
|
||||||
|
// testRandomFormat24 - Needs `ignoretz`
|
||||||
|
// test_parse!(py, parser, datetime, "0:00 PM, PST");
|
||||||
|
// testRandomFormat25
|
||||||
|
test_parse!(py, parser, datetime, "12:08 PM");
|
||||||
|
// testRandomFormat26
|
||||||
|
test_parse!(py, parser, datetime, "5:50 A.M. on June 13, 1990");
|
||||||
|
// testRandomFormat27
|
||||||
|
test_parse!(py, parser, datetime, "3rd of May 2001");
|
||||||
|
// testRandomFormat28
|
||||||
|
test_parse!(py, parser, datetime, "5th of March 2001");
|
||||||
|
// testRandomFormat29
|
||||||
|
test_parse!(py, parser, datetime, "1st of May 2003");
|
||||||
|
// testRandomFormat30
|
||||||
|
test_parse!(py, parser, datetime, "01h02m03");
|
||||||
|
// testRandomFormat31
|
||||||
|
test_parse!(py, parser, datetime, "01h02");
|
||||||
|
// testRandomFormat32
|
||||||
|
test_parse!(py, parser, datetime, "01h02s");
|
||||||
|
// testRandomFormat33
|
||||||
|
test_parse!(py, parser, datetime, "01m02");
|
||||||
|
// testRandomFormat34
|
||||||
|
test_parse!(py, parser, datetime, "01m02h");
|
||||||
|
// testRandomFormat35
|
||||||
|
test_parse!(py, parser, datetime, "2004 10 Apr 11h30m");
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user