use win_auto_utils::script_engine::instruction::InstructionRegistry;
use win_auto_utils::script_engine::{ScriptConfig, ScriptEngine};
use win_auto_utils::scripts_builtin::register_all;
fn create_engine() -> ScriptEngine {
let mut registry = InstructionRegistry::new();
register_all(&mut registry);
let config = ScriptConfig::default();
ScriptEngine::with_registry_and_config(registry, config)
}
fn measure_compile(engine: &ScriptEngine, script: &str) -> std::time::Duration {
let start = std::time::Instant::now();
let _ = engine.compile(script).unwrap();
start.elapsed()
}
fn measure_execution(engine: &ScriptEngine, script: &str) -> std::time::Duration {
let compiled = engine.compile(script).unwrap();
let start = std::time::Instant::now();
engine.execute(&compiled).unwrap();
start.elapsed()
}
#[test]
fn test_single_loop_continue_performance() {
let engine = create_engine();
let script = r#"loop 1
sleep 10
continue
sleep 10
end
sleep 5
"#;
println!("\n=== Test: Single Loop with Continue ===");
let compile_time = measure_compile(&engine, script);
println!("Compilation time: {:?}", compile_time);
let exec_time = measure_execution(&engine, script);
println!("Execution time: {:?}", exec_time);
assert!(
exec_time < std::time::Duration::from_millis(100),
"Execution took too long: {:?} (possible infinite loop)",
exec_time
);
println!("✅ Test passed - No infinite loop detected\n");
}
#[test]
fn test_multiple_iterations_continue_performance() {
let engine = create_engine();
let script = r#"loop 3
sleep 10
continue
sleep 100
end
sleep 5
"#;
println!("\n=== Test: Multiple Iterations with Continue ===");
let compile_time = measure_compile(&engine, script);
println!("Compilation time: {:?}", compile_time);
let exec_time = measure_execution(&engine, script);
println!("Execution time: {:?}", exec_time);
assert!(
exec_time < std::time::Duration::from_millis(100),
"Continue may not be working properly. Execution time: {:?}",
exec_time
);
println!("✅ Test passed - Continue works correctly\n");
}
#[test]
fn test_break_performance() {
let engine = create_engine();
let script = r#"loop 5
sleep 10
break
sleep 100
end
sleep 5
"#;
println!("\n=== Test: Loop with Break ===");
let compile_time = measure_compile(&engine, script);
println!("Compilation time: {:?}", compile_time);
let exec_time = measure_execution(&engine, script);
println!("Execution time: {:?}", exec_time);
assert!(
exec_time < std::time::Duration::from_millis(50),
"Break may not be working properly. Execution time: {:?}",
exec_time
);
println!("✅ Test passed - Break works correctly\n");
}
#[test]
fn test_nested_loops_performance() {
let engine = create_engine();
let script = r#"loop 2
sleep 10
loop 2
sleep 10
end
end
sleep 5
"#;
println!("\n=== Test: Nested Loops ===");
let compile_time = measure_compile(&engine, script);
println!("Compilation time: {:?}", compile_time);
let exec_time = measure_execution(&engine, script);
println!("Execution time: {:?}", exec_time);
assert!(
exec_time < std::time::Duration::from_millis(150),
"Nested loops performance issue. Execution time: {:?}",
exec_time
);
println!("✅ Test passed - Nested loops work correctly\n");
}
#[test]
fn test_continue_in_nested_loops_performance() {
let engine = create_engine();
let script = r#"loop 2
sleep 10
loop 2
sleep 10
continue
sleep 100
end
sleep 10
end
sleep 5
"#;
println!("\n=== Test: Continue in Nested Loops ===");
let compile_time = measure_compile(&engine, script);
println!("Compilation time: {:?}", compile_time);
let exec_time = measure_execution(&engine, script);
println!("Execution time: {:?}", exec_time);
assert!(
exec_time < std::time::Duration::from_millis(200),
"Continue in nested loops may not work. Execution time: {:?}",
exec_time
);
println!("✅ Test passed - Continue in nested loops works correctly\n");
}
#[test]
fn test_break_in_nested_loops_performance() {
let engine = create_engine();
let script = r#"loop 3
sleep 10
loop 3
sleep 10
break
sleep 100
end
end
sleep 5
"#;
println!("\n=== Test: Break in Nested Loops ===");
let compile_time = measure_compile(&engine, script);
println!("Compilation time: {:?}", compile_time);
let exec_time = measure_execution(&engine, script);
println!("Execution time: {:?}", exec_time);
assert!(
exec_time < std::time::Duration::from_millis(150),
"Break in nested loops performance issue. Execution time: {:?}",
exec_time
);
println!("✅ Test passed - Break in nested loops works correctly\n");
}
#[test]
fn test_complex_script_performance() {
let engine = create_engine();
let script = r#"loop 2
sleep 5
loop 3
sleep 5
continue
sleep 50
end
sleep 5
break
sleep 100
end
sleep 5
"#;
println!("\n=== Test: Complex Script ===");
let compile_time = measure_compile(&engine, script);
println!("Compilation time: {:?}", compile_time);
let exec_time = measure_execution(&engine, script);
println!("Execution time: {:?}", exec_time);
assert!(
exec_time < std::time::Duration::from_millis(100),
"Complex script performance issue. Execution time: {:?}",
exec_time
);
println!("✅ Test passed - Complex script works correctly\n");
}
#[test]
fn test_repeated_execution_performance() {
let engine = create_engine();
let script = r#"loop 2
sleep 5
end
"#;
println!("\n=== Test: Repeated Execution Performance ===");
let compiled = engine.compile(script).unwrap();
let compile_time = std::time::Duration::from_millis(0);
let iterations = 10;
let start = std::time::Instant::now();
for _ in 0..iterations {
engine.execute(&compiled).unwrap();
}
let total_exec_time = start.elapsed();
let avg_exec_time = total_exec_time / iterations;
println!("Compilation time: {:?}", compile_time);
println!(
"Total execution time ({} iterations): {:?}",
iterations, total_exec_time
);
println!("Average execution time per run: {:?}", avg_exec_time);
assert!(
avg_exec_time < std::time::Duration::from_millis(50),
"Repeated execution too slow. Avg time: {:?}",
avg_exec_time
);
println!("✅ Test passed - Repeated execution is efficient\n");
}
#[test]
fn test_mouse_instructions_parse_performance() {
let engine = create_engine();
let script = r#"move 100 200
click 300 400
moverel 50 -30
scrollup 1
scrolldown 2
press
release
"#;
println!("\n=== Test: Mouse Instructions Parse Performance ===");
let compile_time = measure_compile(&engine, script);
println!("Compilation time: {:?}", compile_time);
let exec_time = measure_execution(&engine, script);
println!("Execution time: {:?}", exec_time);
assert!(
compile_time < std::time::Duration::from_millis(10),
"Compilation too slow: {:?}",
compile_time
);
assert!(
exec_time < std::time::Duration::from_millis(50),
"Execution too slow: {:?}",
exec_time
);
println!("✅ Test passed - Mouse instructions use pre-compilation\n");
}
#[test]
fn test_mouse_loop_performance() {
let engine = create_engine();
let script = r#"loop 10
click 100 200
move 300 400
end
"#;
println!("\n=== Test: Mouse Operations in Loop ===");
let compile_time = measure_compile(&engine, script);
println!("Compilation time: {:?}", compile_time);
let exec_time = measure_execution(&engine, script);
println!("Execution time: {:?}", exec_time);
assert!(
compile_time < std::time::Duration::from_millis(10),
"Compilation too slow: {:?}",
compile_time
);
println!("✅ Test passed - Pre-compilation working correctly\n");
}