use lineguard::checker::check_file;
use lineguard::cli::CliArgs;
use lineguard::config::Config;
use lineguard::discovery::discover_files;
use std::sync::Arc;
use tempfile::TempDir;
#[test]
fn test_unicode_file_names() {
let temp_dir = TempDir::new().unwrap();
let unicode_files = vec![
"测试文件.txt", "тест.txt", "テスト.txt", "파일.txt", "αρχείο.txt", "ملف.txt", "fichier_été.txt", "arquivo_ção.txt", "datei_äöü.txt", "emoji_🚀_file.txt", ];
for filename in &unicode_files {
let file_path = temp_dir.path().join(filename);
std::fs::write(&file_path, "content\n").unwrap();
}
let args = CliArgs {
files: vec![temp_dir.path().to_string_lossy().to_string()],
stdin: false,
recursive: false,
format: lineguard::cli::OutputFormat::Human,
quiet: false,
verbose: false,
no_color: false,
config: None,
ignore: vec![],
extensions: None,
no_newline_check: false,
no_trailing_space: false,
fix: false,
dry_run: false,
from: None,
to: None,
no_hidden: false,
};
let config = Config::default();
let result = discover_files(&args, &config).unwrap();
assert_eq!(result.files.len(), unicode_files.len());
let config_arc = Arc::new(config);
for file_path in result.files {
let check_result = check_file(&file_path, &config_arc);
assert!(check_result.error.is_none());
assert!(check_result.issues.is_empty());
}
}
#[test]
fn test_unicode_directory_names() {
let temp_dir = TempDir::new().unwrap();
let unicode_dirs = vec![
"目录", "папка", "フォルダ", "폴더", "dossier_été", ];
for dirname in &unicode_dirs {
let dir_path = temp_dir.path().join(dirname);
std::fs::create_dir(&dir_path).unwrap();
let file_path = dir_path.join("test.txt");
std::fs::write(&file_path, "content\n").unwrap();
}
let args = CliArgs {
files: vec![temp_dir.path().to_string_lossy().to_string()],
stdin: false,
recursive: true,
format: lineguard::cli::OutputFormat::Human,
quiet: false,
verbose: false,
no_color: false,
config: None,
ignore: vec![],
extensions: None,
no_newline_check: false,
no_trailing_space: false,
fix: false,
dry_run: false,
from: None,
to: None,
no_hidden: false,
};
let config = Config::default();
let result = discover_files(&args, &config).unwrap();
assert_eq!(result.files.len(), unicode_dirs.len());
}
#[test]
fn test_unicode_glob_patterns() {
let temp_dir = TempDir::new().unwrap();
let files = vec!["测试1.txt", "测试2.txt", "test3.txt", "тест4.txt"];
for filename in &files {
let file_path = temp_dir.path().join(filename);
std::fs::write(&file_path, "content\n").unwrap();
}
let glob_pattern = format!("{}/测试*.txt", temp_dir.path().display());
let args = CliArgs {
files: vec![glob_pattern],
stdin: false,
recursive: false,
format: lineguard::cli::OutputFormat::Human,
quiet: false,
verbose: false,
no_color: false,
config: None,
ignore: vec![],
extensions: None,
no_newline_check: false,
no_trailing_space: false,
fix: false,
dry_run: false,
from: None,
to: None,
no_hidden: false,
};
let config = Config::default();
let result = discover_files(&args, &config).unwrap();
assert_eq!(result.files.len(), 2);
assert!(
result
.files
.iter()
.all(|p| p.file_name().unwrap().to_string_lossy().starts_with("测试"))
);
}
#[test]
fn test_unicode_file_with_issues() {
let temp_dir = TempDir::new().unwrap();
let file_path = temp_dir.path().join("файл_с_проблемами.txt");
std::fs::write(&file_path, "content with trailing space ").unwrap();
let config = Arc::new(Config::default());
let check_result = check_file(&file_path, &config);
assert!(check_result.error.is_none());
assert_eq!(check_result.issues.len(), 2);
assert_eq!(check_result.file_path, file_path);
}
#[test]
fn test_unicode_in_ignore_patterns() {
let temp_dir = TempDir::new().unwrap();
let files = vec![
"test.txt",
"忽略.txt", "keep.txt",
];
for filename in &files {
let file_path = temp_dir.path().join(filename);
std::fs::write(&file_path, "content\n").unwrap();
}
let args = CliArgs {
files: vec![temp_dir.path().to_string_lossy().to_string()],
stdin: false,
recursive: false,
format: lineguard::cli::OutputFormat::Human,
quiet: false,
verbose: false,
no_color: false,
config: None,
ignore: vec!["**/忽略.txt".to_string()],
extensions: None,
no_newline_check: false,
no_trailing_space: false,
fix: false,
dry_run: false,
from: None,
to: None,
no_hidden: false,
};
let config = Config::default();
let result = discover_files(&args, &config).unwrap();
assert_eq!(result.files.len(), 2);
assert!(
!result
.files
.iter()
.any(|p| p.file_name().unwrap().to_string_lossy().contains("忽略"))
);
}
#[test]
fn test_mixed_unicode_and_ascii_paths() {
let temp_dir = TempDir::new().unwrap();
let structure = vec![
("normal_dir", vec!["file1.txt", "файл2.txt"]),
("目录_test", vec!["test.txt", "测试.txt"]),
];
for (dir_name, files) in structure {
let dir_path = temp_dir.path().join(dir_name);
std::fs::create_dir(&dir_path).unwrap();
for file_name in files {
let file_path = dir_path.join(file_name);
std::fs::write(&file_path, "content\n").unwrap();
}
}
let args = CliArgs {
files: vec![temp_dir.path().to_string_lossy().to_string()],
stdin: false,
recursive: true,
format: lineguard::cli::OutputFormat::Human,
quiet: false,
verbose: false,
no_color: false,
config: None,
ignore: vec![],
extensions: None,
no_newline_check: false,
no_trailing_space: false,
fix: false,
dry_run: false,
from: None,
to: None,
no_hidden: false,
};
let config = Config::default();
let result = discover_files(&args, &config).unwrap();
assert_eq!(result.files.len(), 4);
let config_arc = Arc::new(config);
for file_path in result.files {
let check_result = check_file(&file_path, &config_arc);
assert!(check_result.error.is_none());
}
}