mod common;
use assert_cmd::prelude::*;
use common::dircat_cmd;
use predicates::prelude::*;
use std::fs;
use tempfile::tempdir;
#[test]
fn test_path_regex_filter() -> Result<(), Box<dyn std::error::Error>> {
let temp = tempdir()?;
let src_dir = temp.path().join("src");
let test_dir = temp.path().join("tests");
fs::create_dir_all(&src_dir)?;
fs::create_dir_all(&test_dir)?;
let main_content = "Main";
let lib_content = "Lib";
let test_content = "Test";
let readme_content = "Readme";
fs::write(src_dir.join("main.rs"), main_content)?;
fs::write(src_dir.join("lib.rs"), lib_content)?;
fs::write(test_dir.join("integration.rs"), test_content)?;
fs::write(temp.path().join("README.md"), readme_content)?;
dircat_cmd()
.arg("-r")
.arg(r"^src/.*\.rs$") .current_dir(temp.path())
.assert()
.success()
.stdout(predicate::str::contains("## File: src/main.rs")) .stdout(predicate::str::contains(main_content)) .stdout(predicate::str::contains("## File: src/lib.rs")) .stdout(predicate::str::contains(lib_content)) .stdout(predicate::str::contains("## File: tests/integration.rs").not()) .stdout(predicate::str::contains(test_content).not()) .stdout(predicate::str::contains("## File: README.md").not()) .stdout(predicate::str::contains(readme_content).not());
temp.close()?;
Ok(())
}
#[test]
fn test_filename_regex_filter() -> Result<(), Box<dyn std::error::Error>> {
let temp = tempdir()?;
let src_dir = temp.path().join("src");
fs::create_dir_all(&src_dir)?;
let main_content = "Main";
let lib_content = "Lib";
let config_content = "Config";
let cargo_content = "Cargo";
fs::write(src_dir.join("main.rs"), main_content)?;
fs::write(src_dir.join("lib.rs"), lib_content)?;
fs::write(temp.path().join("config.toml"), config_content)?;
fs::write(temp.path().join("Cargo.toml"), cargo_content)?;
dircat_cmd()
.arg("-d")
.arg(r"\.toml$") .current_dir(temp.path())
.assert()
.success()
.stdout(predicate::str::contains("## File: config.toml")) .stdout(predicate::str::contains(config_content)) .stdout(predicate::str::contains("## File: Cargo.toml")) .stdout(predicate::str::contains(cargo_content)) .stdout(predicate::str::contains("## File: src/main.rs").not()) .stdout(predicate::str::contains(main_content).not()) .stdout(predicate::str::contains("## File: src/lib.rs").not()) .stdout(predicate::str::contains(lib_content).not());
temp.close()?;
Ok(())
}
#[test]
fn test_path_and_filename_regex_filters() -> Result<(), Box<dyn std::error::Error>> {
let temp = tempdir()?;
let src_dir = temp.path().join("src");
let test_dir = temp.path().join("tests");
fs::create_dir_all(&src_dir)?;
fs::create_dir_all(&test_dir)?;
let main_content = "Main";
let src_config = "SrcConfig";
let test_config = "TestConfig";
let cargo_content = "Cargo";
fs::write(src_dir.join("main.rs"), main_content)?;
fs::write(src_dir.join("config.toml"), src_config)?;
fs::write(test_dir.join("test_config.toml"), test_config)?;
fs::write(temp.path().join("Cargo.toml"), cargo_content)?;
dircat_cmd()
.arg("-r")
.arg(r"^src/") .arg("-d")
.arg(r"\.toml$") .current_dir(temp.path())
.assert()
.success()
.stdout(predicate::str::contains("## File: src/config.toml")) .stdout(predicate::str::contains(src_config)) .stdout(predicate::str::contains("## File: src/main.rs").not()) .stdout(predicate::str::contains("## File: tests/test_config.toml").not()) .stdout(predicate::str::contains("## File: Cargo.toml").not());
temp.close()?;
Ok(())
}
#[test]
fn test_path_regex_windows_separators() -> Result<(), Box<dyn std::error::Error>> {
let temp = tempdir()?;
let src_dir = temp.path().join("src");
let data_dir = temp.path().join("data");
fs::create_dir_all(&src_dir)?;
fs::create_dir_all(&data_dir)?;
let main_content = "Main";
let data_content = "Data";
fs::write(src_dir.join("main.rs"), main_content)?;
fs::write(data_dir.join("config.txt"), data_content)?;
dircat_cmd()
.arg("-r")
.arg("^src/") .current_dir(temp.path())
.assert()
.success()
.stdout(predicate::str::contains("## File: src/main.rs")) .stdout(predicate::str::contains(main_content)) .stdout(predicate::str::contains("## File: data/config.txt").not()) .stdout(predicate::str::contains(data_content).not());
temp.close()?;
Ok(())
}