Metadata: JPEG EXIF stripping (APP1 segment removal).
Watermark: 9-position grid calculation with margin support.
Rename: template parser with {name}, {ext}, {counter:N}, {width}, {height}
and collision resolution with auto-suffix.
Phase 4 complete - 79 tests passing, zero clippy warnings.
96 lines
2.1 KiB
Rust
96 lines
2.1 KiB
Rust
use pixstrip_core::operations::rename::{apply_template, resolve_collision};
|
|
|
|
#[test]
|
|
fn template_basic_variables() {
|
|
let result = apply_template(
|
|
"{name}_{counter:3}.{ext}",
|
|
"sunset",
|
|
"jpg",
|
|
1,
|
|
None,
|
|
);
|
|
assert_eq!(result, "sunset_001.jpg");
|
|
}
|
|
|
|
#[test]
|
|
fn template_with_prefix() {
|
|
let result = apply_template(
|
|
"blog_{name}.{ext}",
|
|
"photo",
|
|
"webp",
|
|
1,
|
|
None,
|
|
);
|
|
assert_eq!(result, "blog_photo.webp");
|
|
}
|
|
|
|
#[test]
|
|
fn template_counter_padding() {
|
|
let result = apply_template(
|
|
"{name}_{counter:4}.{ext}",
|
|
"img",
|
|
"png",
|
|
42,
|
|
None,
|
|
);
|
|
assert_eq!(result, "img_0042.png");
|
|
}
|
|
|
|
#[test]
|
|
fn template_counter_no_padding() {
|
|
let result = apply_template(
|
|
"{name}_{counter}.{ext}",
|
|
"img",
|
|
"png",
|
|
42,
|
|
None,
|
|
);
|
|
assert_eq!(result, "img_42.png");
|
|
}
|
|
|
|
#[test]
|
|
fn template_width_height() {
|
|
let result = apply_template(
|
|
"{name}_{width}x{height}.{ext}",
|
|
"photo",
|
|
"jpg",
|
|
1,
|
|
Some((1920, 1080)),
|
|
);
|
|
assert_eq!(result, "photo_1920x1080.jpg");
|
|
}
|
|
|
|
#[test]
|
|
fn collision_adds_suffix() {
|
|
let dir = tempfile::tempdir().unwrap();
|
|
let base = dir.path().join("photo.jpg");
|
|
std::fs::write(&base, b"exists").unwrap();
|
|
|
|
let resolved = resolve_collision(&base);
|
|
assert_eq!(
|
|
resolved.file_name().unwrap().to_str().unwrap(),
|
|
"photo_1.jpg"
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn collision_increments() {
|
|
let dir = tempfile::tempdir().unwrap();
|
|
std::fs::write(dir.path().join("photo.jpg"), b"exists").unwrap();
|
|
std::fs::write(dir.path().join("photo_1.jpg"), b"exists").unwrap();
|
|
|
|
let resolved = resolve_collision(&dir.path().join("photo.jpg"));
|
|
assert_eq!(
|
|
resolved.file_name().unwrap().to_str().unwrap(),
|
|
"photo_2.jpg"
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn no_collision_returns_same() {
|
|
let dir = tempfile::tempdir().unwrap();
|
|
let path = dir.path().join("unique.jpg");
|
|
let resolved = resolve_collision(&path);
|
|
assert_eq!(resolved, path);
|
|
}
|