use std::sync::{Arc, Mutex};
use vantage_expressions::{
expr_as,
expression::flatten::{ExpressionFlattener, Flatten},
traits::expressive::ExpressiveEnum,
};
#[test]
fn test_arc_mutex_expression() {
let shared_var = Arc::new(Mutex::new(42i32));
let expr = expr_as!(Arc<Mutex<i32>>, "value: {}", shared_var);
assert_eq!(expr.parameters.len(), 1);
assert_eq!(expr.template, "value: {}");
}
#[test]
fn test_deferred_with_mutation() {
let shared_str = Arc::new(Mutex::new("initial".to_string()));
let shared_clone = shared_str.clone();
let deferred_fn = move || {
let shared_clone = shared_clone.clone();
Box::pin(async move {
let value = shared_clone.lock().unwrap().clone();
Ok(ExpressiveEnum::Scalar(value))
})
as std::pin::Pin<
Box<
dyn std::future::Future<Output = vantage_core::Result<ExpressiveEnum<String>>>
+ Send,
>,
>
};
let expr = expr_as!(String, "message: {}", { deferred_fn });
let flattener = ExpressionFlattener::new();
let initial_flattened = flattener.flatten(&expr);
assert_eq!(initial_flattened.parameters.len(), 1);
{
let mut guard = shared_str.lock().unwrap();
*guard = "modified".to_string();
}
let modified_flattened = flattener.flatten(&expr);
assert_eq!(modified_flattened.parameters.len(), 1);
let current_value = shared_str.lock().unwrap().clone();
assert_eq!(current_value, "modified");
}