use super::super::maxa_fn;
use crate::eval::functions::statistical::max::max_fn;
use crate::types::{ErrorKind, Value, ZoneId, ZonedInstant};
fn zoned(utc_nanos: i64) -> Value {
Value::Zoned(Box::new(ZonedInstant::from_instant(
utc_nanos,
ZoneId::Iana(chrono_tz::Tz::UTC),
)))
}
#[test]
fn empty_values_skipped() {
assert_eq!(
maxa_fn(&[Value::Empty, Value::Number(7.0), Value::Empty]),
Value::Number(7.0)
);
}
#[test]
fn single_false_returns_zero() {
assert_eq!(maxa_fn(&[Value::Bool(false)]), Value::Number(0.0));
}
#[test]
fn negative_numbers_max() {
assert_eq!(
maxa_fn(&[Value::Number(-3.0), Value::Number(-1.0), Value::Number(-5.0)]),
Value::Number(-1.0)
);
}
#[test]
fn bool_and_number_mixed() {
assert_eq!(
maxa_fn(&[
Value::Bool(true),
Value::Bool(false),
Value::Number(10.0),
Value::Number(0.0)
]),
Value::Number(10.0)
);
}
#[test]
fn maxa_empty_array_is_ref_error() {
assert_eq!(
maxa_fn(&[Value::Array(vec![])]),
Value::Error(ErrorKind::Ref)
);
assert_eq!(
maxa_fn(&[Value::Number(1.0), Value::Array(vec![])]),
Value::Error(ErrorKind::Ref)
);
}
#[test]
fn maxa_array_of_only_blanks_is_zero() {
assert_eq!(
maxa_fn(&[Value::Array(vec![Value::Empty, Value::Empty, Value::Empty])]),
Value::Number(0.0)
);
assert_eq!(
maxa_fn(&[Value::Array(vec![
Value::Array(vec![Value::Empty]),
Value::Array(vec![Value::Empty]),
])]),
Value::Number(0.0)
);
}
#[test]
fn maxa_blank_without_an_array_is_still_na() {
assert_eq!(maxa_fn(&[Value::Empty]), Value::Error(ErrorKind::NA));
assert_eq!(maxa_fn(&[Value::Empty, Value::Empty]), Value::Error(ErrorKind::NA));
}
#[test]
fn maxa_text_only_array_is_zero() {
assert_eq!(
maxa_fn(&[Value::Array(vec![
Value::Text("a".to_string()),
Value::Text("b".to_string()),
])]),
Value::Number(0.0)
);
}
#[test]
fn dates_participate_and_type_the_answer() {
assert_eq!(
maxa_fn(&[Value::Array(vec![
Value::Date(43831.0),
Value::Date(44197.0)
])]),
Value::Date(44197.0)
);
assert_eq!(
maxa_fn(&[Value::Date(43831.0), Value::Date(44197.0)]),
Value::Date(44197.0)
);
assert_eq!(
maxa_fn(&[Value::Array(vec![Value::Date(43831.0), Value::Number(5.0)])]),
Value::Date(43831.0)
);
assert_eq!(
maxa_fn(&[Value::Array(vec![Value::Array(vec![Value::Date(43831.0)])])]),
Value::Date(43831.0)
);
assert_eq!(
maxa_fn(&[Value::Number(5.0), Value::Bool(true)]),
Value::Number(5.0)
);
assert_eq!(
maxa_fn(&[Value::Array(vec![Value::Empty, Value::Empty])]),
Value::Number(0.0)
);
}
#[test]
fn zoned_values_take_the_same_route_as_max() {
let earlier = zoned(0);
let later = zoned(1_000_000_000);
let mixed = [later.clone(), Value::Date(43831.0)];
assert_eq!(maxa_fn(&mixed), Value::Error(ErrorKind::Value));
assert_eq!(maxa_fn(&mixed), max_fn(&mixed));
let mixed_number = [later.clone(), Value::Number(5.0)];
assert_eq!(maxa_fn(&mixed_number), Value::Error(ErrorKind::Value));
assert_eq!(maxa_fn(&mixed_number), max_fn(&mixed_number));
let mixed_bool = [later.clone(), Value::Bool(true)];
assert_eq!(maxa_fn(&mixed_bool), Value::Error(ErrorKind::Value));
assert_eq!(maxa_fn(&mixed_bool), max_fn(&mixed_bool));
let mixed_text = [
Value::Array(vec![later.clone(), Value::Text("a".to_string())]),
];
assert_eq!(maxa_fn(&mixed_text), Value::Error(ErrorKind::Value));
assert_eq!(maxa_fn(&mixed_text), max_fn(&mixed_text));
let zoned_only = [earlier.clone(), later.clone()];
assert_eq!(maxa_fn(&zoned_only), later);
assert_eq!(maxa_fn(&zoned_only), max_fn(&zoned_only));
let through_range = [Value::Array(vec![earlier, later.clone()])];
assert_eq!(maxa_fn(&through_range), later);
assert_eq!(maxa_fn(&through_range), max_fn(&through_range));
let with_error = [later.clone(), Value::Error(ErrorKind::NA)];
assert_eq!(maxa_fn(&with_error), Value::Error(ErrorKind::NA));
assert_eq!(maxa_fn(&with_error), max_fn(&with_error));
let with_empty_array = [later.clone(), Value::Array(vec![])];
assert_eq!(maxa_fn(&with_empty_array), later);
assert_eq!(maxa_fn(&with_empty_array), max_fn(&with_empty_array));
let with_blank_array = [later.clone(), Value::Array(vec![Value::Empty])];
assert_eq!(maxa_fn(&with_blank_array), later);
assert_eq!(maxa_fn(&with_blank_array), max_fn(&with_blank_array));
assert_eq!(maxa_fn(&[later.clone()]), later);
assert_eq!(maxa_fn(&[later.clone()]), max_fn(&[later]));
}