|
|
|
@ -1,5 +1,5 @@
|
|
|
|
|
/*
|
|
|
|
|
* Copyright 2022, The Cozo Project Authors. Licensed under AGPL-3 or later.
|
|
|
|
|
* Copyright 2022, The Cozo Project Authors. Licensed under MPL-2.0.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
use approx::AbsDiffEq;
|
|
|
|
@ -121,7 +121,7 @@ fn test_is_in() {
|
|
|
|
|
DataValue::from(1),
|
|
|
|
|
DataValue::List(vec![DataValue::from(1), DataValue::from(2)])
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::Bool(true)
|
|
|
|
|
);
|
|
|
|
|
assert_eq!(
|
|
|
|
@ -129,7 +129,7 @@ fn test_is_in() {
|
|
|
|
|
DataValue::from(3),
|
|
|
|
|
DataValue::List(vec![DataValue::from(1), DataValue::from(2)])
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::Bool(false)
|
|
|
|
|
);
|
|
|
|
|
assert_eq!(
|
|
|
|
@ -245,7 +245,7 @@ fn test_comparators() {
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn test_max_min() {
|
|
|
|
|
assert_eq!(op_max(&[DataValue::from(1), ]).unwrap(), DataValue::from(1));
|
|
|
|
|
assert_eq!(op_max(&[DataValue::from(1),]).unwrap(), DataValue::from(1));
|
|
|
|
|
assert_eq!(
|
|
|
|
|
op_max(&[
|
|
|
|
|
DataValue::from(1),
|
|
|
|
@ -253,7 +253,7 @@ fn test_max_min() {
|
|
|
|
|
DataValue::from(3),
|
|
|
|
|
DataValue::from(4)
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::from(4)
|
|
|
|
|
);
|
|
|
|
|
assert_eq!(
|
|
|
|
@ -263,7 +263,7 @@ fn test_max_min() {
|
|
|
|
|
DataValue::from(3),
|
|
|
|
|
DataValue::from(4)
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::from(4)
|
|
|
|
|
);
|
|
|
|
|
assert_eq!(
|
|
|
|
@ -273,12 +273,12 @@ fn test_max_min() {
|
|
|
|
|
DataValue::from(3),
|
|
|
|
|
DataValue::from(4.0)
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::from(4.0)
|
|
|
|
|
);
|
|
|
|
|
assert!(op_max(&[DataValue::Bool(true)]).is_err());
|
|
|
|
|
|
|
|
|
|
assert_eq!(op_min(&[DataValue::from(1), ]).unwrap(), DataValue::from(1));
|
|
|
|
|
assert_eq!(op_min(&[DataValue::from(1),]).unwrap(), DataValue::from(1));
|
|
|
|
|
assert_eq!(
|
|
|
|
|
op_min(&[
|
|
|
|
|
DataValue::from(1),
|
|
|
|
@ -286,7 +286,7 @@ fn test_max_min() {
|
|
|
|
|
DataValue::from(3),
|
|
|
|
|
DataValue::from(4)
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::from(1)
|
|
|
|
|
);
|
|
|
|
|
assert_eq!(
|
|
|
|
@ -296,7 +296,7 @@ fn test_max_min() {
|
|
|
|
|
DataValue::from(3),
|
|
|
|
|
DataValue::from(4)
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::from(1.0)
|
|
|
|
|
);
|
|
|
|
|
assert_eq!(
|
|
|
|
@ -306,7 +306,7 @@ fn test_max_min() {
|
|
|
|
|
DataValue::from(3),
|
|
|
|
|
DataValue::from(4.0)
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::from(1)
|
|
|
|
|
);
|
|
|
|
|
assert!(op_max(&[DataValue::Bool(true)]).is_err());
|
|
|
|
@ -560,7 +560,7 @@ fn test_bits() {
|
|
|
|
|
DataValue::Bytes([0b111000].into()),
|
|
|
|
|
DataValue::Bytes([0b010101].into())
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::Bytes([0b010000].into())
|
|
|
|
|
);
|
|
|
|
|
assert_eq!(
|
|
|
|
@ -568,7 +568,7 @@ fn test_bits() {
|
|
|
|
|
DataValue::Bytes([0b111000].into()),
|
|
|
|
|
DataValue::Bytes([0b010101].into())
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::Bytes([0b111101].into())
|
|
|
|
|
);
|
|
|
|
|
assert_eq!(
|
|
|
|
@ -580,7 +580,7 @@ fn test_bits() {
|
|
|
|
|
DataValue::Bytes([0b111000].into()),
|
|
|
|
|
DataValue::Bytes([0b010101].into())
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::Bytes([0b101101].into())
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
@ -618,7 +618,7 @@ fn test_concat() {
|
|
|
|
|
DataValue::List(vec![DataValue::Bool(true), DataValue::Bool(false)]),
|
|
|
|
|
DataValue::List(vec![DataValue::Bool(true)])
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::List(vec![
|
|
|
|
|
DataValue::Bool(true),
|
|
|
|
|
DataValue::Bool(false),
|
|
|
|
@ -634,7 +634,7 @@ fn test_str_includes() {
|
|
|
|
|
DataValue::Str("abcdef".into()),
|
|
|
|
|
DataValue::Str("bcd".into())
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::Bool(true)
|
|
|
|
|
);
|
|
|
|
|
assert_eq!(
|
|
|
|
@ -678,7 +678,7 @@ fn test_starts_ends_with() {
|
|
|
|
|
DataValue::Str("abcdef".into()),
|
|
|
|
|
DataValue::Str("abc".into())
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::Bool(true)
|
|
|
|
|
);
|
|
|
|
|
assert_eq!(
|
|
|
|
@ -690,7 +690,7 @@ fn test_starts_ends_with() {
|
|
|
|
|
DataValue::Str("abcdef".into()),
|
|
|
|
|
DataValue::Str("def".into())
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::Bool(true)
|
|
|
|
|
);
|
|
|
|
|
assert_eq!(
|
|
|
|
@ -706,7 +706,7 @@ fn test_regex() {
|
|
|
|
|
DataValue::Str("abcdef".into()),
|
|
|
|
|
DataValue::Regex(RegexWrapper(Regex::new("c.e").unwrap()))
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::Bool(true)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
@ -715,7 +715,7 @@ fn test_regex() {
|
|
|
|
|
DataValue::Str("abcdef".into()),
|
|
|
|
|
DataValue::Regex(RegexWrapper(Regex::new("c.ef$").unwrap()))
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::Bool(true)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
@ -724,7 +724,7 @@ fn test_regex() {
|
|
|
|
|
DataValue::Str("abcdef".into()),
|
|
|
|
|
DataValue::Regex(RegexWrapper(Regex::new("c.e$").unwrap()))
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::Bool(false)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
@ -734,7 +734,7 @@ fn test_regex() {
|
|
|
|
|
DataValue::Regex(RegexWrapper(Regex::new("[be]").unwrap())),
|
|
|
|
|
DataValue::Str("x".into())
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::Str("axcdef".into())
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
@ -744,7 +744,7 @@ fn test_regex() {
|
|
|
|
|
DataValue::Regex(RegexWrapper(Regex::new("[be]").unwrap())),
|
|
|
|
|
DataValue::Str("x".into())
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::Str("axcdxf".into())
|
|
|
|
|
);
|
|
|
|
|
assert_eq!(
|
|
|
|
@ -752,7 +752,7 @@ fn test_regex() {
|
|
|
|
|
DataValue::Str("abCDefGH".into()),
|
|
|
|
|
DataValue::Regex(RegexWrapper(Regex::new("[xayef]|(GH)").unwrap()))
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::List(vec![
|
|
|
|
|
DataValue::Str("a".into()),
|
|
|
|
|
DataValue::Str("e".into()),
|
|
|
|
@ -765,7 +765,7 @@ fn test_regex() {
|
|
|
|
|
DataValue::Str("abCDefGH".into()),
|
|
|
|
|
DataValue::Regex(RegexWrapper(Regex::new("[xayef]|(GH)").unwrap()))
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::Str("a".into()),
|
|
|
|
|
);
|
|
|
|
|
assert_eq!(
|
|
|
|
@ -773,7 +773,7 @@ fn test_regex() {
|
|
|
|
|
DataValue::Str("abCDefGH".into()),
|
|
|
|
|
DataValue::Regex(RegexWrapper(Regex::new("xyz").unwrap()))
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::List(vec![])
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
@ -782,7 +782,7 @@ fn test_regex() {
|
|
|
|
|
DataValue::Str("abCDefGH".into()),
|
|
|
|
|
DataValue::Regex(RegexWrapper(Regex::new("xyz").unwrap()))
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::Null
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
@ -902,7 +902,7 @@ fn test_prepend_append() {
|
|
|
|
|
DataValue::List(vec![DataValue::from(1), DataValue::from(2)]),
|
|
|
|
|
DataValue::Null,
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::List(vec![
|
|
|
|
|
DataValue::Null,
|
|
|
|
|
DataValue::from(1),
|
|
|
|
@ -914,7 +914,7 @@ fn test_prepend_append() {
|
|
|
|
|
DataValue::List(vec![DataValue::from(1), DataValue::from(2)]),
|
|
|
|
|
DataValue::Null,
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::List(vec![
|
|
|
|
|
DataValue::from(1),
|
|
|
|
|
DataValue::from(2),
|
|
|
|
@ -957,7 +957,7 @@ fn test_sort_reverse() {
|
|
|
|
|
DataValue::from(2),
|
|
|
|
|
DataValue::Null,
|
|
|
|
|
])])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::List(vec![
|
|
|
|
|
DataValue::Null,
|
|
|
|
|
DataValue::from(1),
|
|
|
|
@ -972,7 +972,7 @@ fn test_sort_reverse() {
|
|
|
|
|
DataValue::from(2),
|
|
|
|
|
DataValue::Null,
|
|
|
|
|
])])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::List(vec![
|
|
|
|
|
DataValue::Null,
|
|
|
|
|
DataValue::from(2),
|
|
|
|
@ -990,9 +990,9 @@ fn test_haversine() {
|
|
|
|
|
DataValue::from(0),
|
|
|
|
|
DataValue::from(180),
|
|
|
|
|
])
|
|
|
|
|
.unwrap()
|
|
|
|
|
.get_float()
|
|
|
|
|
.unwrap();
|
|
|
|
|
.unwrap()
|
|
|
|
|
.get_float()
|
|
|
|
|
.unwrap();
|
|
|
|
|
assert!(d.abs_diff_eq(&f64::PI(), 1e-5));
|
|
|
|
|
|
|
|
|
|
let d = op_haversine_deg_input(&[
|
|
|
|
@ -1001,9 +1001,9 @@ fn test_haversine() {
|
|
|
|
|
DataValue::from(0),
|
|
|
|
|
DataValue::from(123),
|
|
|
|
|
])
|
|
|
|
|
.unwrap()
|
|
|
|
|
.get_float()
|
|
|
|
|
.unwrap();
|
|
|
|
|
.unwrap()
|
|
|
|
|
.get_float()
|
|
|
|
|
.unwrap();
|
|
|
|
|
assert!(d.abs_diff_eq(&(f64::PI() / 2.), 1e-5));
|
|
|
|
|
|
|
|
|
|
let d = op_haversine(&[
|
|
|
|
@ -1012,9 +1012,9 @@ fn test_haversine() {
|
|
|
|
|
DataValue::from(0),
|
|
|
|
|
DataValue::from(f64::PI()),
|
|
|
|
|
])
|
|
|
|
|
.unwrap()
|
|
|
|
|
.get_float()
|
|
|
|
|
.unwrap();
|
|
|
|
|
.unwrap()
|
|
|
|
|
.get_float()
|
|
|
|
|
.unwrap();
|
|
|
|
|
assert!(d.abs_diff_eq(&f64::PI(), 1e-5));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1045,7 +1045,7 @@ fn test_first_last() {
|
|
|
|
|
DataValue::from(1),
|
|
|
|
|
DataValue::from(2),
|
|
|
|
|
])])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::from(1),
|
|
|
|
|
);
|
|
|
|
|
assert_eq!(
|
|
|
|
@ -1053,7 +1053,7 @@ fn test_first_last() {
|
|
|
|
|
DataValue::from(1),
|
|
|
|
|
DataValue::from(2),
|
|
|
|
|
])])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::from(2),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
@ -1071,7 +1071,7 @@ fn test_chunks() {
|
|
|
|
|
]),
|
|
|
|
|
DataValue::from(2),
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::List(vec![
|
|
|
|
|
DataValue::List(vec![DataValue::from(1), DataValue::from(2)]),
|
|
|
|
|
DataValue::List(vec![DataValue::from(3), DataValue::from(4)]),
|
|
|
|
@ -1089,7 +1089,7 @@ fn test_chunks() {
|
|
|
|
|
]),
|
|
|
|
|
DataValue::from(2),
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::List(vec![
|
|
|
|
|
DataValue::List(vec![DataValue::from(1), DataValue::from(2)]),
|
|
|
|
|
DataValue::List(vec![DataValue::from(3), DataValue::from(4)]),
|
|
|
|
@ -1106,7 +1106,7 @@ fn test_chunks() {
|
|
|
|
|
]),
|
|
|
|
|
DataValue::from(3),
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::List(vec![
|
|
|
|
|
DataValue::List(vec![
|
|
|
|
|
DataValue::from(1),
|
|
|
|
@ -1139,7 +1139,7 @@ fn test_get() {
|
|
|
|
|
]),
|
|
|
|
|
DataValue::from(1)
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::from(2)
|
|
|
|
|
);
|
|
|
|
|
assert_eq!(
|
|
|
|
@ -1155,7 +1155,7 @@ fn test_get() {
|
|
|
|
|
]),
|
|
|
|
|
DataValue::from(1)
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::from(2)
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
@ -1171,7 +1171,7 @@ fn test_slice() {
|
|
|
|
|
DataValue::from(1),
|
|
|
|
|
DataValue::from(4)
|
|
|
|
|
])
|
|
|
|
|
.is_err());
|
|
|
|
|
.is_err());
|
|
|
|
|
|
|
|
|
|
assert_eq!(
|
|
|
|
|
op_slice(&[
|
|
|
|
@ -1183,7 +1183,7 @@ fn test_slice() {
|
|
|
|
|
DataValue::from(1),
|
|
|
|
|
DataValue::from(-1)
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::List(vec![DataValue::from(2)])
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
@ -1285,7 +1285,7 @@ fn test_set_ops() {
|
|
|
|
|
DataValue::List([2, 3, 4].into_iter().map(DataValue::from).collect()),
|
|
|
|
|
DataValue::List([3, 4, 5].into_iter().map(DataValue::from).collect())
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::List([1, 2, 3, 4, 5].into_iter().map(DataValue::from).collect())
|
|
|
|
|
);
|
|
|
|
|
assert_eq!(
|
|
|
|
@ -1299,7 +1299,7 @@ fn test_set_ops() {
|
|
|
|
|
DataValue::List([2, 3, 4].into_iter().map(DataValue::from).collect()),
|
|
|
|
|
DataValue::List([3, 4, 5].into_iter().map(DataValue::from).collect())
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::List([3, 4].into_iter().map(DataValue::from).collect())
|
|
|
|
|
);
|
|
|
|
|
assert_eq!(
|
|
|
|
@ -1313,7 +1313,7 @@ fn test_set_ops() {
|
|
|
|
|
DataValue::List([2, 3, 4].into_iter().map(DataValue::from).collect()),
|
|
|
|
|
DataValue::List([3, 4, 5].into_iter().map(DataValue::from).collect())
|
|
|
|
|
])
|
|
|
|
|
.unwrap(),
|
|
|
|
|
.unwrap(),
|
|
|
|
|
DataValue::List([1, 6].into_iter().map(DataValue::from).collect())
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
@ -1325,7 +1325,10 @@ fn test_uuid() {
|
|
|
|
|
assert!(op_is_uuid(&[v4]).unwrap().get_bool().unwrap());
|
|
|
|
|
assert!(op_uuid_timestamp(&[v1]).unwrap().get_float().is_some());
|
|
|
|
|
assert!(op_to_uuid(&[DataValue::Str(SmartString::from(""))]).is_err());
|
|
|
|
|
assert!(op_to_uuid(&[DataValue::Str(SmartString::from("f3b4958c-52a1-11e7-802a-010203040506"))]).is_ok());
|
|
|
|
|
assert!(op_to_uuid(&[DataValue::Str(SmartString::from(
|
|
|
|
|
"f3b4958c-52a1-11e7-802a-010203040506"
|
|
|
|
|
))])
|
|
|
|
|
.is_ok());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
@ -1334,4 +1337,9 @@ fn test_now() {
|
|
|
|
|
assert!(matches!(now, DataValue::Num(_)));
|
|
|
|
|
let s = op_format_timestamp(&[now]).unwrap();
|
|
|
|
|
let _dt = op_parse_timestamp(&[s]).unwrap();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn test_to_bool() {
|
|
|
|
|
todo!()
|
|
|
|
|
}
|
|
|
|
|