cargo testcargo test --libcargo test --test integrationcargo test sealed_variant
cargo test write_only
cargo test unused_param
cargo test unused_intent_extracargo test -- --nocapturetests/
├── fixtures/ # Test fixtures (sample code)
│ ├── kotlin/
│ │ ├── dead_code.kt # Various dead code patterns
│ │ └── all_used.kt # Clean code (no dead code)
│ ├── java/
│ │ └── DeadCode.java # Java dead code patterns
│ └── android/
│ └── MainActivity.kt # Android-specific patterns
└── integration/
└── analysis_test.rs # Integration tests
#[test]
fn test_new_detection_feature() {
let fixture = fixtures_path().join("kotlin/new_feature.kt");
let graph = build_graph_from_file(&fixture);
let detector = NewFeatureDetector::new();
let issues = detector.detect(&graph);
// Assert expected behavior
assert!(!issues.is_empty(), "Should detect the new pattern");
assert_eq!(issues[0].declaration.name, "expectedDeadCode");
}Create a Kotlin/Java file in tests/fixtures/ that demonstrates the pattern:
// tests/fixtures/kotlin/new_feature.kt
class NewFeatureExample {
// Pattern to detect goes here
}Implement the minimum code to make the test pass.
Refactor while keeping tests green.
Each detector module has #[cfg(test)] mod tests:
- sealed_variant: Tests sealed class detection
- write_only: Tests write-only variable detection
- unused_param: Tests unused parameter detection
- unused_intent_extra: Tests Android Intent extra detection
- ignored_return: Tests pure function detection
- redundant_override: Tests override detection
Located in tests/integration/analysis_test.rs:
test_dead_code_kotlin_fixture: Parses Kotlin with dead codetest_all_used_kotlin_fixture: Parses clean Kotlin codetest_java_fixture: Parses Java filestest_write_only_detector_on_fixture: Runs write-only detectortest_sealed_variant_detector_on_fixture: Runs sealed detectortest_reachability_analysis: Tests reachability analysistest_multiple_files: Tests multi-file analysis
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_method_name() {
let detector = MyDetector::new();
// Create test data
// Assert expected behavior
}
}#[test]
fn test_feature_integration() {
let fixture = fixtures_path().join("kotlin/feature.kt");
if !fixture.exists() {
return;
}
let graph = build_graph_from_file(&fixture);
// Run analysis
// Assert results
}- Add fixture file to
tests/fixtures/ - Write test that loads and analyzes it
- Assert expected findings
To generate coverage reports:
# Install cargo-llvm-cov
cargo install cargo-llvm-cov
# Generate coverage
cargo llvm-cov
# Generate HTML report
cargo llvm-cov --html# Run benchmarks
cargo bench
# Benchmark specific feature
cargo bench parsingTests run automatically on:
- Push to main branch
- Pull requests
- Release builds
- Write tests first - TDD ensures better design
- Keep fixtures small - Minimal code to test the pattern
- Test edge cases - Empty files, malformed code, etc.
- Use descriptive names -
test_skip_enum_classesnottest1 - Assert specific behavior - Check names, locations, not just counts
- Keep tests fast - Unit tests should complete in milliseconds