|
|
@@ -0,0 +1,227 @@
|
|
|
+use std::path::PathBuf;
|
|
|
+use tempfile::TempDir;
|
|
|
+
|
|
|
+#[test]
|
|
|
+fn test_scanner_finds_all_sample_files() {
|
|
|
+ let samples_dir = PathBuf::from("tests/samples");
|
|
|
+ let scanner = codebase_summarizer::scanner::Scanner::default_config();
|
|
|
+ let files = scanner.scan(&samples_dir).unwrap();
|
|
|
+
|
|
|
+ assert!(files.len() >= 12, "Should find at least 12 sample files");
|
|
|
+}
|
|
|
+
|
|
|
+#[test]
|
|
|
+fn test_parse_go_sample() {
|
|
|
+ use codebase_summarizer::parser::LanguageParser;
|
|
|
+ let path = PathBuf::from("tests/samples/sample.go");
|
|
|
+ let content = std::fs::read_to_string(&path).unwrap();
|
|
|
+ let parser = codebase_summarizer::parser::GoParser;
|
|
|
+ let summary = parser.parse(&path, &content);
|
|
|
+
|
|
|
+ assert_eq!(summary.language, codebase_summarizer::models::Language::Go);
|
|
|
+ assert!(summary.symbols.len() >= 4, "Should find functions, structs, const");
|
|
|
+}
|
|
|
+
|
|
|
+#[test]
|
|
|
+fn test_parse_rust_sample() {
|
|
|
+ use codebase_summarizer::parser::LanguageParser;
|
|
|
+ let path = PathBuf::from("tests/samples/sample.rs");
|
|
|
+ let content = std::fs::read_to_string(&path).unwrap();
|
|
|
+ let parser = codebase_summarizer::parser::RustParser;
|
|
|
+ let summary = parser.parse(&path, &content);
|
|
|
+
|
|
|
+ assert_eq!(summary.language, codebase_summarizer::models::Language::Rust);
|
|
|
+ assert!(summary.symbols.len() >= 5, "Should find struct, functions, const, type");
|
|
|
+}
|
|
|
+
|
|
|
+#[test]
|
|
|
+fn test_parse_python_sample() {
|
|
|
+ use codebase_summarizer::parser::LanguageParser;
|
|
|
+ let path = PathBuf::from("tests/samples/sample.py");
|
|
|
+ let content = std::fs::read_to_string(&path).unwrap();
|
|
|
+ let parser = codebase_summarizer::parser::PythonParser;
|
|
|
+ let summary = parser.parse(&path, &content);
|
|
|
+
|
|
|
+ assert_eq!(summary.language, codebase_summarizer::models::Language::Python);
|
|
|
+ assert!(summary.symbols.len() >= 3, "Should find functions and class");
|
|
|
+}
|
|
|
+
|
|
|
+#[test]
|
|
|
+fn test_parse_dart_sample() {
|
|
|
+ use codebase_summarizer::parser::LanguageParser;
|
|
|
+ let path = PathBuf::from("tests/samples/sample.dart");
|
|
|
+ let content = std::fs::read_to_string(&path).unwrap();
|
|
|
+ let parser = codebase_summarizer::parser::DartParser;
|
|
|
+ let summary = parser.parse(&path, &content);
|
|
|
+
|
|
|
+ assert_eq!(summary.language, codebase_summarizer::models::Language::Dart);
|
|
|
+ assert!(summary.symbols.len() >= 4, "Should find class, enum, methods");
|
|
|
+}
|
|
|
+
|
|
|
+#[test]
|
|
|
+fn test_parse_typescript_sample() {
|
|
|
+ use codebase_summarizer::parser::LanguageParser;
|
|
|
+ let path = PathBuf::from("tests/samples/sample.ts");
|
|
|
+ let content = std::fs::read_to_string(&path).unwrap();
|
|
|
+ let parser = codebase_summarizer::parser::TypeScriptParser;
|
|
|
+ let summary = parser.parse(&path, &content);
|
|
|
+
|
|
|
+ assert_eq!(summary.language, codebase_summarizer::models::Language::TypeScript);
|
|
|
+ assert!(summary.symbols.len() >= 5, "Should find class, interface, type, enum, const");
|
|
|
+}
|
|
|
+
|
|
|
+#[test]
|
|
|
+fn test_parse_r_sample() {
|
|
|
+ use codebase_summarizer::parser::LanguageParser;
|
|
|
+ let path = PathBuf::from("tests/samples/sample.r");
|
|
|
+ let content = std::fs::read_to_string(&path).unwrap();
|
|
|
+ let parser = codebase_summarizer::parser::RParser;
|
|
|
+ let summary = parser.parse(&path, &content);
|
|
|
+
|
|
|
+ assert_eq!(summary.language, codebase_summarizer::models::Language::R);
|
|
|
+ assert!(summary.symbols.len() >= 2, "Should find function and class");
|
|
|
+}
|
|
|
+
|
|
|
+#[test]
|
|
|
+fn test_parse_java_sample() {
|
|
|
+ use codebase_summarizer::parser::LanguageParser;
|
|
|
+ let path = PathBuf::from("tests/samples/sample.java");
|
|
|
+ let content = std::fs::read_to_string(&path).unwrap();
|
|
|
+ let parser = codebase_summarizer::parser::GenericParser;
|
|
|
+ let summary = parser.parse(&path, &content);
|
|
|
+
|
|
|
+ assert_eq!(summary.language, codebase_summarizer::models::Language::Java);
|
|
|
+ assert!(summary.symbols.len() >= 3, "Should find class, interface, enum");
|
|
|
+}
|
|
|
+
|
|
|
+#[test]
|
|
|
+fn test_parse_c_sample() {
|
|
|
+ use codebase_summarizer::parser::LanguageParser;
|
|
|
+ let path = PathBuf::from("tests/samples/sample.c");
|
|
|
+ let content = std::fs::read_to_string(&path).unwrap();
|
|
|
+ let parser = codebase_summarizer::parser::GenericParser;
|
|
|
+ let summary = parser.parse(&path, &content);
|
|
|
+
|
|
|
+ assert_eq!(summary.language, codebase_summarizer::models::Language::C);
|
|
|
+ assert!(summary.symbols.len() >= 3, "Should find struct, functions, const");
|
|
|
+}
|
|
|
+
|
|
|
+#[test]
|
|
|
+fn test_parse_ruby_sample() {
|
|
|
+ use codebase_summarizer::parser::LanguageParser;
|
|
|
+ let path = PathBuf::from("tests/samples/sample.rb");
|
|
|
+ let content = std::fs::read_to_string(&path).unwrap();
|
|
|
+ let parser = codebase_summarizer::parser::GenericParser;
|
|
|
+ let summary = parser.parse(&path, &content);
|
|
|
+
|
|
|
+ assert_eq!(summary.language, codebase_summarizer::models::Language::Ruby);
|
|
|
+ assert!(summary.symbols.len() >= 2, "Should find class and module");
|
|
|
+}
|
|
|
+
|
|
|
+#[test]
|
|
|
+fn test_parse_php_sample() {
|
|
|
+ use codebase_summarizer::parser::LanguageParser;
|
|
|
+ let path = PathBuf::from("tests/samples/sample.php");
|
|
|
+ let content = std::fs::read_to_string(&path).unwrap();
|
|
|
+ let parser = codebase_summarizer::parser::GenericParser;
|
|
|
+ let summary = parser.parse(&path, &content);
|
|
|
+
|
|
|
+ assert_eq!(summary.language, codebase_summarizer::models::Language::Php);
|
|
|
+ assert!(summary.symbols.len() >= 2, "Should find class and interface");
|
|
|
+}
|
|
|
+
|
|
|
+#[test]
|
|
|
+fn test_parse_swift_sample() {
|
|
|
+ use codebase_summarizer::parser::LanguageParser;
|
|
|
+ let path = PathBuf::from("tests/samples/sample.swift");
|
|
|
+ let content = std::fs::read_to_string(&path).unwrap();
|
|
|
+ let parser = codebase_summarizer::parser::GenericParser;
|
|
|
+ let summary = parser.parse(&path, &content);
|
|
|
+
|
|
|
+ assert_eq!(summary.language, codebase_summarizer::models::Language::Swift);
|
|
|
+ assert!(summary.symbols.len() >= 2, "Should find struct and func");
|
|
|
+}
|
|
|
+
|
|
|
+#[test]
|
|
|
+fn test_parse_kotlin_sample() {
|
|
|
+ use codebase_summarizer::parser::LanguageParser;
|
|
|
+ let path = PathBuf::from("tests/samples/sample.kt");
|
|
|
+ let content = std::fs::read_to_string(&path).unwrap();
|
|
|
+ let parser = codebase_summarizer::parser::GenericParser;
|
|
|
+ let summary = parser.parse(&path, &content);
|
|
|
+
|
|
|
+ assert_eq!(summary.language, codebase_summarizer::models::Language::Kotlin);
|
|
|
+ assert!(summary.symbols.len() >= 3, "Should find data class, functions, enum");
|
|
|
+}
|
|
|
+
|
|
|
+#[test]
|
|
|
+fn test_parser_factory() {
|
|
|
+ use codebase_summarizer::parser::{get_parser, LanguageParser};
|
|
|
+
|
|
|
+ let go_parser = get_parser(&codebase_summarizer::models::Language::Go);
|
|
|
+ let rust_parser = get_parser(&codebase_summarizer::models::Language::Rust);
|
|
|
+ let python_parser = get_parser(&codebase_summarizer::models::Language::Python);
|
|
|
+ let generic_parser = get_parser(&codebase_summarizer::models::Language::Cpp);
|
|
|
+
|
|
|
+ assert!(go_parser.parse(&PathBuf::from("test.go"), "").language == codebase_summarizer::models::Language::Go);
|
|
|
+ assert!(rust_parser.parse(&PathBuf::from("test.rs"), "").language == codebase_summarizer::models::Language::Rust);
|
|
|
+ assert!(python_parser.parse(&PathBuf::from("test.py"), "").language == codebase_summarizer::models::Language::Python);
|
|
|
+ assert!(generic_parser.parse(&PathBuf::from("test.cpp"), "").language == codebase_summarizer::models::Language::Cpp);
|
|
|
+}
|
|
|
+
|
|
|
+#[test]
|
|
|
+fn test_writer_generates_markdown() {
|
|
|
+ use codebase_summarizer::models::{CodebaseSummary, FileSummary, Symbol, SymbolKind};
|
|
|
+ use codebase_summarizer::writer::MarkdownWriter;
|
|
|
+
|
|
|
+ let temp_dir = TempDir::new().unwrap();
|
|
|
+ let output_path = temp_dir.path().join("summary.md");
|
|
|
+
|
|
|
+ let symbols = vec![
|
|
|
+ Symbol {
|
|
|
+ kind: SymbolKind::Function,
|
|
|
+ name: "test_func".to_string(),
|
|
|
+ signature: "fn test_func()".to_string(),
|
|
|
+ doc: Some("Test function".to_string()),
|
|
|
+ line: 1,
|
|
|
+ },
|
|
|
+ ];
|
|
|
+
|
|
|
+ let file_summary = FileSummary {
|
|
|
+ path: PathBuf::from("test.rs"),
|
|
|
+ language: codebase_summarizer::models::Language::Rust,
|
|
|
+ symbols,
|
|
|
+ };
|
|
|
+
|
|
|
+ let summary = CodebaseSummary::new(temp_dir.path().to_path_buf());
|
|
|
+ let mut summary = summary;
|
|
|
+ summary.add_file(file_summary);
|
|
|
+
|
|
|
+ let writer = MarkdownWriter::new();
|
|
|
+ writer.write_summary(&summary, &output_path).unwrap();
|
|
|
+
|
|
|
+ assert!(output_path.exists());
|
|
|
+ let content = std::fs::read_to_string(&output_path).unwrap();
|
|
|
+ assert!(content.contains("test_func"));
|
|
|
+}
|
|
|
+
|
|
|
+#[test]
|
|
|
+fn test_language_from_extension() {
|
|
|
+ use codebase_summarizer::models::Language;
|
|
|
+
|
|
|
+ assert_eq!(Language::from_extension("go"), Language::Go);
|
|
|
+ assert_eq!(Language::from_extension("rs"), Language::Rust);
|
|
|
+ assert_eq!(Language::from_extension("py"), Language::Python);
|
|
|
+ assert_eq!(Language::from_extension("dart"), Language::Dart);
|
|
|
+ assert_eq!(Language::from_extension("ts"), Language::TypeScript);
|
|
|
+ assert_eq!(Language::from_extension("r"), Language::R);
|
|
|
+ assert_eq!(Language::from_extension("R"), Language::R);
|
|
|
+ assert_eq!(Language::from_extension("java"), Language::Java);
|
|
|
+ assert_eq!(Language::from_extension("c"), Language::C);
|
|
|
+ assert_eq!(Language::from_extension("cpp"), Language::Cpp);
|
|
|
+ assert_eq!(Language::from_extension("rb"), Language::Ruby);
|
|
|
+ assert_eq!(Language::from_extension("php"), Language::Php);
|
|
|
+ assert_eq!(Language::from_extension("swift"), Language::Swift);
|
|
|
+ assert_eq!(Language::from_extension("kt"), Language::Kotlin);
|
|
|
+ assert_eq!(Language::from_extension("unknown"), Language::Unknown);
|
|
|
+}
|