use std::process::Command;
use std::env;
use std::path::PathBuf;
#[tokio::test]
#[ignore] async fn test_screenshot_integration_suite() {
println!("๐ง Running comprehensive screenshot integration tests...");
setup_test_environment();
run_screenshot_utilities_tests();
run_basic_functionality_tests();
run_parameter_validation_tests();
run_timing_behavior_tests();
run_compilation_verification_tests();
println!("โ
All screenshot integration tests completed successfully!");
}
#[tokio::test]
async fn test_screenshot_utilities() {
setup_test_environment();
let result = run_cargo_test("screenshot_test_utils", &["--lib"]);
assert!(result.success(), "Screenshot utilities tests failed");
}
#[tokio::test]
async fn test_screenshot_basic_functionality() {
setup_test_environment();
let tests = vec![
"test_basic_screenshot_functionality",
"test_screenshot_directory_structure",
"test_screenshot_tool_in_mcp_schema",
];
for test_name in tests {
let result = run_cargo_test(test_name, &["--exact"]);
assert!(result.success(), "Basic functionality test {} failed", test_name);
}
}
#[tokio::test]
async fn test_screenshot_parameter_validation() {
setup_test_environment();
let tests = vec![
"test_screenshot_parameter_validation",
"test_screenshot_file_validation",
"test_screenshot_tool_schema_validation",
];
for test_name in tests {
let result = run_cargo_test(test_name, &["--exact"]);
assert!(result.success(), "Parameter validation test {} failed", test_name);
}
}
#[tokio::test]
async fn test_screenshot_timing_controls() {
setup_test_environment();
let tests = vec![
"test_screenshot_timing_parameters",
"test_screenshot_wait_timeout",
];
for test_name in tests {
let result = run_cargo_test(test_name, &["--exact"]);
assert!(result.success(), "Timing control test {} failed", test_name);
}
}
#[tokio::test]
async fn test_screenshot_compilation() {
setup_test_environment();
let result = run_cargo_check(&["--example", "screenshot_setup"]);
assert!(result.success(), "Screenshot example compilation failed");
let result = run_cargo_check(&["tests/fixtures/static_test_game.rs"]);
assert!(result.success(), "Static test game fixture compilation failed");
let result = run_cargo_check(&["tests/fixtures/animated_test_game.rs"]);
assert!(result.success(), "Animated test game fixture compilation failed");
let result = run_cargo_check(&["--test", "screenshot_e2e_tests"]);
assert!(result.success(), "Screenshot E2E tests compilation failed");
}
#[tokio::test]
async fn test_screenshot_performance() {
use std::time::Instant;
setup_test_environment();
let start = Instant::now();
let result = run_cargo_test("test_screenshot_timing_parameters", &["--exact"]);
assert!(result.success(), "Timing performance test failed");
let elapsed = start.elapsed();
assert!(
elapsed.as_secs() < 30,
"Screenshot timing tests took too long: {:?}",
elapsed
);
}
#[tokio::test]
async fn test_screenshot_ci_suite() {
setup_test_environment();
let tests = vec![
"test_screenshot_directory_structure",
"test_screenshot_parameter_validation",
"test_screenshot_file_validation",
];
for test_name in tests {
let result = run_cargo_test(test_name, &["--exact"]);
assert!(result.success(), "CI test {} failed", test_name);
}
}
#[tokio::test]
async fn test_screenshot_mcp_integration() {
use bevy_debugger_mcp::{config::Config, brp_client::BrpClient, mcp_server::McpServer};
use serde_json::json;
setup_test_environment();
let config = Config {
bevy_brp_host: "localhost".to_string(),
bevy_brp_port: 15709,
mcp_port: 3009,
};
let brp_client = std::sync::Arc::new(tokio::sync::RwLock::new(
BrpClient::new(&config)
));
let server = McpServer::new(config, brp_client.clone());
let result = server.handle_tool_call("screenshot", json!({})).await;
assert!(result.is_ok(), "Screenshot tool should be available in MCP server");
let result = server.handle_tool_call("screenshot", json!({
"path": "/tmp/integration_test.png",
"warmup_duration": 1000,
"capture_delay": 500,
"description": "Integration test screenshot"
})).await;
assert!(result.is_ok(), "Screenshot tool should handle parameters correctly");
let response = result.unwrap();
assert!(
response.get("error").is_some(),
"Should return error when no game connected: {:?}",
response
);
}
#[tokio::test]
async fn test_screenshot_documentation() {
setup_test_environment();
let docs = vec![
"book/SCREENSHOT_SETUP.md",
"examples/screenshot_setup.rs",
"README.md",
];
for doc_path in docs {
let path = get_project_root().join(doc_path);
assert!(
path.exists(),
"Documentation file should exist: {}",
path.display()
);
let content = std::fs::read_to_string(&path)
.expect(&format!("Should be able to read {}", path.display()));
assert!(
!content.trim().is_empty(),
"Documentation file should not be empty: {}",
path.display()
);
}
let readme_path = get_project_root().join("README.md");
let readme_content = std::fs::read_to_string(readme_path).unwrap();
assert!(
readme_content.contains("screenshot") || readme_content.contains("Screenshot"),
"README should mention screenshot functionality"
);
}
fn setup_test_environment() {
env::set_var("CI", "false");
env::set_var("RUST_LOG", "debug");
env::set_var("RUST_BACKTRACE", "1");
std::fs::create_dir_all("test_output").ok();
std::fs::create_dir_all("reference_screenshots").ok();
std::fs::create_dir_all("diffs").ok();
}
fn run_screenshot_utilities_tests() {
println!("๐ Running screenshot utility tests...");
let result = run_cargo_test("screenshot_test_utils", &["--lib"]);
assert!(result.success(), "Screenshot utilities tests failed");
}
fn run_basic_functionality_tests() {
println!("๐งช Running basic functionality tests...");
let tests = vec![
"test_basic_screenshot_functionality",
"test_screenshot_directory_structure",
"test_screenshot_tool_in_mcp_schema",
];
for test_name in tests {
println!(" Testing: {}", test_name);
let result = run_cargo_test(test_name, &["--exact"]);
assert!(result.success(), "Basic test {} failed", test_name);
}
}
fn run_parameter_validation_tests() {
println!("๐ง Running parameter validation tests...");
let tests = vec![
"test_screenshot_parameter_validation",
"test_screenshot_file_validation",
"test_screenshot_tool_schema_validation",
];
for test_name in tests {
println!(" Testing: {}", test_name);
let result = run_cargo_test(test_name, &["--exact"]);
assert!(result.success(), "Parameter validation test {} failed", test_name);
}
}
fn run_timing_behavior_tests() {
println!("โฑ๏ธ Running timing behavior tests...");
let tests = vec![
"test_screenshot_timing_parameters",
"test_screenshot_wait_timeout",
];
for test_name in tests {
println!(" Testing: {}", test_name);
let result = run_cargo_test(test_name, &["--exact"]);
assert!(result.success(), "Timing test {} failed", test_name);
}
}
fn run_compilation_verification_tests() {
println!("๐๏ธ Running compilation verification tests...");
let result = run_cargo_check(&["--example", "screenshot_setup"]);
assert!(result.success(), "Screenshot example compilation failed");
let result = run_cargo_check(&["--test", "screenshot_e2e_tests"]);
assert!(result.success(), "Screenshot E2E tests compilation failed");
}
fn run_cargo_test(test_name: &str, extra_args: &[&str]) -> std::process::Output {
let mut cmd = Command::new("cargo");
cmd.arg("test")
.arg(test_name)
.args(extra_args)
.arg("--")
.arg("--nocapture");
cmd.output().expect("Failed to run cargo test")
}
fn run_cargo_check(extra_args: &[&str]) -> std::process::Output {
let mut cmd = Command::new("cargo");
cmd.arg("check")
.args(extra_args);
cmd.output().expect("Failed to run cargo check")
}
fn get_project_root() -> PathBuf {
env::current_dir()
.expect("Should be able to get current directory")
}
trait OutputExt {
fn success(&self) -> bool;
}
impl OutputExt for std::process::Output {
fn success(&self) -> bool {
self.status.success()
}
}