#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_compress_basic_makefile() {
let content = r#"
PROJECT_NAME = myproject
VERSION = 1.0.0
CC = gcc
RANDOM_VAR = something
all: build test
build:
$(CC) -o $(PROJECT_NAME) main.c
test:
./run_tests.sh
clean:
rm -rf build/
install:
cp $(PROJECT_NAME) /usr/local/bin/
"#;
let compressor = MakefileCompressor::new();
let result = compressor.compress(content);
assert_eq!(result.variables.len(), 3);
assert!(result.variables.iter().any(|v| v.contains("PROJECT_NAME")));
assert!(result.variables.iter().any(|v| v.contains("VERSION")));
assert!(result.variables.iter().any(|v| v.contains("CC")));
assert!(!result.variables.iter().any(|v| v.contains("RANDOM_VAR")));
let target_names: Vec<&str> = result.targets.iter().map(|t| t.name.as_str()).collect();
assert!(target_names.contains(&"all"));
assert!(target_names.contains(&"build"));
assert!(target_names.contains(&"test"));
assert!(target_names.contains(&"clean"));
assert!(target_names.contains(&"install"));
assert_eq!(result.targets.len(), 5);
let all_target = result.targets.iter().find(|t| t.name == "all").unwrap();
assert_eq!(all_target.deps, vec!["build", "test"]);
let build_target = result.targets.iter().find(|t| t.name == "build").unwrap();
assert!(build_target
.recipe_summary
.contains("$(CC) -o $(PROJECT_NAME) main.c"));
assert_eq!(result.detected_toolchain, Some("c/c++".to_string()));
}
#[test]
fn test_compress_rust_makefile() {
let content = r#"
CARGO = cargo
RUSTFLAGS = -D warnings
build:
$(CARGO) build --release
test:
$(CARGO) test --all
test-integration:
$(CARGO) test --test integration_tests
docker-build:
docker build -t myapp .
deploy:
kubectl apply -f k8s/
"#;
let compressor = MakefileCompressor::new();
let result = compressor.compress(content);
assert_eq!(result.detected_toolchain, Some("rust".to_string()));
assert!(result.variables.iter().any(|v| v.contains("CARGO")));
let target_names: Vec<&str> = result.targets.iter().map(|t| t.name.as_str()).collect();
assert!(target_names.contains(&"build"));
assert!(target_names.contains(&"test"));
assert!(target_names.contains(&"test-integration"));
assert!(target_names.contains(&"docker-build"));
assert!(target_names.contains(&"deploy"));
}
#[test]
fn test_recipe_summarization() {
let content = r#"
verbose:
@echo "Starting build..."
@mkdir -p build/
$(CC) -Wall -Werror -O2 -pthread -lm -ldl -o build/app src/*.c src/utils/*.c src/core/*.c -Iinclude/ -Llib/ -lexternal
@echo "Build complete!"
simple:
cargo build
"#;
let compressor = MakefileCompressor::new();
let targets = compressor.parse_targets(content);
let verbose_recipe = &targets.get("verbose").unwrap().recipe;
let summary = compressor.summarize_recipe(verbose_recipe);
assert!(summary.starts_with("$(CC) -Wall -Werror"));
assert!(summary.ends_with("..."));
assert!(summary.len() <= 100);
let simple_recipe = &targets.get("simple").unwrap().recipe;
let simple_summary = compressor.summarize_recipe(simple_recipe);
assert_eq!(simple_summary, "cargo build");
}
#[test]
fn test_dependency_extraction() {
let content = r#"
setup:
command -v docker || echo "Docker not installed"
which kubectl || echo "kubectl not installed"
cargo install sccache
npm install -g typescript
apt-get install -y build-essential
deps:
pip install -r requirements.txt
go get github.com/some/package
"#;
let compressor = MakefileCompressor::new();
let result = compressor.compress(content);
assert!(result.key_dependencies.contains(&"docker".to_string()));
assert!(result.key_dependencies.contains(&"kubectl".to_string()));
assert!(result.key_dependencies.contains(&"sccache".to_string()));
assert!(result.key_dependencies.contains(&"typescript".to_string()));
assert!(result
.key_dependencies
.contains(&"build-essential".to_string()));
}
#[test]
fn test_toolchain_detection() {
let test_cases = vec![
("cargo test\ncargo build", Some("rust")),
("python setup.py\npip install", Some("python")),
("npm run build\nnode index.js", Some("node")),
("go build ./...\ngo test", Some("go")),
("gcc -o app\ng++ -std=c++17", Some("c/c++")),
("javac Main.java\nmvn package", Some("java")),
("echo 'no toolchain'", None),
];
let compressor = MakefileCompressor::new();
for (content, expected) in test_cases {
let result = compressor.compress(content);
assert_eq!(
result.detected_toolchain,
expected.map(|s| s.to_string()),
"Failed for content: {content}"
);
}
}
#[test]
fn test_extract_package_name_cargo() {
let line = "cargo install sccache";
let result = extract_package_name(line, "cargo install");
assert_eq!(result, Some("sccache".to_string()));
}
#[test]
fn test_extract_package_name_npm() {
let line = "npm install typescript";
let result = extract_package_name(line, "npm install");
assert_eq!(result, Some("typescript".to_string()));
}
#[test]
fn test_extract_package_name_with_flags() {
let line = "npm install -g typescript";
let result = extract_package_name(line, "npm install");
assert_eq!(result, Some("typescript".to_string()));
}
#[test]
fn test_extract_package_name_apt() {
let line = "apt-get install -y build-essential";
let result = extract_package_name(line, "install");
assert_eq!(result, Some("build-essential".to_string()));
}
#[test]
fn test_find_cargo_install_position() {
let parts = vec!["cargo", "install", "package"];
assert_eq!(find_cargo_install_position(&parts), Some(2));
let parts_no_cargo = vec!["npm", "install", "package"];
assert_eq!(find_cargo_install_position(&parts_no_cargo), None);
}
#[test]
fn test_find_npm_install_position() {
let parts = vec!["npm", "install", "package"];
assert_eq!(find_npm_install_position(&parts), Some(2));
let parts_no_npm = vec!["cargo", "install", "package"];
assert_eq!(find_npm_install_position(&parts_no_npm), None);
}
#[test]
fn test_get_valid_package() {
let parts = vec!["install", "-y", "package"];
assert_eq!(get_valid_package(&parts, 0), Some("install".to_string()));
assert_eq!(get_valid_package(&parts, 1), None); assert_eq!(get_valid_package(&parts, 2), Some("package".to_string()));
assert_eq!(get_valid_package(&parts, 3), None); }
#[test]
fn test_compressor_default() {
let compressor = MakefileCompressor::default();
assert!(compressor.critical_targets.contains("build"));
assert!(compressor.critical_vars.contains("CC"));
}
#[test]
fn test_compress_empty_makefile() {
let compressor = MakefileCompressor::new();
let result = compressor.compress("");
assert!(result.variables.is_empty());
assert!(result.targets.is_empty());
assert!(result.detected_toolchain.is_none());
}
#[test]
fn test_is_critical_target() {
let compressor = MakefileCompressor::new();
assert!(compressor.is_critical_target("build"));
assert!(compressor.is_critical_target("test"));
assert!(compressor.is_critical_target("test-unit")); assert!(compressor.is_critical_target("build-release"));
assert!(!compressor.is_critical_target("random"));
}
}
#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod property_tests {
use proptest::prelude::*;
proptest! {
#[test]
fn basic_property_stability(_input in ".*") {
prop_assert!(true);
}
#[test]
fn module_consistency_check(_x in 0u32..1000) {
prop_assert!(_x < 1001);
}
}
}