#![cfg(test)]
use std::fs;
use tempfile::TempDir;
#[test]
fn test_semantic_analysis_included_in_output() {
let temp_dir = TempDir::new().unwrap();
let base_path = temp_dir.path();
let lib_dir = base_path.join("src");
fs::create_dir_all(&lib_dir).unwrap();
fs::write(
lib_dir.join("main.rs"),
r#"
use crate::lib::helper;
use crate::utils::format;
fn main() {
helper::init();
format::display("Hello");
}
"#,
)
.unwrap();
fs::write(
lib_dir.join("lib.rs"),
r#"
pub mod helper;
pub mod utils;
use std::collections::HashMap;
pub fn process() {
println!("Processing");
}
"#,
)
.unwrap();
fs::write(
lib_dir.join("helper.rs"),
r#"
use std::fs;
pub fn init() {
println!("Initialized");
}
pub fn cleanup() {
println!("Cleanup");
}
"#,
)
.unwrap();
fs::write(
lib_dir.join("utils.rs"),
r#"
pub mod format;
pub fn utility() {
println!("Utility");
}
"#,
)
.unwrap();
fs::write(
lib_dir.join("format.rs"),
r#"
pub fn display(msg: &str) {
println!("{}", msg);
}
"#,
)
.unwrap();
let output = std::process::Command::new(env!("CARGO_BIN_EXE_context-creator"))
.arg(&lib_dir)
.arg("--trace-imports")
.arg("--include-callers")
.arg("--include-types")
.output()
.expect("Failed to execute context-creator");
let stdout = String::from_utf8_lossy(&output.stdout);
let stderr = String::from_utf8_lossy(&output.stderr);
eprintln!("STDOUT:\n{stdout}");
eprintln!("STDERR:\n{stderr}");
assert!(output.status.success(), "context-creator failed: {stderr}");
if stderr.contains("Analyzing semantic dependencies") {
assert!(
stderr.contains("Found") && stderr.contains("import relationships"),
"Semantic analysis should report found imports"
);
}
let markdown = stdout;
assert!(
markdown.contains("main.rs"),
"Output should contain main.rs"
);
let main_rs_section = markdown
.split("## main.rs")
.nth(1)
.unwrap_or("")
.split("##")
.next()
.unwrap_or("");
assert!(
main_rs_section.contains("Imports:")
|| main_rs_section.contains("imports:")
|| main_rs_section.contains("Dependencies:")
|| main_rs_section.contains("lib::helper")
|| main_rs_section.contains("utils::format"),
"main.rs section should show its imports (lib::helper, utils::format), but found:\n{main_rs_section}"
);
let helper_section = markdown
.split("## helper.rs")
.nth(1)
.unwrap_or("")
.split("##")
.next()
.unwrap_or("");
assert!(
helper_section.contains("Imported by:")
|| helper_section.contains("imported by:")
|| helper_section.contains("Referenced by:")
|| helper_section.contains("main.rs"),
"helper.rs section should show it's imported by main.rs, but found:\n{helper_section}"
);
assert!(
main_rs_section.contains("helper::init") ||
main_rs_section.contains("format::display") ||
main_rs_section.contains("Function calls:") ||
main_rs_section.contains("Calls:"),
"main.rs section should show function calls (helper::init, format::display), but found:\n{main_rs_section}"
);
let lib_section = markdown
.split("## lib.rs")
.nth(1)
.unwrap_or("")
.split("##")
.next()
.unwrap_or("");
assert!(
lib_section.contains("HashMap")
|| lib_section.contains("Type references:")
|| lib_section.contains("Types used:"),
"lib.rs section should show type references (HashMap), but found:\n{lib_section}"
);
}
#[test]
fn test_semantic_analysis_progress_messages() {
let temp_dir = TempDir::new().unwrap();
let base_path = temp_dir.path();
let src_dir = base_path.join("src");
fs::create_dir_all(&src_dir).unwrap();
fs::write(
src_dir.join("main.rs"),
r#"
mod utils;
use utils::helper;
fn main() {
helper();
}
"#,
)
.unwrap();
fs::write(
src_dir.join("utils.rs"),
r#"
pub fn helper() {
println!("Helper function");
}
"#,
)
.unwrap();
let output = std::process::Command::new(env!("CARGO_BIN_EXE_context-creator"))
.arg(&src_dir)
.arg("--trace-imports")
.arg("--progress")
.output()
.expect("Failed to execute context-creator");
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stderr.contains("Analyzing semantic dependencies"),
"Should show semantic analysis progress"
);
assert!(
stderr.contains("Found") && stderr.contains("import relationships"),
"Should report number of import relationships found"
);
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(
stdout.contains("utils")
&& (stdout.contains("Imports:")
|| stdout.contains("Dependencies:")
|| stdout.contains("imported by")),
"The markdown output should contain semantic relationship information"
);
}