87 lines
3.2 KiB
Rust
87 lines
3.2 KiB
Rust
use crate::calc_result::CalcResult;
|
|
use crate::functions::util::build_criteria;
|
|
|
|
// Tests for build_criteria
|
|
// ------------------------
|
|
//
|
|
// Note that any test here is mostly for documentation purposes.
|
|
// A real test must be done in Excel.
|
|
//
|
|
// `build_criteria` takes a string ('criteria') and returns a function ('fn_criteria') that takes a CalcResult and returns a boolean.
|
|
//
|
|
// For instance if criteria is "123" we want all cells that contain the number "123". Then
|
|
//
|
|
// let fn_criteria = build_criteria(&CalcResult::Number(123));
|
|
//
|
|
// Then fn_criteria(calc_result) will return true every time calc_result is the number "123"
|
|
//
|
|
// There are different types of criteria
|
|
//
|
|
// * We want the cells that are equal to a value (say a number, string, bool or an error).
|
|
// We can build those with a calc_result of the type (i.e CalcResult::Number(123))
|
|
// or we can use a string preceded by "=" like CalcResult::String("=123")
|
|
// * We can use inequality signs "<", ">", "<=", ">=" or "<>"
|
|
// * If you use "=" or "<>" you can use wildcards (like "=*brown")
|
|
//
|
|
// All of them are case insensitive.
|
|
|
|
#[test]
|
|
fn test_build_criteria_is_number() {
|
|
let c = CalcResult::Number(42.0);
|
|
let fn_criteria = build_criteria(&c);
|
|
assert!(fn_criteria(&CalcResult::Number(42.0)));
|
|
assert!(fn_criteria(&CalcResult::String("42".to_string())));
|
|
assert!(fn_criteria(&CalcResult::String("42.00".to_string())));
|
|
assert!(!fn_criteria(&CalcResult::Number(2.0)));
|
|
|
|
let c = CalcResult::String("=42".to_string());
|
|
let fn_criteria = build_criteria(&c);
|
|
assert!(fn_criteria(&CalcResult::Number(42.0)));
|
|
assert!(fn_criteria(&CalcResult::String("42".to_string())));
|
|
assert!(fn_criteria(&CalcResult::String("42.00".to_string())));
|
|
assert!(!fn_criteria(&CalcResult::Number(2.0)));
|
|
}
|
|
|
|
#[test]
|
|
fn test_build_criteria_is_bool() {
|
|
let c = CalcResult::Boolean(true);
|
|
let fn_criteria = build_criteria(&c);
|
|
assert!(fn_criteria(&CalcResult::Boolean(true)));
|
|
assert!(!fn_criteria(&CalcResult::String("true".to_string())));
|
|
assert!(!fn_criteria(&CalcResult::Number(1.0)));
|
|
|
|
let c = CalcResult::String("=True".to_string());
|
|
let fn_criteria = build_criteria(&c);
|
|
assert!(fn_criteria(&CalcResult::Boolean(true)));
|
|
assert!(!fn_criteria(&CalcResult::String("true".to_string())));
|
|
assert!(!fn_criteria(&CalcResult::Number(1.0)));
|
|
}
|
|
|
|
#[test]
|
|
fn test_build_criteria_is_less_than() {
|
|
let c = CalcResult::String("<100".to_string());
|
|
let fn_criteria = build_criteria(&c);
|
|
assert!(!fn_criteria(&CalcResult::Boolean(true)));
|
|
assert!(!fn_criteria(&CalcResult::String("23".to_string())));
|
|
assert!(fn_criteria(&CalcResult::Number(1.0)));
|
|
assert!(!fn_criteria(&CalcResult::Number(101.0)));
|
|
}
|
|
|
|
#[test]
|
|
fn test_build_criteria_is_less_wildcard() {
|
|
let c = CalcResult::String("=D* G*".to_string());
|
|
let fn_criteria = build_criteria(&c);
|
|
assert!(fn_criteria(&CalcResult::String(
|
|
"Diarmuid Glynn".to_string()
|
|
)));
|
|
assert!(fn_criteria(&CalcResult::String(
|
|
"Daniel Gonzalez".to_string()
|
|
)));
|
|
assert!(!fn_criteria(&CalcResult::String(
|
|
"DanielGonzalez".to_string()
|
|
)));
|
|
assert!(!fn_criteria(&CalcResult::String(
|
|
" Daniel Gonzalez".to_string()
|
|
)));
|
|
}
|