#![allow(deprecated)]
use assert_cmd::Command;
use predicates::prelude::*;
use std::fs;
use tempfile::TempDir;
fn create_test_project(dir: &TempDir) {
let main_path = dir.path().join("main.rs");
fs::write(
&main_path,
r#"
mod user;
mod database;
mod api;
use user::User;
use database::Database;
use api::ApiServer;
fn main() {
let db = Database::new();
let user = User::new("Alice", "alice@example.com");
let server = ApiServer::new(db);
server.register_user(user);
}
"#,
)
.unwrap();
let user_path = dir.path().join("user.rs");
fs::write(
&user_path,
r#"
pub struct User {
pub name: String,
pub email: String,
id: Option<u64>,
}
impl User {
pub fn new(name: &str, email: &str) -> Self {
User {
name: name.to_string(),
email: email.to_string(),
id: None,
}
}
pub fn set_id(&mut self, id: u64) {
self.id = Some(id);
}
pub fn validate_email(&self) -> bool {
self.email.contains('@')
}
}
"#,
)
.unwrap();
let db_path = dir.path().join("database.rs");
fs::write(
&db_path,
r#"
use crate::user::User;
pub struct Database {
users: Vec<User>,
next_id: u64,
}
impl Database {
pub fn new() -> Self {
Database {
users: Vec::new(),
next_id: 1,
}
}
pub fn add_user(&mut self, mut user: User) -> u64 {
user.set_id(self.next_id);
self.next_id += 1;
let id = self.next_id - 1;
self.users.push(user);
id
}
pub fn find_user_by_email(&self, email: &str) -> Option<&User> {
self.users.iter().find(|u| u.email == email)
}
}
"#,
)
.unwrap();
let api_path = dir.path().join("api.rs");
fs::write(
&api_path,
r#"
use crate::user::User;
use crate::database::Database;
pub struct ApiServer {
db: Database,
}
impl ApiServer {
pub fn new(db: Database) -> Self {
ApiServer { db }
}
pub fn register_user(&mut self, user: User) -> Result<u64, String> {
if !user.validate_email() {
return Err("Invalid email".to_string());
}
if self.db.find_user_by_email(&user.email).is_some() {
return Err("User already exists".to_string());
}
Ok(self.db.add_user(user))
}
}
"#,
)
.unwrap();
}
#[test]
#[ignore] fn test_analyze_deep_context_finds_relationships() {
let temp_dir = TempDir::new().unwrap();
create_test_project(&temp_dir);
let mut cmd = Command::cargo_bin("pmat").unwrap();
cmd.current_dir(&temp_dir)
.args(["analyze", "deep-context", "--format", "json"]);
cmd.assert()
.success()
.stdout(predicate::str::contains("user.rs"))
.stdout(predicate::str::contains("database.rs"))
.stdout(predicate::str::contains("api.rs"));
}
#[test]
#[ignore] fn test_analyze_deep_context_with_specific_file() {
let temp_dir = TempDir::new().unwrap();
create_test_project(&temp_dir);
let mut cmd = Command::cargo_bin("pmat").unwrap();
cmd.current_dir(&temp_dir).args([
"analyze",
"deep-context",
"--include-pattern",
"user.rs",
"--format",
"json",
]);
cmd.assert()
.success()
.stdout(predicate::str::contains("user.rs"))
.stdout(predicate::str::contains("function_count"));
}
#[test]
#[ignore] fn test_analyze_deep_context_human_format() {
let temp_dir = TempDir::new().unwrap();
create_test_project(&temp_dir);
let mut cmd = Command::cargo_bin("pmat").unwrap();
cmd.current_dir(&temp_dir).args(["analyze", "deep-context"]);
cmd.assert()
.success()
.stdout(predicate::str::contains("Deep Context Analysis"))
.stdout(predicate::str::contains("**Files Analyzed**"));
}
#[test]
#[ignore] fn test_analyze_deep_context_empty_project() {
let temp_dir = TempDir::new().unwrap();
let mut cmd = Command::cargo_bin("pmat").unwrap();
cmd.current_dir(&temp_dir).args(["analyze", "deep-context"]);
cmd.assert()
.success()
.stdout(predicate::str::contains("0").or(predicate::str::contains("No files")));
}
#[test]
#[ignore] fn test_analyze_deep_context_with_output_file() {
let temp_dir = TempDir::new().unwrap();
create_test_project(&temp_dir);
let output_path = temp_dir.path().join("context.json");
let mut cmd = Command::cargo_bin("pmat").unwrap();
cmd.current_dir(&temp_dir).args([
"analyze",
"deep-context",
"--format",
"json",
"-o",
output_path.to_str().unwrap(),
]);
cmd.assert().success();
assert!(output_path.exists());
let content = fs::read_to_string(&output_path).unwrap();
assert!(content.contains("user.rs"));
assert!(content.contains("database.rs"));
}