use win_auto_utils::script_engine::{ScriptConfig, ScriptEngine};
use win_auto_utils::scripts_builtin::register_all;
use win_auto_utils::script_engine::instruction::InstructionRegistry;
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_keyboard_operations_performance() {
let engine = create_engine();
let script = r#"key A
key B 50
key C send
key D 100 send
key_down SHIFT
key_up SHIFT
loop 5
key E
end
"#;
println!("\n=== Test: Keyboard Operations 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),
"Keyboard compilation too slow: {:?}", compile_time);
println!("✅ Test passed - Keyboard instructions compiled efficiently\n");
}
#[test]
fn test_timing_instructions_performance() {
let engine = create_engine();
let script = r#"sleep 10
time 100
sleep 20
end
sleep 5
"#;
println!("\n=== Test: Timing Instructions 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!(exec_time > std::time::Duration::from_millis(100),
"Execution too fast, timing may be wrong: {:?}", exec_time);
assert!(exec_time < std::time::Duration::from_millis(200),
"Execution too slow: {:?}", exec_time);
println!("✅ Test passed - Timing instructions work correctly\n");
}
#[test]
fn test_all_control_flow_mix_performance() {
let engine = create_engine();
let script = r#"loop 3
sleep 5
loop 2
sleep 5
continue
sleep 50
end
sleep 5
break
sleep 100
end
sleep 10
loop 2
sleep 5
end
"#;
println!("\n=== Test: All Control Flow Mixed ===");
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),
"Control flow mix performance issue: {:?}", exec_time);
println!("✅ Test passed - Mixed control flow works correctly\n");
}
#[test]
fn test_full_builtin_mix_performance() {
let engine = create_engine();
let script = r#"# Comprehensive test with all instruction types
sleep 5
key A
key B 50 send
move 100 200
click 300 400
loop 3
sleep 5
key C
click 100 200
loop 2
sleep 5
moverel 10 -10
continue
scrollup 1
end
scrolldown 2
break
key D 100
end
time 50
sleep 10
press
release
end
sleep 5
"#;
println!("\n=== Test: Full Builtin Instructions Mix ===");
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(20),
"Full mix compilation too slow: {:?}", compile_time);
assert!(exec_time < std::time::Duration::from_millis(300),
"Full mix execution too slow: {:?}", exec_time);
println!("✅ Test passed - All builtin instructions work together\n");
}
#[test]
fn test_deeply_nested_loops_performance() {
let engine = create_engine();
let script = r#"loop 2
sleep 5
loop 2
sleep 5
loop 2
sleep 5
end
end
end
sleep 5
"#;
println!("\n=== Test: Deeply Nested Loops (3 Levels) ===");
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),
"Deep nesting performance issue: {:?}", exec_time);
println!("✅ Test passed - Deep nesting works correctly\n");
}
#[test]
fn test_time_with_break_continue_performance() {
let engine = create_engine();
let script = r#"time 100
sleep 20
continue
sleep 50
end
time 100
sleep 20
break
sleep 50
end
sleep 5
"#;
println!("\n=== Test: Time Blocks with Break/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 too fast, time blocks may not work: {:?}", exec_time);
assert!(exec_time < std::time::Duration::from_millis(250),
"Execution too slow: {:?}", exec_time);
println!("✅ Test passed - Time blocks with control flow work correctly\n");
}
#[test]
fn test_compiled_script_reuse_performance() {
let engine = create_engine();
let script = r#"loop 5
sleep 5
key A
click 100 200
end
"#;
println!("\n=== Test: Compiled Script Reuse Performance ===");
let compile_start = std::time::Instant::now();
let compiled = engine.compile(script).unwrap();
let compile_time = compile_start.elapsed();
println!("Single compilation time: {:?}", compile_time);
let iterations = 20;
let exec_start = std::time::Instant::now();
for _ in 0..iterations {
engine.execute(&compiled).unwrap();
}
let total_exec_time = exec_start.elapsed();
let avg_exec_time = total_exec_time / iterations;
println!("Total execution time ({} iterations): {:?}", iterations, total_exec_time);
println!("Average execution time per run: {:?}", avg_exec_time);
println!("Compilation amortized over {} runs: {:?}", iterations, compile_time / iterations);
assert!(avg_exec_time < std::time::Duration::from_millis(50),
"Repeated execution too slow: {:?}", avg_exec_time);
println!("✅ Test passed - Compiled script reuse is efficient\n");
}
#[test]
fn test_mode_switching_performance() {
let engine = create_engine();
let script = r#"# Test mode switching impact (all send mode)
key A send
key B send
click 100 200 send
click 300 400 send
loop 3
key C send
key D send
end
"#;
println!("\n=== Test: Mode Switching 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(15),
"Mode switching compilation too slow: {:?}", compile_time);
println!("✅ Test passed - Mode switching handled efficiently\n");
}
#[test]
fn test_extreme_loop_count_performance() {
let engine = create_engine();
let script = r#"loop 100
sleep 1
end
"#;
println!("\n=== Test: Extreme Loop Count (100 iterations) ===");
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(80),
"Execution too fast, loop may not run fully: {:?}", exec_time);
assert!(exec_time < std::time::Duration::from_millis(200),
"Execution too slow: {:?}", exec_time);
println!("✅ Test passed - High iteration count works correctly\n");
}
#[test]
fn test_instruction_parsing_overhead() {
let engine = create_engine();
let simple_script = "key A";
let medium_script = r#"loop 5
key B
sleep 10
end"#;
let complex_script = r#"loop 3
key C
loop 2
click 100 200
sleep 5
end
moverel 10 10
end
time 50
key D
end"#;
println!("\n=== Test: Instruction Parsing Overhead ===");
let simple_time = measure_compile(&engine, simple_script);
println!("Simple script (1 instr): {:?}", simple_time);
let medium_time = measure_compile(&engine, medium_script);
println!("Medium script (3 instr types): {:?}", medium_time);
let complex_time = measure_compile(&engine, complex_script);
println!("Complex script (nested): {:?}", complex_time);
assert!(simple_time < std::time::Duration::from_millis(5),
"Simple parse too slow: {:?}", simple_time);
assert!(medium_time < std::time::Duration::from_millis(10),
"Medium parse too slow: {:?}", medium_time);
assert!(complex_time < std::time::Duration::from_millis(20),
"Complex parse too slow: {:?}", complex_time);
println!("✅ Test passed - Parsing overhead is acceptable\n");
}