84 lines
2.4 KiB
Rust
84 lines
2.4 KiB
Rust
extern crate libtest_mimic;
|
|
|
|
use libtest_mimic::{Arguments, Trial, Failed};
|
|
|
|
use std::{
|
|
env,
|
|
error::Error,
|
|
ffi::OsStr,
|
|
fs,
|
|
path::Path,
|
|
};
|
|
|
|
|
|
fn main() -> Result<(), Box<dyn Error>> {
|
|
let args = Arguments::from_args();
|
|
let tests = collect_tests()?;
|
|
libtest_mimic::run(&args, tests).exit();
|
|
}
|
|
|
|
/// Creates one test for each `.rs` file in the current directory or
|
|
/// sub-directories of the current directory.
|
|
fn collect_tests() -> Result<Vec<Trial>, Box<dyn Error>> {
|
|
fn visit_dir(path: &Path, tests: &mut Vec<Trial>) -> Result<(), Box<dyn Error>> {
|
|
for entry in fs::read_dir(path)? {
|
|
let entry = entry?;
|
|
let file_type = entry.file_type()?;
|
|
|
|
// Handle files
|
|
let path = entry.path();
|
|
if file_type.is_file() {
|
|
if path.extension() == Some(OsStr::new("rs")) {
|
|
let name = path
|
|
.strip_prefix(env::current_dir()?)?
|
|
.display()
|
|
.to_string();
|
|
|
|
let test = Trial::test(name, move || check_file(&path))
|
|
.with_kind("tidy");
|
|
tests.push(test);
|
|
}
|
|
} else if file_type.is_dir() {
|
|
// Handle directories
|
|
visit_dir(&path, tests)?;
|
|
}
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
|
|
// We recursively look for `.rs` files, starting from the current
|
|
// directory.
|
|
let mut tests = Vec::new();
|
|
let current_dir = env::current_dir()?;
|
|
visit_dir(¤t_dir, &mut tests)?;
|
|
|
|
Ok(tests)
|
|
}
|
|
|
|
/// Performs a couple of tidy tests.
|
|
fn check_file(path: &Path) -> Result<(), Failed> {
|
|
let content = fs::read(path).map_err(|e| format!("Cannot read file: {e}"))?;
|
|
|
|
// Check that the file is valid UTF-8
|
|
let content = String::from_utf8(content)
|
|
.map_err(|_| "The file's contents are not a valid UTF-8 string!")?;
|
|
|
|
// Check for `\r`: we only want `\n` line breaks!
|
|
if content.contains('\r') {
|
|
return Err("Contains '\\r' chars. Please use ' \\n' line breaks only!".into());
|
|
}
|
|
|
|
// Check for tab characters `\t`
|
|
if content.contains('\t') {
|
|
return Err("Contains tab characters ('\\t'). Indent with four spaces!".into());
|
|
}
|
|
|
|
// Check for too long lines
|
|
if content.lines().any(|line| line.chars().count() > 100) {
|
|
return Err("Contains lines longer than 100 codepoints!".into());
|
|
}
|
|
|
|
Ok(())
|
|
}
|