use dslcompile::prelude::*;
#[test]
fn test_independent_math_builders() {
let math1 = MathBuilder::new();
let x1 = math1.var(); let expr1 = &x1 * 2.0;
let math2 = MathBuilder::new();
let x2 = math2.var(); let expr2 = &x2 + 1.0;
let result1 = math1.eval(&expr1, &[3.0]);
let result2 = math2.eval(&expr2, &[3.0]);
assert_eq!(result1, 6.0); assert_eq!(result2, 4.0); }
#[test]
fn test_combining_expressions_from_different_builders() {
let math1 = MathBuilder::new();
let x1 = math1.var(); let expr1 = &x1 * 2.0;
let math2 = MathBuilder::new();
let x2 = math2.var(); let expr2 = &x2 + 1.0;
let combined_expr = &expr1 + &expr2;
let result = math1.eval(&combined_expr, &[3.0]);
assert_eq!(result, 10.0); }
#[test]
fn test_multiple_variables_in_each_builder() {
let math_a = MathBuilder::new();
let x_a = math_a.var(); let y_a = math_a.var(); let expr_a = &x_a + &y_a;
let math_b = MathBuilder::new();
let x_b = math_b.var(); let y_b = math_b.var(); let expr_b = &x_b * &y_b;
let result_a = math_a.eval(&expr_a, &[2.0, 3.0]);
let result_b = math_b.eval(&expr_b, &[2.0, 3.0]);
assert_eq!(result_a, 5.0); assert_eq!(result_b, 6.0); }
#[test]
fn test_functions_building_expressions_independently() {
fn build_quadratic(math: &MathBuilder) -> TypedBuilderExpr<f64> {
let x = math.var();
&x * &x + 2.0 * &x + 1.0 }
fn build_linear(math: &MathBuilder) -> TypedBuilderExpr<f64> {
let x = math.var();
3.0 * &x + 2.0 }
let main_math = MathBuilder::new();
let quad_expr = build_quadratic(&main_math);
let linear_expr = build_linear(&main_math);
let quad_result = main_math.eval(&quad_expr, &[3.0, 0.0]); let linear_result = main_math.eval(&linear_expr, &[0.0, 3.0]);
assert_eq!(quad_result, 16.0); assert_eq!(linear_result, 11.0); }
#[test]
fn test_combining_expressions_from_same_builder() {
fn build_quadratic(math: &MathBuilder) -> TypedBuilderExpr<f64> {
let x = math.var();
&x * &x + 2.0 * &x + 1.0 }
fn build_linear(math: &MathBuilder) -> TypedBuilderExpr<f64> {
let x = math.var();
3.0 * &x + 2.0 }
let main_math = MathBuilder::new();
let quad_expr = build_quadratic(&main_math);
let linear_expr = build_linear(&main_math);
let combined_same_builder = &quad_expr + &linear_expr;
let combined_result = main_math.eval(&combined_same_builder, &[3.0, 3.0]);
assert_eq!(combined_result, 27.0); }
#[test]
fn test_variable_indices_are_not_mangled() {
let math = MathBuilder::new();
let x = math.var(); let y = math.var(); let z = math.var();
let expr1 = &x * 2.0; let expr2 = &y * 3.0; let expr3 = &z * 4.0; let combined = &expr1 + &expr2 + &expr3;
let result = math.eval(&combined, &[1.0, 2.0, 3.0]); assert_eq!(result, 20.0); }
#[test]
fn test_registry_isolation() {
let math1 = MathBuilder::new();
let math2 = MathBuilder::new();
let x1 = math1.var(); let y1 = math1.var();
let x2 = math2.var(); let y2 = math2.var();
let expr1 = &x1 + &y1; let expr2 = &x2 * &y2;
let result1 = math1.eval(&expr1, &[10.0, 20.0]); let result2 = math2.eval(&expr2, &[5.0, 6.0]);
assert_eq!(result1, 30.0); assert_eq!(result2, 30.0);
assert_eq!(math1.registry().borrow().len(), 2);
assert_eq!(math2.registry().borrow().len(), 2);
}