use code2prompt_core::path::{EntryMetadata, FileEntry};
use code2prompt_core::sort::{FileSortMethod, sort_files, sort_tree};
#[cfg(test)]
mod tests {
use super::*;
use termtree::Tree;
#[test]
fn test_sort_files_name_asc() {
let mut files = vec![
FileEntry {
path: "zeta.txt".to_string(),
extension: "txt".to_string(),
code: String::new(),
token_count: 0,
metadata: EntryMetadata {
is_dir: false,
is_symlink: false,
},
mod_time: Some(100),
},
FileEntry {
path: "alpha.txt".to_string(),
extension: "txt".to_string(),
code: String::new(),
token_count: 0,
metadata: EntryMetadata {
is_dir: false,
is_symlink: false,
},
mod_time: Some(200),
},
FileEntry {
path: "beta.txt".to_string(),
extension: "txt".to_string(),
code: String::new(),
token_count: 0,
metadata: EntryMetadata {
is_dir: false,
is_symlink: false,
},
mod_time: Some(150),
},
];
sort_files(&mut files, Some(FileSortMethod::NameAsc));
let expected = vec!["alpha.txt", "beta.txt", "zeta.txt"];
let result: Vec<String> = files.iter().map(|f| f.path.clone()).collect();
assert_eq!(result, expected);
}
#[test]
fn test_sort_files_name_desc() {
let mut files = vec![
FileEntry {
path: "alpha.txt".to_string(),
extension: "txt".to_string(),
code: String::new(),
token_count: 0,
metadata: EntryMetadata {
is_dir: false,
is_symlink: false,
},
mod_time: Some(100),
},
FileEntry {
path: "zeta.txt".to_string(),
extension: "txt".to_string(),
code: String::new(),
token_count: 0,
metadata: EntryMetadata {
is_dir: false,
is_symlink: false,
},
mod_time: Some(200),
},
FileEntry {
path: "beta.txt".to_string(),
extension: "txt".to_string(),
code: String::new(),
token_count: 0,
metadata: EntryMetadata {
is_dir: false,
is_symlink: false,
},
mod_time: Some(150),
},
];
sort_files(&mut files, Some(FileSortMethod::NameDesc));
let expected = vec!["zeta.txt", "beta.txt", "alpha.txt"];
let result: Vec<String> = files.iter().map(|f| f.path.clone()).collect();
assert_eq!(result, expected);
}
#[test]
fn test_sort_files_date_asc() {
let mut files = vec![
FileEntry {
path: "file1.txt".to_string(),
extension: "txt".to_string(),
code: String::new(),
token_count: 0,
metadata: EntryMetadata {
is_dir: false,
is_symlink: false,
},
mod_time: Some(300),
},
FileEntry {
path: "file2.txt".to_string(),
extension: "txt".to_string(),
code: String::new(),
token_count: 0,
metadata: EntryMetadata {
is_dir: false,
is_symlink: false,
},
mod_time: Some(100),
},
FileEntry {
path: "file3.txt".to_string(),
extension: "txt".to_string(),
code: String::new(),
token_count: 0,
metadata: EntryMetadata {
is_dir: false,
is_symlink: false,
},
mod_time: Some(200),
},
];
sort_files(&mut files, Some(FileSortMethod::DateAsc));
let expected = vec!["file2.txt", "file3.txt", "file1.txt"];
let result: Vec<String> = files.iter().map(|f| f.path.clone()).collect();
assert_eq!(result, expected);
}
#[test]
fn test_sort_files_date_desc() {
let mut files = vec![
FileEntry {
path: "file1.txt".to_string(),
extension: "txt".to_string(),
code: String::new(),
token_count: 0,
metadata: EntryMetadata {
is_dir: false,
is_symlink: false,
},
mod_time: Some(300),
},
FileEntry {
path: "file2.txt".to_string(),
extension: "txt".to_string(),
code: String::new(),
token_count: 0,
metadata: EntryMetadata {
is_dir: false,
is_symlink: false,
},
mod_time: Some(100),
},
FileEntry {
path: "file3.txt".to_string(),
extension: "txt".to_string(),
code: String::new(),
token_count: 0,
metadata: EntryMetadata {
is_dir: false,
is_symlink: false,
},
mod_time: Some(200),
},
];
sort_files(&mut files, Some(FileSortMethod::DateDesc));
let expected = vec!["file1.txt", "file3.txt", "file2.txt"];
let result: Vec<String> = files.iter().map(|f| f.path.clone()).collect();
assert_eq!(result, expected);
}
#[test]
fn test_sort_files_none() {
let original_paths = vec!["zeta.txt", "alpha.txt", "beta.txt"];
let mut files: Vec<FileEntry> = original_paths
.iter()
.enumerate()
.map(|(i, path)| FileEntry {
path: path.to_string(),
extension: "txt".to_string(),
code: String::new(),
token_count: 0,
metadata: EntryMetadata {
is_dir: false,
is_symlink: false,
},
mod_time: Some((i as u64 + 1) * 100),
})
.collect();
sort_files(&mut files, None);
let result: Vec<String> = files.iter().map(|f| f.path.clone()).collect();
assert_eq!(result, original_paths);
}
#[test]
fn test_sort_tree_name_asc() {
let mut tree = Tree::new("root".to_string());
tree.leaves.push(Tree::new("zeta".to_string()));
tree.leaves.push(Tree::new("alpha".to_string()));
tree.leaves.push(Tree::new("beta".to_string()));
sort_tree(&mut tree, Some(FileSortMethod::NameAsc));
let sorted: Vec<String> = tree.leaves.iter().map(|node| node.root.clone()).collect();
let expected = vec!["alpha".to_string(), "beta".to_string(), "zeta".to_string()];
assert_eq!(sorted, expected);
}
#[test]
fn test_sort_tree_name_desc() {
let mut tree = Tree::new("root".to_string());
tree.leaves.push(Tree::new("alpha".to_string()));
tree.leaves.push(Tree::new("zeta".to_string()));
tree.leaves.push(Tree::new("beta".to_string()));
sort_tree(&mut tree, Some(FileSortMethod::NameDesc));
let sorted: Vec<String> = tree.leaves.iter().map(|node| node.root.clone()).collect();
let expected = vec!["zeta".to_string(), "beta".to_string(), "alpha".to_string()];
assert_eq!(sorted, expected);
}
#[test]
fn test_sort_tree_date_asc_falls_back_to_name() {
let mut tree = Tree::new("root".to_string());
tree.leaves.push(Tree::new("delta".to_string()));
tree.leaves.push(Tree::new("charlie".to_string()));
tree.leaves.push(Tree::new("bravo".to_string()));
sort_tree(&mut tree, Some(FileSortMethod::DateAsc));
let sorted: Vec<String> = tree.leaves.iter().map(|node| node.root.clone()).collect();
let expected = vec![
"bravo".to_string(),
"charlie".to_string(),
"delta".to_string(),
];
assert_eq!(sorted, expected);
}
#[test]
fn test_sort_tree_none() {
let mut tree = Tree::new("root".to_string());
tree.leaves.push(Tree::new("zeta".to_string()));
tree.leaves.push(Tree::new("alpha".to_string()));
tree.leaves.push(Tree::new("beta".to_string()));
let original: Vec<String> = tree.leaves.iter().map(|node| node.root.clone()).collect();
sort_tree(&mut tree, None);
let after: Vec<String> = tree.leaves.iter().map(|node| node.root.clone()).collect();
assert_eq!(original, after);
}
}