use std::time::Instant;
use camel_language_js::{BoaEngine, JsEngine, JsExchange};
use serde_json::json;
const SRC: &str = "camel.headers.set('n', (parseInt(camel.headers.get('n'))||0)+1); camel.body";
fn make_exchange() -> JsExchange {
JsExchange::from_headers_body_properties(
[("n".to_string(), json!("0"))].into_iter().collect(),
json!("hello"),
Default::default(),
)
}
#[test]
fn amortization_ratio_at_least_4x() {
let engine = BoaEngine::default();
let t0 = Instant::now();
let r1 = engine.eval(SRC, make_exchange()).unwrap();
let eval1 = t0.elapsed();
assert_eq!(r1.return_value.as_str().unwrap(), "hello");
assert_eq!(r1.body.as_str().unwrap(), "hello");
let t0 = Instant::now();
for _ in 2..=1000 {
engine.eval(SRC, make_exchange()).unwrap();
}
let steady = t0.elapsed();
let eval1_us = eval1.as_secs_f64() * 1e6;
let steady_us_per_eval = steady.as_secs_f64() * 1e6 / 999.0;
let ratio = eval1_us / steady_us_per_eval;
println!(
"steady_state_us_per_eval = {steady_us_per_eval:.1} µs \
(eval1 = {eval1_us:.1} µs, ratio = {ratio:.1}x)"
);
assert!(
steady_us_per_eval < eval1_us / 4.0,
"steady-state {steady_us_per_eval:.1} µs/eval must be under 25% of eval 1 \
({eval1_us:.1} µs); measured ratio {ratio:.1}x < 4x"
);
}