use code2prompt_core::configuration::Code2PromptConfig;
use code2prompt_core::path::traverse_directory;
use std::fs;
use tempfile::TempDir;
fn create_test_directory_with_binary() -> TempDir {
let temp_dir = TempDir::new().unwrap();
let base_path = temp_dir.path();
fs::write(base_path.join("text.txt"), "This is a text file").unwrap();
fs::write(
base_path.join("code.rs"),
"fn main() { println!(\"Hello\"); }",
)
.unwrap();
fs::write(base_path.join("data.json"), r#"{"key": "value"}"#).unwrap();
let mut gb2312_data = b"GB2312 test: ".to_vec();
gb2312_data.extend_from_slice(&[0xC4, 0xE3, 0xBA, 0xC3]);
fs::write(base_path.join("chinese_gb2312.txt"), gb2312_data).unwrap();
let mut png_data = vec![0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A];
png_data.extend_from_slice(&[0x00, 0x00, 0x00, 0xFF, 0xFE]);
fs::write(base_path.join("image.png"), png_data).unwrap();
let binary_data: Vec<u8> = (0..100).map(|i| (i * 7) as u8).collect();
fs::write(base_path.join("binary.bin"), binary_data).unwrap();
let mut jpeg_data = vec![0xFF, 0xD8, 0xFF, 0xE0];
jpeg_data.extend_from_slice(&[0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00]);
fs::write(base_path.join("photo.jpg"), jpeg_data).unwrap();
let mut elf_data = vec![0x7F, b'E', b'L', b'F']; elf_data.extend_from_slice(&[0x02, 0x01, 0x01, 0x00]); elf_data.extend((0..50).map(|i| (i * 13) as u8)); fs::write(base_path.join("compiled.o"), elf_data).unwrap();
temp_dir
}
#[test]
fn test_binary_files_are_skipped() {
let temp_dir = create_test_directory_with_binary();
let config = Code2PromptConfig::builder()
.path(temp_dir.path().to_path_buf())
.build()
.unwrap();
let (_, files) = traverse_directory(&config, None).unwrap();
let file_paths: Vec<String> = files.iter().map(|f| f.path.clone()).collect();
assert!(file_paths.iter().any(|p| p.contains("text.txt")));
assert!(file_paths.iter().any(|p| p.contains("code.rs")));
assert!(file_paths.iter().any(|p| p.contains("data.json")));
assert!(file_paths.iter().any(|p| p.contains("chinese_gb2312.txt")));
assert!(!file_paths.iter().any(|p| p.contains("image.png")));
assert!(!file_paths.iter().any(|p| p.contains("binary.bin")));
assert!(!file_paths.iter().any(|p| p.contains("photo.jpg")));
assert!(!file_paths.iter().any(|p| p.contains("compiled.o")));
assert_eq!(files.len(), 4);
}
#[test]
fn test_empty_file_handling() {
let temp_dir = TempDir::new().unwrap();
let base_path = temp_dir.path();
fs::write(base_path.join("empty.txt"), "").unwrap();
let config = Code2PromptConfig::builder()
.path(base_path.to_path_buf())
.build()
.unwrap();
let (_, files) = traverse_directory(&config, None).unwrap();
assert_eq!(files.len(), 0);
}
#[test]
fn test_small_binary_file() {
let temp_dir = TempDir::new().unwrap();
let base_path = temp_dir.path();
let small_binary: Vec<u8> = vec![0x00, 0xFF, 0x00, 0xFF, 0xFE, 0xED];
fs::write(base_path.join("small.bin"), small_binary).unwrap();
let config = Code2PromptConfig::builder()
.path(base_path.to_path_buf())
.build()
.unwrap();
let (_, files) = traverse_directory(&config, None).unwrap();
assert_eq!(files.len(), 0);
}
#[test]
fn test_text_file_with_unicode() {
let temp_dir = TempDir::new().unwrap();
let base_path = temp_dir.path();
fs::write(
base_path.join("unicode.txt"),
"Hello 世界 🌍 Здравствуй мир",
)
.unwrap();
let config = Code2PromptConfig::builder()
.path(base_path.to_path_buf())
.build()
.unwrap();
let (_, files) = traverse_directory(&config, None).unwrap();
assert_eq!(files.len(), 1);
let file_path = &files[0].path;
assert!(file_path.contains("unicode.txt"));
}
#[test]
fn test_mixed_directory_structure() {
let temp_dir = TempDir::new().unwrap();
let base_path = temp_dir.path();
fs::create_dir(base_path.join("src")).unwrap();
fs::create_dir(base_path.join("assets")).unwrap();
fs::write(base_path.join("src/main.rs"), "fn main() {}").unwrap();
fs::write(base_path.join("src/lib.rs"), "pub mod test {}").unwrap();
let png_data = vec![0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A];
fs::write(base_path.join("assets/logo.png"), png_data).unwrap();
let config = Code2PromptConfig::builder()
.path(base_path.to_path_buf())
.build()
.unwrap();
let (_, files) = traverse_directory(&config, None).unwrap();
assert_eq!(files.len(), 2);
let file_paths: Vec<String> = files.iter().map(|f| f.path.clone()).collect();
assert!(file_paths.iter().any(|p| p.contains("main.rs")));
assert!(file_paths.iter().any(|p| p.contains("lib.rs")));
assert!(!file_paths.iter().any(|p| p.contains("logo.png")));
}
#[test]
fn test_large_text_file() {
let temp_dir = TempDir::new().unwrap();
let base_path = temp_dir.path();
let large_text = "Lorem ipsum dolor sit amet. ".repeat(1000); fs::write(base_path.join("large.txt"), &large_text).unwrap();
let config = Code2PromptConfig::builder()
.path(base_path.to_path_buf())
.build()
.unwrap();
let (_, files) = traverse_directory(&config, None).unwrap();
assert_eq!(files.len(), 1);
let code = &files[0].code;
assert!(code.contains(&large_text));
}
#[test]
fn test_pdf_detection() {
let temp_dir = TempDir::new().unwrap();
let base_path = temp_dir.path();
let pdf_header = b"%PDF-1.4\n";
fs::write(base_path.join("document.pdf"), pdf_header).unwrap();
let config = Code2PromptConfig::builder()
.path(base_path.to_path_buf())
.build()
.unwrap();
let (_, files) = traverse_directory(&config, None).unwrap();
assert_eq!(files.len(), 0);
}
#[test]
fn test_various_text_formats() {
let temp_dir = TempDir::new().unwrap();
let base_path = temp_dir.path();
fs::write(base_path.join("config.yaml"), "key: value\n").unwrap();
fs::write(base_path.join("data.xml"), "<root><item/></root>").unwrap();
fs::write(base_path.join("script.sh"), "#!/bin/bash\necho 'test'").unwrap();
fs::write(base_path.join("style.css"), "body { margin: 0; }").unwrap();
fs::write(base_path.join("page.html"), "<html><body></body></html>").unwrap();
let config = Code2PromptConfig::builder()
.path(base_path.to_path_buf())
.build()
.unwrap();
let (_, files) = traverse_directory(&config, None).unwrap();
assert_eq!(files.len(), 5);
}