use approx::AbsDiffEq;
use num_traits::FloatConst;
use regex::Regex;
use serde_json::json;
use crate::data::functions::*;
use crate::data::value::{DataValue, RegexWrapper};
use crate::DbInstance;
#[test]
fn test_add() {
assert_eq!(op_add(&[]).unwrap(), DataValue::from(0));
assert_eq!(op_add(&[DataValue::from(1)]).unwrap(), DataValue::from(1));
assert_eq!(
op_add(&[DataValue::from(1), DataValue::from(2)]).unwrap(),
DataValue::from(3)
);
assert_eq!(
op_add(&[DataValue::from(1), DataValue::from(2.5)]).unwrap(),
DataValue::from(3.5)
);
assert_eq!(
op_add(&[DataValue::from(1.5), DataValue::from(2.5)]).unwrap(),
DataValue::from(4.0)
);
}
#[test]
fn test_sub() {
assert_eq!(
op_sub(&[DataValue::from(1), DataValue::from(2)]).unwrap(),
DataValue::from(-1)
);
assert_eq!(
op_sub(&[DataValue::from(1), DataValue::from(2.5)]).unwrap(),
DataValue::from(-1.5)
);
assert_eq!(
op_sub(&[DataValue::from(1.5), DataValue::from(2.5)]).unwrap(),
DataValue::from(-1.0)
);
}
#[test]
fn test_mul() {
assert_eq!(op_mul(&[]).unwrap(), DataValue::from(1));
assert_eq!(
op_mul(&[DataValue::from(2), DataValue::from(3)]).unwrap(),
DataValue::from(6)
);
assert_eq!(
op_mul(&[DataValue::from(0.5), DataValue::from(0.25)]).unwrap(),
DataValue::from(0.125)
);
assert_eq!(
op_mul(&[DataValue::from(0.5), DataValue::from(3)]).unwrap(),
DataValue::from(1.5)
);
}
#[test]
fn test_div() {
assert_eq!(
op_div(&[DataValue::from(1), DataValue::from(1)]).unwrap(),
DataValue::from(1.0)
);
assert_eq!(
op_div(&[DataValue::from(1), DataValue::from(2)]).unwrap(),
DataValue::from(0.5)
);
assert_eq!(
op_div(&[DataValue::from(7.0), DataValue::from(0.5)]).unwrap(),
DataValue::from(14.0)
);
assert!(op_div(&[DataValue::from(1), DataValue::from(0)]).is_ok());
}
#[test]
fn test_eq_neq() {
assert_eq!(
op_eq(&[DataValue::from(1), DataValue::from(1.0)]).unwrap(),
DataValue::from(true)
);
assert_eq!(
op_eq(&[DataValue::from(123), DataValue::from(123)]).unwrap(),
DataValue::from(true)
);
assert_eq!(
op_neq(&[DataValue::from(1), DataValue::from(1.0)]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_neq(&[DataValue::from(123), DataValue::from(123.0)]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_eq(&[DataValue::from(123), DataValue::from(123.1)]).unwrap(),
DataValue::from(false)
);
}
#[test]
fn test_list() {
assert_eq!(op_list(&[]).unwrap(), DataValue::List(vec![]));
assert_eq!(
op_list(&[DataValue::from(1)]).unwrap(),
DataValue::List(vec![DataValue::from(1)])
);
assert_eq!(
op_list(&[DataValue::from(1), DataValue::List(vec![])]).unwrap(),
DataValue::List(vec![DataValue::from(1), DataValue::List(vec![])])
);
}
#[test]
fn test_is_in() {
assert_eq!(
op_is_in(&[
DataValue::from(1),
DataValue::List(vec![DataValue::from(1), DataValue::from(2)])
])
.unwrap(),
DataValue::from(true)
);
assert_eq!(
op_is_in(&[
DataValue::from(3),
DataValue::List(vec![DataValue::from(1), DataValue::from(2)])
])
.unwrap(),
DataValue::from(false)
);
assert_eq!(
op_is_in(&[DataValue::from(3), DataValue::List(vec![])]).unwrap(),
DataValue::from(false)
);
}
#[test]
fn test_comparators() {
assert_eq!(
op_ge(&[DataValue::from(2), DataValue::from(1)]).unwrap(),
DataValue::from(true)
);
assert_eq!(
op_ge(&[DataValue::from(2.), DataValue::from(1)]).unwrap(),
DataValue::from(true)
);
assert_eq!(
op_ge(&[DataValue::from(2), DataValue::from(1.)]).unwrap(),
DataValue::from(true)
);
assert_eq!(
op_ge(&[DataValue::from(1), DataValue::from(1)]).unwrap(),
DataValue::from(true)
);
assert_eq!(
op_ge(&[DataValue::from(1), DataValue::from(1.0)]).unwrap(),
DataValue::from(true)
);
assert_eq!(
op_ge(&[DataValue::from(1), DataValue::from(2)]).unwrap(),
DataValue::from(false)
);
assert!(op_ge(&[DataValue::Null, DataValue::from(true)]).is_err());
assert_eq!(
op_gt(&[DataValue::from(2), DataValue::from(1)]).unwrap(),
DataValue::from(true)
);
assert_eq!(
op_gt(&[DataValue::from(2.), DataValue::from(1)]).unwrap(),
DataValue::from(true)
);
assert_eq!(
op_gt(&[DataValue::from(2), DataValue::from(1.)]).unwrap(),
DataValue::from(true)
);
assert_eq!(
op_gt(&[DataValue::from(1), DataValue::from(1)]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_gt(&[DataValue::from(1), DataValue::from(1.0)]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_gt(&[DataValue::from(1), DataValue::from(2)]).unwrap(),
DataValue::from(false)
);
assert!(op_gt(&[DataValue::Null, DataValue::from(true)]).is_err());
assert_eq!(
op_le(&[DataValue::from(2), DataValue::from(1)]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_le(&[DataValue::from(2.), DataValue::from(1)]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_le(&[DataValue::from(2), DataValue::from(1.)]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_le(&[DataValue::from(1), DataValue::from(1)]).unwrap(),
DataValue::from(true)
);
assert_eq!(
op_le(&[DataValue::from(1), DataValue::from(1.0)]).unwrap(),
DataValue::from(true)
);
assert_eq!(
op_le(&[DataValue::from(1), DataValue::from(2)]).unwrap(),
DataValue::from(true)
);
assert!(op_le(&[DataValue::Null, DataValue::from(true)]).is_err());
assert_eq!(
op_lt(&[DataValue::from(2), DataValue::from(1)]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_lt(&[DataValue::from(2.), DataValue::from(1)]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_lt(&[DataValue::from(2), DataValue::from(1.)]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_lt(&[DataValue::from(1), DataValue::from(1)]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_lt(&[DataValue::from(1), DataValue::from(1.0)]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_lt(&[DataValue::from(1), DataValue::from(2)]).unwrap(),
DataValue::from(true)
);
assert!(op_lt(&[DataValue::Null, DataValue::from(true)]).is_err());
}
#[test]
fn test_max_min() {
assert_eq!(op_max(&[DataValue::from(1),]).unwrap(), DataValue::from(1));
assert_eq!(
op_max(&[
DataValue::from(1),
DataValue::from(2),
DataValue::from(3),
DataValue::from(4)
])
.unwrap(),
DataValue::from(4)
);
assert_eq!(
op_max(&[
DataValue::from(1.0),
DataValue::from(2),
DataValue::from(3),
DataValue::from(4)
])
.unwrap(),
DataValue::from(4)
);
assert_eq!(
op_max(&[
DataValue::from(1),
DataValue::from(2),
DataValue::from(3),
DataValue::from(4.0)
])
.unwrap(),
DataValue::from(4.0)
);
assert!(op_max(&[DataValue::from(true)]).is_err());
assert_eq!(op_min(&[DataValue::from(1),]).unwrap(), DataValue::from(1));
assert_eq!(
op_min(&[
DataValue::from(1),
DataValue::from(2),
DataValue::from(3),
DataValue::from(4)
])
.unwrap(),
DataValue::from(1)
);
assert_eq!(
op_min(&[
DataValue::from(1.0),
DataValue::from(2),
DataValue::from(3),
DataValue::from(4)
])
.unwrap(),
DataValue::from(1.0)
);
assert_eq!(
op_min(&[
DataValue::from(1),
DataValue::from(2),
DataValue::from(3),
DataValue::from(4.0)
])
.unwrap(),
DataValue::from(1)
);
assert!(op_max(&[DataValue::from(true)]).is_err());
}
#[test]
fn test_minus() {
assert_eq!(
op_minus(&[DataValue::from(-1)]).unwrap(),
DataValue::from(1)
);
assert_eq!(
op_minus(&[DataValue::from(1)]).unwrap(),
DataValue::from(-1)
);
assert_eq!(
op_minus(&[DataValue::from(f64::INFINITY)]).unwrap(),
DataValue::from(f64::NEG_INFINITY)
);
assert_eq!(
op_minus(&[DataValue::from(f64::NEG_INFINITY)]).unwrap(),
DataValue::from(f64::INFINITY)
);
}
#[test]
fn test_abs() {
assert_eq!(op_abs(&[DataValue::from(-1)]).unwrap(), DataValue::from(1));
assert_eq!(op_abs(&[DataValue::from(1)]).unwrap(), DataValue::from(1));
assert_eq!(
op_abs(&[DataValue::from(-1.5)]).unwrap(),
DataValue::from(1.5)
);
}
#[test]
fn test_signum() {
assert_eq!(
op_signum(&[DataValue::from(0.1)]).unwrap(),
DataValue::from(1)
);
assert_eq!(
op_signum(&[DataValue::from(-0.1)]).unwrap(),
DataValue::from(-1)
);
assert_eq!(
op_signum(&[DataValue::from(0.0)]).unwrap(),
DataValue::from(0)
);
assert_eq!(
op_signum(&[DataValue::from(-0.0)]).unwrap(),
DataValue::from(-1)
);
assert_eq!(
op_signum(&[DataValue::from(-3)]).unwrap(),
DataValue::from(-1)
);
assert_eq!(
op_signum(&[DataValue::from(f64::NEG_INFINITY)]).unwrap(),
DataValue::from(-1)
);
assert!(op_signum(&[DataValue::from(f64::NAN)])
.unwrap()
.get_float()
.unwrap()
.is_nan());
}
#[test]
fn test_floor_ceil() {
assert_eq!(
op_floor(&[DataValue::from(-1)]).unwrap(),
DataValue::from(-1)
);
assert_eq!(
op_floor(&[DataValue::from(-1.5)]).unwrap(),
DataValue::from(-2.0)
);
assert_eq!(
op_floor(&[DataValue::from(1.5)]).unwrap(),
DataValue::from(1.0)
);
assert_eq!(
op_ceil(&[DataValue::from(-1)]).unwrap(),
DataValue::from(-1)
);
assert_eq!(
op_ceil(&[DataValue::from(-1.5)]).unwrap(),
DataValue::from(-1.0)
);
assert_eq!(
op_ceil(&[DataValue::from(1.5)]).unwrap(),
DataValue::from(2.0)
);
}
#[test]
fn test_round() {
assert_eq!(
op_round(&[DataValue::from(0.6)]).unwrap(),
DataValue::from(1.0)
);
assert_eq!(
op_round(&[DataValue::from(0.5)]).unwrap(),
DataValue::from(1.0)
);
assert_eq!(
op_round(&[DataValue::from(1.5)]).unwrap(),
DataValue::from(2.0)
);
assert_eq!(
op_round(&[DataValue::from(-0.6)]).unwrap(),
DataValue::from(-1.0)
);
assert_eq!(
op_round(&[DataValue::from(-0.5)]).unwrap(),
DataValue::from(-1.0)
);
assert_eq!(
op_round(&[DataValue::from(-1.5)]).unwrap(),
DataValue::from(-2.0)
);
}
#[test]
fn test_exp() {
let n = op_exp(&[DataValue::from(1)]).unwrap().get_float().unwrap();
assert!(n.abs_diff_eq(&f64::E(), 1E-5));
let n = op_exp(&[DataValue::from(50.1)])
.unwrap()
.get_float()
.unwrap();
assert!(n.abs_diff_eq(&(50.1_f64.exp()), 1E-5));
}
#[test]
fn test_exp2() {
let n = op_exp2(&[DataValue::from(10.)])
.unwrap()
.get_float()
.unwrap();
assert_eq!(n, 1024.);
}
#[test]
fn test_ln() {
assert_eq!(
op_ln(&[DataValue::from(f64::E())]).unwrap(),
DataValue::from(1.0)
);
}
#[test]
fn test_log2() {
assert_eq!(
op_log2(&[DataValue::from(1024)]).unwrap(),
DataValue::from(10.)
);
}
#[test]
fn test_log10() {
assert_eq!(
op_log10(&[DataValue::from(1000)]).unwrap(),
DataValue::from(3.0)
);
}
#[test]
fn test_trig() {
assert!(op_sin(&[DataValue::from(f64::PI() / 2.)])
.unwrap()
.get_float()
.unwrap()
.abs_diff_eq(&1.0, 1e-5));
assert!(op_cos(&[DataValue::from(f64::PI() / 2.)])
.unwrap()
.get_float()
.unwrap()
.abs_diff_eq(&0.0, 1e-5));
assert!(op_tan(&[DataValue::from(f64::PI() / 4.)])
.unwrap()
.get_float()
.unwrap()
.abs_diff_eq(&1.0, 1e-5));
}
#[test]
fn test_inv_trig() {
assert!(op_asin(&[DataValue::from(1.0)])
.unwrap()
.get_float()
.unwrap()
.abs_diff_eq(&(f64::PI() / 2.), 1e-5));
assert!(op_acos(&[DataValue::from(0)])
.unwrap()
.get_float()
.unwrap()
.abs_diff_eq(&(f64::PI() / 2.), 1e-5));
assert!(op_atan(&[DataValue::from(1)])
.unwrap()
.get_float()
.unwrap()
.abs_diff_eq(&(f64::PI() / 4.), 1e-5));
assert!(op_atan2(&[DataValue::from(-1), DataValue::from(-1)])
.unwrap()
.get_float()
.unwrap()
.abs_diff_eq(&(-3. * f64::PI() / 4.), 1e-5));
}
#[test]
fn test_pow() {
assert_eq!(
op_pow(&[DataValue::from(2), DataValue::from(10)]).unwrap(),
DataValue::from(1024.0)
);
}
#[test]
fn test_mod() {
assert_eq!(
op_mod(&[DataValue::from(-10), DataValue::from(7)]).unwrap(),
DataValue::from(-3)
);
assert!(op_mod(&[DataValue::from(5), DataValue::from(0.)]).is_ok());
assert!(op_mod(&[DataValue::from(5.), DataValue::from(0.)]).is_ok());
assert!(op_mod(&[DataValue::from(5.), DataValue::from(0)]).is_ok());
assert!(op_mod(&[DataValue::from(5), DataValue::from(0)]).is_err());
}
#[test]
fn test_boolean() {
assert_eq!(op_and(&[]).unwrap(), DataValue::from(true));
assert_eq!(
op_and(&[DataValue::from(true), DataValue::from(false)]).unwrap(),
DataValue::from(false)
);
assert_eq!(op_or(&[]).unwrap(), DataValue::from(false));
assert_eq!(
op_or(&[DataValue::from(true), DataValue::from(false)]).unwrap(),
DataValue::from(true)
);
assert_eq!(
op_negate(&[DataValue::from(false)]).unwrap(),
DataValue::from(true)
);
}
#[test]
fn test_bits() {
assert_eq!(
op_bit_and(&[
DataValue::Bytes([0b111000].into()),
DataValue::Bytes([0b010101].into())
])
.unwrap(),
DataValue::Bytes([0b010000].into())
);
assert_eq!(
op_bit_or(&[
DataValue::Bytes([0b111000].into()),
DataValue::Bytes([0b010101].into())
])
.unwrap(),
DataValue::Bytes([0b111101].into())
);
assert_eq!(
op_bit_not(&[DataValue::Bytes([0b00111000].into())]).unwrap(),
DataValue::Bytes([0b11000111].into())
);
assert_eq!(
op_bit_xor(&[
DataValue::Bytes([0b111000].into()),
DataValue::Bytes([0b010101].into())
])
.unwrap(),
DataValue::Bytes([0b101101].into())
);
}
#[test]
fn test_pack_bits() {
assert_eq!(
op_pack_bits(&[DataValue::List(vec![DataValue::from(true)])]).unwrap(),
DataValue::Bytes([0b10000000].into())
)
}
#[test]
fn test_unpack_bits() {
assert_eq!(
op_unpack_bits(&[DataValue::Bytes([0b10101010].into())]).unwrap(),
DataValue::List(
[true, false, true, false, true, false, true, false]
.into_iter()
.map(DataValue::Bool)
.collect()
)
)
}
#[test]
fn test_concat() {
assert_eq!(
op_concat(&[DataValue::Str("abc".into()), DataValue::Str("def".into())]).unwrap(),
DataValue::Str("abcdef".into())
);
assert_eq!(
op_concat(&[
DataValue::List(vec![DataValue::from(true), DataValue::from(false)]),
DataValue::List(vec![DataValue::from(true)])
])
.unwrap(),
DataValue::List(vec![
DataValue::from(true),
DataValue::from(false),
DataValue::from(true),
])
);
}
#[test]
fn test_str_includes() {
assert_eq!(
op_str_includes(&[
DataValue::Str("abcdef".into()),
DataValue::Str("bcd".into())
])
.unwrap(),
DataValue::from(true)
);
assert_eq!(
op_str_includes(&[DataValue::Str("abcdef".into()), DataValue::Str("bd".into())]).unwrap(),
DataValue::from(false)
);
}
#[test]
fn test_casings() {
assert_eq!(
op_lowercase(&[DataValue::Str("NAÏVE".into())]).unwrap(),
DataValue::Str("naïve".into())
);
assert_eq!(
op_uppercase(&[DataValue::Str("naïve".into())]).unwrap(),
DataValue::Str("NAÏVE".into())
);
}
#[test]
fn test_trim() {
assert_eq!(
op_trim(&[DataValue::Str(" a ".into())]).unwrap(),
DataValue::Str("a".into())
);
assert_eq!(
op_trim_start(&[DataValue::Str(" a ".into())]).unwrap(),
DataValue::Str("a ".into())
);
assert_eq!(
op_trim_end(&[DataValue::Str(" a ".into())]).unwrap(),
DataValue::Str(" a".into())
);
}
#[test]
fn test_starts_ends_with() {
assert_eq!(
op_starts_with(&[
DataValue::Str("abcdef".into()),
DataValue::Str("abc".into())
])
.unwrap(),
DataValue::from(true)
);
assert_eq!(
op_starts_with(&[DataValue::Str("abcdef".into()), DataValue::Str("bc".into())]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_ends_with(&[
DataValue::Str("abcdef".into()),
DataValue::Str("def".into())
])
.unwrap(),
DataValue::from(true)
);
assert_eq!(
op_ends_with(&[DataValue::Str("abcdef".into()), DataValue::Str("bc".into())]).unwrap(),
DataValue::from(false)
);
}
#[test]
fn test_regex() {
assert_eq!(
op_regex_matches(&[
DataValue::Str("abcdef".into()),
DataValue::Regex(RegexWrapper(Regex::new("c.e").unwrap()))
])
.unwrap(),
DataValue::from(true)
);
assert_eq!(
op_regex_matches(&[
DataValue::Str("abcdef".into()),
DataValue::Regex(RegexWrapper(Regex::new("c.ef$").unwrap()))
])
.unwrap(),
DataValue::from(true)
);
assert_eq!(
op_regex_matches(&[
DataValue::Str("abcdef".into()),
DataValue::Regex(RegexWrapper(Regex::new("c.e$").unwrap()))
])
.unwrap(),
DataValue::from(false)
);
assert_eq!(
op_regex_replace(&[
DataValue::Str("abcdef".into()),
DataValue::Regex(RegexWrapper(Regex::new("[be]").unwrap())),
DataValue::Str("x".into())
])
.unwrap(),
DataValue::Str("axcdef".into())
);
assert_eq!(
op_regex_replace_all(&[
DataValue::Str("abcdef".into()),
DataValue::Regex(RegexWrapper(Regex::new("[be]").unwrap())),
DataValue::Str("x".into())
])
.unwrap(),
DataValue::Str("axcdxf".into())
);
assert_eq!(
op_regex_extract(&[
DataValue::Str("abCDefGH".into()),
DataValue::Regex(RegexWrapper(Regex::new("[xayef]|(GH)").unwrap()))
])
.unwrap(),
DataValue::List(vec![
DataValue::Str("a".into()),
DataValue::Str("e".into()),
DataValue::Str("f".into()),
DataValue::Str("GH".into()),
])
);
assert_eq!(
op_regex_extract_first(&[
DataValue::Str("abCDefGH".into()),
DataValue::Regex(RegexWrapper(Regex::new("[xayef]|(GH)").unwrap()))
])
.unwrap(),
DataValue::Str("a".into()),
);
assert_eq!(
op_regex_extract(&[
DataValue::Str("abCDefGH".into()),
DataValue::Regex(RegexWrapper(Regex::new("xyz").unwrap()))
])
.unwrap(),
DataValue::List(vec![])
);
assert_eq!(
op_regex_extract_first(&[
DataValue::Str("abCDefGH".into()),
DataValue::Regex(RegexWrapper(Regex::new("xyz").unwrap()))
])
.unwrap(),
DataValue::Null
);
}
#[test]
fn test_predicates() {
assert_eq!(
op_is_null(&[DataValue::Null]).unwrap(),
DataValue::from(true)
);
assert_eq!(
op_is_null(&[DataValue::Bot]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_is_int(&[DataValue::from(1)]).unwrap(),
DataValue::from(true)
);
assert_eq!(
op_is_int(&[DataValue::from(1.0)]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_is_float(&[DataValue::from(1)]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_is_float(&[DataValue::from(1.0)]).unwrap(),
DataValue::from(true)
);
assert_eq!(
op_is_num(&[DataValue::from(1)]).unwrap(),
DataValue::from(true)
);
assert_eq!(
op_is_num(&[DataValue::from(1.0)]).unwrap(),
DataValue::from(true)
);
assert_eq!(
op_is_num(&[DataValue::Null]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_is_bytes(&[DataValue::Bytes([0b1].into())]).unwrap(),
DataValue::from(true)
);
assert_eq!(
op_is_bytes(&[DataValue::Null]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_is_list(&[DataValue::List(vec![])]).unwrap(),
DataValue::from(true)
);
assert_eq!(
op_is_list(&[DataValue::Null]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_is_string(&[DataValue::Str("".into())]).unwrap(),
DataValue::from(true)
);
assert_eq!(
op_is_string(&[DataValue::Null]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_is_finite(&[DataValue::from(1.0)]).unwrap(),
DataValue::from(true)
);
assert_eq!(
op_is_finite(&[DataValue::from(f64::INFINITY)]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_is_finite(&[DataValue::from(f64::NAN)]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_is_infinite(&[DataValue::from(1.0)]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_is_infinite(&[DataValue::from(f64::INFINITY)]).unwrap(),
DataValue::from(true)
);
assert_eq!(
op_is_infinite(&[DataValue::from(f64::NEG_INFINITY)]).unwrap(),
DataValue::from(true)
);
assert_eq!(
op_is_infinite(&[DataValue::from(f64::NAN)]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_is_nan(&[DataValue::from(1.0)]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_is_nan(&[DataValue::from(f64::INFINITY)]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_is_nan(&[DataValue::from(f64::NEG_INFINITY)]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_is_nan(&[DataValue::from(f64::NAN)]).unwrap(),
DataValue::from(true)
);
}
#[test]
fn test_prepend_append() {
assert_eq!(
op_prepend(&[
DataValue::List(vec![DataValue::from(1), DataValue::from(2)]),
DataValue::Null,
])
.unwrap(),
DataValue::List(vec![
DataValue::Null,
DataValue::from(1),
DataValue::from(2),
]),
);
assert_eq!(
op_append(&[
DataValue::List(vec![DataValue::from(1), DataValue::from(2)]),
DataValue::Null,
])
.unwrap(),
DataValue::List(vec![
DataValue::from(1),
DataValue::from(2),
DataValue::Null,
]),
);
}
#[test]
fn test_length() {
assert_eq!(
op_length(&[DataValue::Str("abc".into())]).unwrap(),
DataValue::from(3)
);
assert_eq!(
op_length(&[DataValue::List(vec![])]).unwrap(),
DataValue::from(0)
);
assert_eq!(
op_length(&[DataValue::Bytes([].into())]).unwrap(),
DataValue::from(0)
);
}
#[test]
fn test_unicode_normalize() {
assert_eq!(
op_unicode_normalize(&[DataValue::Str("abc".into()), DataValue::Str("nfc".into())])
.unwrap(),
DataValue::Str("abc".into())
)
}
#[test]
fn test_sort_reverse() {
assert_eq!(
op_sorted(&[DataValue::List(vec![
DataValue::from(2.0),
DataValue::from(1),
DataValue::from(2),
DataValue::Null,
])])
.unwrap(),
DataValue::List(vec![
DataValue::Null,
DataValue::from(1),
DataValue::from(2),
DataValue::from(2.0),
])
);
assert_eq!(
op_reverse(&[DataValue::List(vec![
DataValue::from(2.0),
DataValue::from(1),
DataValue::from(2),
DataValue::Null,
])])
.unwrap(),
DataValue::List(vec![
DataValue::Null,
DataValue::from(2),
DataValue::from(1),
DataValue::from(2.0),
])
)
}
#[test]
fn test_haversine() {
let d = op_haversine_deg_input(&[
DataValue::from(0),
DataValue::from(0),
DataValue::from(0),
DataValue::from(180),
])
.unwrap()
.get_float()
.unwrap();
assert!(d.abs_diff_eq(&f64::PI(), 1e-5));
let d = op_haversine_deg_input(&[
DataValue::from(90),
DataValue::from(0),
DataValue::from(0),
DataValue::from(123),
])
.unwrap()
.get_float()
.unwrap();
assert!(d.abs_diff_eq(&(f64::PI() / 2.), 1e-5));
let d = op_haversine(&[
DataValue::from(0),
DataValue::from(0),
DataValue::from(0),
DataValue::from(f64::PI()),
])
.unwrap()
.get_float()
.unwrap();
assert!(d.abs_diff_eq(&f64::PI(), 1e-5));
}
#[test]
fn test_deg_rad() {
assert_eq!(
op_deg_to_rad(&[DataValue::from(180)]).unwrap(),
DataValue::from(f64::PI())
);
assert_eq!(
op_rad_to_deg(&[DataValue::from(f64::PI())]).unwrap(),
DataValue::from(180.0)
);
}
#[test]
fn test_first_last() {
assert_eq!(
op_first(&[DataValue::List(vec![])]).unwrap(),
DataValue::Null,
);
assert_eq!(
op_last(&[DataValue::List(vec![])]).unwrap(),
DataValue::Null,
);
assert_eq!(
op_first(&[DataValue::List(vec![
DataValue::from(1),
DataValue::from(2),
])])
.unwrap(),
DataValue::from(1),
);
assert_eq!(
op_last(&[DataValue::List(vec![
DataValue::from(1),
DataValue::from(2),
])])
.unwrap(),
DataValue::from(2),
);
}
#[test]
fn test_chunks() {
assert_eq!(
op_chunks(&[
DataValue::List(vec![
DataValue::from(1),
DataValue::from(2),
DataValue::from(3),
DataValue::from(4),
DataValue::from(5),
]),
DataValue::from(2),
])
.unwrap(),
DataValue::List(vec![
DataValue::List(vec![DataValue::from(1), DataValue::from(2)]),
DataValue::List(vec![DataValue::from(3), DataValue::from(4)]),
DataValue::List(vec![DataValue::from(5)]),
])
);
assert_eq!(
op_chunks_exact(&[
DataValue::List(vec![
DataValue::from(1),
DataValue::from(2),
DataValue::from(3),
DataValue::from(4),
DataValue::from(5),
]),
DataValue::from(2),
])
.unwrap(),
DataValue::List(vec![
DataValue::List(vec![DataValue::from(1), DataValue::from(2)]),
DataValue::List(vec![DataValue::from(3), DataValue::from(4)]),
])
);
assert_eq!(
op_windows(&[
DataValue::List(vec![
DataValue::from(1),
DataValue::from(2),
DataValue::from(3),
DataValue::from(4),
DataValue::from(5),
]),
DataValue::from(3),
])
.unwrap(),
DataValue::List(vec![
DataValue::List(vec![
DataValue::from(1),
DataValue::from(2),
DataValue::from(3),
]),
DataValue::List(vec![
DataValue::from(2),
DataValue::from(3),
DataValue::from(4),
]),
DataValue::List(vec![
DataValue::from(3),
DataValue::from(4),
DataValue::from(5),
]),
])
)
}
#[test]
fn test_get() {
assert!(op_get(&[DataValue::List(vec![]), DataValue::from(0)]).is_err());
assert_eq!(
op_get(&[
DataValue::List(vec![
DataValue::from(1),
DataValue::from(2),
DataValue::from(3),
]),
DataValue::from(1)
])
.unwrap(),
DataValue::from(2)
);
assert_eq!(
op_maybe_get(&[DataValue::List(vec![]), DataValue::from(0)]).unwrap(),
DataValue::Null
);
assert_eq!(
op_maybe_get(&[
DataValue::List(vec![
DataValue::from(1),
DataValue::from(2),
DataValue::from(3),
]),
DataValue::from(1)
])
.unwrap(),
DataValue::from(2)
);
}
#[test]
fn test_slice() {
assert!(op_slice(&[
DataValue::List(vec![
DataValue::from(1),
DataValue::from(2),
DataValue::from(3),
]),
DataValue::from(1),
DataValue::from(4)
])
.is_err());
assert!(op_slice(&[
DataValue::List(vec![
DataValue::from(1),
DataValue::from(2),
DataValue::from(3),
]),
DataValue::from(1),
DataValue::from(3)
])
.is_ok());
assert_eq!(
op_slice(&[
DataValue::List(vec![
DataValue::from(1),
DataValue::from(2),
DataValue::from(3),
]),
DataValue::from(1),
DataValue::from(-1)
])
.unwrap(),
DataValue::List(vec![DataValue::from(2)])
);
}
#[test]
fn test_chars() {
assert_eq!(
op_from_substrings(&[op_chars(&[DataValue::Str("abc".into())]).unwrap()]).unwrap(),
DataValue::Str("abc".into())
)
}
#[test]
fn test_encode_decode() {
assert_eq!(
op_decode_base64(&[op_encode_base64(&[DataValue::Bytes([1, 2, 3].into())]).unwrap()])
.unwrap(),
DataValue::Bytes([1, 2, 3].into())
)
}
#[test]
fn test_to_string() {
assert_eq!(
op_to_string(&[DataValue::from(false)]).unwrap(),
DataValue::Str("false".into())
);
}
#[test]
fn test_to_unity() {
assert_eq!(op_to_unity(&[DataValue::Null]).unwrap(), DataValue::from(0));
assert_eq!(
op_to_unity(&[DataValue::from(false)]).unwrap(),
DataValue::from(0)
);
assert_eq!(
op_to_unity(&[DataValue::from(true)]).unwrap(),
DataValue::from(1)
);
assert_eq!(
op_to_unity(&[DataValue::from(10)]).unwrap(),
DataValue::from(1)
);
assert_eq!(
op_to_unity(&[DataValue::from(1.0)]).unwrap(),
DataValue::from(1)
);
assert_eq!(
op_to_unity(&[DataValue::from(f64::NAN)]).unwrap(),
DataValue::from(1)
);
assert_eq!(
op_to_unity(&[DataValue::Str("0".into())]).unwrap(),
DataValue::from(1)
);
assert_eq!(
op_to_unity(&[DataValue::Str("".into())]).unwrap(),
DataValue::from(0)
);
assert_eq!(
op_to_unity(&[DataValue::List(vec![])]).unwrap(),
DataValue::from(0)
);
assert_eq!(
op_to_unity(&[DataValue::List(vec![DataValue::Null])]).unwrap(),
DataValue::from(1)
);
}
#[test]
fn test_to_float() {
assert_eq!(
op_to_float(&[DataValue::Null]).unwrap(),
DataValue::from(0.0)
);
assert_eq!(
op_to_float(&[DataValue::from(false)]).unwrap(),
DataValue::from(0.0)
);
assert_eq!(
op_to_float(&[DataValue::from(true)]).unwrap(),
DataValue::from(1.0)
);
assert_eq!(
op_to_float(&[DataValue::from(1)]).unwrap(),
DataValue::from(1.0)
);
assert_eq!(
op_to_float(&[DataValue::from(1.0)]).unwrap(),
DataValue::from(1.0)
);
assert!(op_to_float(&[DataValue::Str("NAN".into())])
.unwrap()
.get_float()
.unwrap()
.is_nan());
assert!(op_to_float(&[DataValue::Str("INF".into())])
.unwrap()
.get_float()
.unwrap()
.is_infinite());
assert!(op_to_float(&[DataValue::Str("NEG_INF".into())])
.unwrap()
.get_float()
.unwrap()
.is_infinite());
assert_eq!(
op_to_float(&[DataValue::Str("3".into())])
.unwrap()
.get_float()
.unwrap(),
3.
);
}
#[test]
fn test_rand() {
let n = op_rand_float(&[]).unwrap().get_float().unwrap();
assert!(n >= 0.);
assert!(n <= 1.);
assert_eq!(
op_rand_bernoulli(&[DataValue::from(0)]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_rand_bernoulli(&[DataValue::from(1)]).unwrap(),
DataValue::from(true)
);
assert!(op_rand_bernoulli(&[DataValue::from(2)]).is_err());
let n = op_rand_int(&[DataValue::from(100), DataValue::from(200)])
.unwrap()
.get_int()
.unwrap();
assert!(n >= 100);
assert!(n <= 200);
assert_eq!(
op_rand_choose(&[DataValue::List(vec![])]).unwrap(),
DataValue::Null
);
assert_eq!(
op_rand_choose(&[DataValue::List(vec![DataValue::from(123)])]).unwrap(),
DataValue::from(123)
);
}
#[test]
fn test_set_ops() {
assert_eq!(
op_union(&[
DataValue::List([1, 2, 3].into_iter().map(DataValue::from).collect()),
DataValue::List([2, 3, 4].into_iter().map(DataValue::from).collect()),
DataValue::List([3, 4, 5].into_iter().map(DataValue::from).collect())
])
.unwrap(),
DataValue::List([1, 2, 3, 4, 5].into_iter().map(DataValue::from).collect())
);
assert_eq!(
op_intersection(&[
DataValue::List(
[1, 2, 3, 4, 5, 6]
.into_iter()
.map(DataValue::from)
.collect(),
),
DataValue::List([2, 3, 4].into_iter().map(DataValue::from).collect()),
DataValue::List([3, 4, 5].into_iter().map(DataValue::from).collect())
])
.unwrap(),
DataValue::List([3, 4].into_iter().map(DataValue::from).collect())
);
assert_eq!(
op_difference(&[
DataValue::List(
[1, 2, 3, 4, 5, 6]
.into_iter()
.map(DataValue::from)
.collect(),
),
DataValue::List([2, 3, 4].into_iter().map(DataValue::from).collect()),
DataValue::List([3, 4, 5].into_iter().map(DataValue::from).collect())
])
.unwrap(),
DataValue::List([1, 6].into_iter().map(DataValue::from).collect())
);
}
#[test]
fn test_uuid() {
let v1 = op_rand_uuid_v1(&[]).unwrap();
let v4 = op_rand_uuid_v4(&[]).unwrap();
assert!(op_is_uuid(&[v4]).unwrap().get_bool().unwrap());
assert!(op_uuid_timestamp(&[v1]).unwrap().get_float().is_some());
assert!(op_to_uuid(&[DataValue::from("")]).is_err());
assert!(op_to_uuid(&[DataValue::from("f3b4958c-52a1-11e7-802a-010203040506")]).is_ok());
}
#[test]
fn test_now() {
let now = op_now(&[]).unwrap();
assert!(matches!(now, DataValue::Num(_)));
let s = op_format_timestamp(&[now]).unwrap();
let _dt = op_parse_timestamp(&[s]).unwrap();
}
#[test]
fn test_to_bool() {
assert_eq!(
op_to_bool(&[DataValue::Null]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_to_bool(&[DataValue::from(true)]).unwrap(),
DataValue::from(true)
);
assert_eq!(
op_to_bool(&[DataValue::from(false)]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_to_bool(&[DataValue::from(0)]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_to_bool(&[DataValue::from(0.0)]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_to_bool(&[DataValue::from(1)]).unwrap(),
DataValue::from(true)
);
assert_eq!(
op_to_bool(&[DataValue::from("")]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_to_bool(&[DataValue::from("a")]).unwrap(),
DataValue::from(true)
);
assert_eq!(
op_to_bool(&[DataValue::List(vec![])]).unwrap(),
DataValue::from(false)
);
assert_eq!(
op_to_bool(&[DataValue::List(vec![DataValue::from(0)])]).unwrap(),
DataValue::from(true)
);
}
#[test]
fn test_coalesce() {
let db = DbInstance::default();
let res = db.run_default("?[a] := a = null ~ 1 ~ 2").unwrap().rows;
assert_eq!(res[0][0], DataValue::from(1));
let res = db
.run_default("?[a] := a = null ~ null ~ null")
.unwrap()
.rows;
assert_eq!(res[0][0], DataValue::Null);
let res = db.run_default("?[a] := a = 2 ~ null ~ 1").unwrap().rows;
assert_eq!(res[0][0], DataValue::from(2));
}
#[test]
fn test_range() {
let db = DbInstance::default();
let res = db
.run_default("?[a] := a = int_range(1, 5)")
.unwrap()
.into_json();
assert_eq!(res["rows"][0][0], json!([1, 2, 3, 4]));
let res = db
.run_default("?[a] := a = int_range(5)")
.unwrap()
.into_json();
assert_eq!(res["rows"][0][0], json!([0, 1, 2, 3, 4]));
let res = db
.run_default("?[a] := a = int_range(15, 3, -2)")
.unwrap()
.into_json();
assert_eq!(res["rows"][0][0], json!([15, 13, 11, 9, 7, 5]));
}