in arrow-cast/src/parse.rs [2128:2353]
fn test_parse_interval() {
let config = IntervalParseConfig::new(IntervalUnit::Month);
assert_eq!(
Interval::new(1i32, 0i32, 0i64),
Interval::parse("1 month", &config).unwrap(),
);
assert_eq!(
Interval::new(2i32, 0i32, 0i64),
Interval::parse("2 month", &config).unwrap(),
);
assert_eq!(
Interval::new(-1i32, -18i32, -(NANOS_PER_DAY / 5)),
Interval::parse("-1.5 months -3.2 days", &config).unwrap(),
);
assert_eq!(
Interval::new(0i32, 15i32, 0),
Interval::parse("0.5 months", &config).unwrap(),
);
assert_eq!(
Interval::new(0i32, 15i32, 0),
Interval::parse(".5 months", &config).unwrap(),
);
assert_eq!(
Interval::new(0i32, -15i32, 0),
Interval::parse("-0.5 months", &config).unwrap(),
);
assert_eq!(
Interval::new(0i32, -15i32, 0),
Interval::parse("-.5 months", &config).unwrap(),
);
assert_eq!(
Interval::new(2i32, 10i32, 9 * NANOS_PER_HOUR),
Interval::parse("2.1 months 7.25 days 3 hours", &config).unwrap(),
);
assert_eq!(
Interval::parse("1 centurys 1 month", &config)
.unwrap_err()
.to_string(),
r#"Parser error: Invalid input syntax for type interval: "1 centurys 1 month""#
);
assert_eq!(
Interval::new(37i32, 0i32, 0i64),
Interval::parse("3 year 1 month", &config).unwrap(),
);
assert_eq!(
Interval::new(35i32, 0i32, 0i64),
Interval::parse("3 year -1 month", &config).unwrap(),
);
assert_eq!(
Interval::new(-37i32, 0i32, 0i64),
Interval::parse("-3 year -1 month", &config).unwrap(),
);
assert_eq!(
Interval::new(-35i32, 0i32, 0i64),
Interval::parse("-3 year 1 month", &config).unwrap(),
);
assert_eq!(
Interval::new(0i32, 5i32, 0i64),
Interval::parse("5 days", &config).unwrap(),
);
assert_eq!(
Interval::new(0i32, 7i32, 3 * NANOS_PER_HOUR),
Interval::parse("7 days 3 hours", &config).unwrap(),
);
assert_eq!(
Interval::new(0i32, 7i32, 5 * NANOS_PER_MINUTE),
Interval::parse("7 days 5 minutes", &config).unwrap(),
);
assert_eq!(
Interval::new(0i32, 7i32, -5 * NANOS_PER_MINUTE),
Interval::parse("7 days -5 minutes", &config).unwrap(),
);
assert_eq!(
Interval::new(0i32, -7i32, 5 * NANOS_PER_HOUR),
Interval::parse("-7 days 5 hours", &config).unwrap(),
);
assert_eq!(
Interval::new(
0i32,
-7i32,
-5 * NANOS_PER_HOUR - 5 * NANOS_PER_MINUTE - 5 * NANOS_PER_SECOND
),
Interval::parse("-7 days -5 hours -5 minutes -5 seconds", &config).unwrap(),
);
assert_eq!(
Interval::new(12i32, 0i32, 25 * NANOS_PER_MILLIS),
Interval::parse("1 year 25 millisecond", &config).unwrap(),
);
assert_eq!(
Interval::new(
12i32,
1i32,
(NANOS_PER_SECOND as f64 * 0.000000001_f64) as i64
),
Interval::parse("1 year 1 day 0.000000001 seconds", &config).unwrap(),
);
assert_eq!(
Interval::new(12i32, 1i32, NANOS_PER_MILLIS / 10),
Interval::parse("1 year 1 day 0.1 milliseconds", &config).unwrap(),
);
assert_eq!(
Interval::new(12i32, 1i32, 1000i64),
Interval::parse("1 year 1 day 1 microsecond", &config).unwrap(),
);
assert_eq!(
Interval::new(12i32, 1i32, 1i64),
Interval::parse("1 year 1 day 1 nanoseconds", &config).unwrap(),
);
assert_eq!(
Interval::new(1i32, 0i32, -NANOS_PER_SECOND),
Interval::parse("1 month -1 second", &config).unwrap(),
);
assert_eq!(
Interval::new(
-13i32,
-8i32,
-NANOS_PER_HOUR
- NANOS_PER_MINUTE
- NANOS_PER_SECOND
- (1.11_f64 * NANOS_PER_MILLIS as f64) as i64
),
Interval::parse(
"-1 year -1 month -1 week -1 day -1 hour -1 minute -1 second -1.11 millisecond",
&config
)
.unwrap(),
);
// no units
assert_eq!(
Interval::new(1, 0, 0),
Interval::parse("1", &config).unwrap()
);
assert_eq!(
Interval::new(42, 0, 0),
Interval::parse("42", &config).unwrap()
);
assert_eq!(
Interval::new(0, 0, 42_000_000_000),
Interval::parse("42", &IntervalParseConfig::new(IntervalUnit::Second)).unwrap()
);
// shorter units
assert_eq!(
Interval::new(1, 0, 0),
Interval::parse("1 mon", &config).unwrap()
);
assert_eq!(
Interval::new(1, 0, 0),
Interval::parse("1 mons", &config).unwrap()
);
assert_eq!(
Interval::new(0, 0, 1_000_000),
Interval::parse("1 ms", &config).unwrap()
);
assert_eq!(
Interval::new(0, 0, 1_000),
Interval::parse("1 us", &config).unwrap()
);
// no space
assert_eq!(
Interval::new(0, 0, 1_000),
Interval::parse("1us", &config).unwrap()
);
assert_eq!(
Interval::new(0, 0, NANOS_PER_SECOND),
Interval::parse("1s", &config).unwrap()
);
assert_eq!(
Interval::new(1, 2, 10_864_000_000_000),
Interval::parse("1mon 2days 3hr 1min 4sec", &config).unwrap()
);
assert_eq!(
Interval::new(
-13i32,
-8i32,
-NANOS_PER_HOUR
- NANOS_PER_MINUTE
- NANOS_PER_SECOND
- (1.11_f64 * NANOS_PER_MILLIS as f64) as i64
),
Interval::parse(
"-1year -1month -1week -1day -1 hour -1 minute -1 second -1.11millisecond",
&config
)
.unwrap(),
);
assert_eq!(
Interval::parse("1h s", &config).unwrap_err().to_string(),
r#"Parser error: Invalid input syntax for type interval: "1h s""#
);
assert_eq!(
Interval::parse("1XX", &config).unwrap_err().to_string(),
r#"Parser error: Invalid input syntax for type interval: "1XX""#
);
}