use exp_rs::context::EvalContext;
use exp_rs::error::ExprError;
use exp_rs::types::{FunctionName, HString, TryIntoFunctionName, TryIntoHeaplessString};
#[allow(dead_code)]
pub fn hstr(s: &str) -> HString {
s.try_into_heapless().expect("String too long for test")
}
#[allow(dead_code)]
pub fn fname(s: &str) -> FunctionName {
s.try_into_function_name()
.expect("Function name too long for test")
}
#[allow(dead_code)]
pub fn try_hstr(s: &str) -> Result<HString, ExprError> {
s.try_into_heapless()
}
#[allow(dead_code)]
pub fn create_test_context() -> EvalContext {
let mut ctx = EvalContext::default();
#[cfg(not(feature = "libm"))]
{
ctx.register_native_function("+", 2, |args| args[0] + args[1]);
ctx.register_native_function("-", 2, |args| args[0] - args[1]);
ctx.register_native_function("*", 2, |args| args[0] * args[1]);
ctx.register_native_function("/", 2, |args| args[0] / args[1]);
ctx.register_native_function("^", 2, |args| args[0].powf(args[1]));
ctx.register_native_function("neg", 1, |args| -args[0]);
ctx.register_native_function("<", 2, |args| if args[0] < args[1] { 1.0 } else { 0.0 });
ctx.register_native_function(">", 2, |args| if args[0] > args[1] { 1.0 } else { 0.0 });
ctx.register_native_function("<=", 2, |args| if args[0] <= args[1] { 1.0 } else { 0.0 });
ctx.register_native_function(">=", 2, |args| if args[0] >= args[1] { 1.0 } else { 0.0 });
ctx.register_native_function("==", 2, |args| if args[0] == args[1] { 1.0 } else { 0.0 });
ctx.register_native_function("!=", 2, |args| if args[0] != args[1] { 1.0 } else { 0.0 });
ctx.register_native_function("sin", 1, |args| args[0].sin());
ctx.register_native_function("cos", 1, |args| args[0].cos());
ctx.register_native_function("tan", 1, |args| args[0].tan());
ctx.register_native_function("asin", 1, |args| args[0].asin());
ctx.register_native_function("acos", 1, |args| args[0].acos());
ctx.register_native_function("atan", 1, |args| args[0].atan());
ctx.register_native_function("atan2", 2, |args| args[0].atan2(args[1]));
ctx.register_native_function("sinh", 1, |args| args[0].sinh());
ctx.register_native_function("cosh", 1, |args| args[0].cosh());
ctx.register_native_function("tanh", 1, |args| args[0].tanh());
ctx.register_native_function("sqrt", 1, |args| args[0].sqrt());
ctx.register_native_function("log", 1, |args| args[0].log10());
ctx.register_native_function("ln", 1, |args| args[0].ln());
ctx.register_native_function("log10", 1, |args| args[0].log10());
ctx.register_native_function("floor", 1, |args| args[0].floor());
ctx.register_native_function("ceil", 1, |args| args[0].ceil());
ctx.register_native_function("round", 1, |args| args[0].round());
ctx.register_native_function("abs", 1, |args| args[0].abs());
ctx.register_native_function("exp", 1, |args| args[0].exp());
ctx.register_native_function(
"?:",
3,
|args| if args[0] != 0.0 { args[1] } else { args[2] },
);
ctx.register_native_function(",", 2, |args| args[1]);
ctx.register_native_function("comma", 2, |args| args[1]);
ctx.register_native_function("add", 2, |args| args[0] + args[1]);
ctx.register_native_function("sub", 2, |args| args[0] - args[1]);
ctx.register_native_function("mul", 2, |args| args[0] * args[1]);
ctx.register_native_function("div", 2, |args| args[0] / args[1]);
ctx.register_native_function("pow", 2, |args| args[0].powf(args[1]));
ctx.register_native_function("fmod", 2, |args| args[0] % args[1]);
}
use exp_rs::Real;
ctx.set_parameter("pi", std::f64::consts::PI as Real)
.expect("Failed to set pi");
ctx.set_parameter("e", std::f64::consts::E as Real)
.expect("Failed to set e");
ctx
}
#[allow(dead_code)]
pub fn set_var(ctx: &mut EvalContext, name: &str, value: exp_rs::Real) {
ctx.variables
.insert(hstr(name), value)
.expect("Failed to set variable in test");
}
#[allow(dead_code)]
pub fn set_const(ctx: &mut EvalContext, name: &str, value: exp_rs::Real) {
ctx.constants
.insert(hstr(name), value)
.expect("Failed to set constant in test");
}
#[allow(dead_code)]
pub fn set_param(ctx: &mut EvalContext, name: &str, value: exp_rs::Real) {
ctx.set_parameter(name, value)
.expect("Failed to set parameter in test");
}
#[allow(dead_code)]
pub fn set_attr(ctx: &mut EvalContext, object: &str, attr: &str, value: exp_rs::Real) {
ctx.set_attribute(object, attr, value)
.expect("Failed to set attribute in test");
}
#[cfg(not(feature = "libm"))]
pub fn create_test_context_rc() -> std::rc::Rc<EvalContext> {
std::rc::Rc::new(create_test_context())
}
#[allow(dead_code)]
pub fn create_context<'a>() -> EvalContext {
#[cfg(not(feature = "libm"))]
return create_test_context();
#[cfg(feature = "libm")]
return EvalContext::default();
}
#[allow(dead_code)]
pub fn create_context_rc<'a>() -> std::rc::Rc<EvalContext> {
std::rc::Rc::new(create_context())
}