mod common;
use assert_cmd::cargo;
use assert_cmd::prelude::*;
use common::{
calculate_psnr, calculate_similarity_percentage, ensure_output_dir, overlay_on_background,
save_test_images,
};
use std::process::Command;
use tempfile::TempDir;
#[test]
fn test_square_gradient_stroke_non_strict_no_fg() {
ensure_output_dir();
let temp_dir = TempDir::new().unwrap();
let output_path = temp_dir.path().join("output.png");
Command::new(cargo::cargo_bin!("bgone"))
.args([
"tests/inputs/square-gradient-stroke.png",
output_path.to_str().unwrap(),
"--bg",
"14191e", ])
.assert()
.success();
let original = image::open("tests/inputs/square-gradient-stroke.png").unwrap();
let processed = image::open(&output_path).unwrap();
let background_color = [0x14, 0x19, 0x1e]; let reconstructed = overlay_on_background(&processed, background_color);
save_test_images(
"square_gradient_stroke",
"non_strict_no_fg",
&processed,
&reconstructed,
);
let similarity = calculate_similarity_percentage(&original, &reconstructed);
let psnr = calculate_psnr(&original, &reconstructed);
println!(
"Non-strict (no fg) - Similarity: {:.2}%, PSNR: {:.2} dB",
similarity, psnr
);
assert!(
similarity > 99.0,
"Similarity {:.2}% is too low",
similarity
);
}
#[test]
fn test_square_gradient_stroke_non_strict_with_fg() {
ensure_output_dir();
let temp_dir = TempDir::new().unwrap();
let output_path = temp_dir.path().join("output.png");
Command::new(cargo::cargo_bin!("bgone"))
.args([
"tests/inputs/square-gradient-stroke.png",
output_path.to_str().unwrap(),
"--fg",
"00ffff", "--fg",
"ff00ff", "--fg",
"a7b511", "--bg",
"14191e", ])
.assert()
.success();
let original = image::open("tests/inputs/square-gradient-stroke.png").unwrap();
let processed = image::open(&output_path).unwrap();
let background_color = [0x14, 0x19, 0x1e]; let reconstructed = overlay_on_background(&processed, background_color);
save_test_images(
"square_gradient_stroke",
"non_strict_with_fg",
&processed,
&reconstructed,
);
let similarity = calculate_similarity_percentage(&original, &reconstructed);
let psnr = calculate_psnr(&original, &reconstructed);
println!(
"Non-strict (with fg) - Similarity: {:.2}%, PSNR: {:.2} dB",
similarity, psnr
);
assert!(
similarity > 99.0,
"Similarity {:.2}% is too low",
similarity
);
}
#[test]
fn test_square_gradient_stroke_strict_known_colors() {
ensure_output_dir();
let temp_dir = TempDir::new().unwrap();
let output_path = temp_dir.path().join("output.png");
Command::new(cargo::cargo_bin!("bgone"))
.args([
"tests/inputs/square-gradient-stroke.png",
output_path.to_str().unwrap(),
"--strict",
"--fg",
"00ffff", "--fg",
"ff00ff", "--fg",
"a7b511", "--bg",
"14191e", ])
.assert()
.success();
let original = image::open("tests/inputs/square-gradient-stroke.png").unwrap();
let processed = image::open(&output_path).unwrap();
let background_color = [0x14, 0x19, 0x1e]; let reconstructed = overlay_on_background(&processed, background_color);
save_test_images(
"square_gradient_stroke",
"strict_known",
&processed,
&reconstructed,
);
let similarity = calculate_similarity_percentage(&original, &reconstructed);
let psnr = calculate_psnr(&original, &reconstructed);
println!(
"Strict (known colors) - Similarity: {:.2}%, PSNR: {:.2} dB",
similarity, psnr
);
assert!(
similarity > 99.0,
"Similarity {:.2}% is too low",
similarity
);
}
#[test]
fn test_square_gradient_stroke_strict_auto_colors() {
ensure_output_dir();
let temp_dir = TempDir::new().unwrap();
let output_path = temp_dir.path().join("output.png");
Command::new(cargo::cargo_bin!("bgone"))
.args([
"tests/inputs/square-gradient-stroke.png",
output_path.to_str().unwrap(),
"--strict",
"--fg",
"auto",
"--fg",
"auto",
"--fg",
"auto",
"--bg",
"14191e", ])
.assert()
.success();
let original = image::open("tests/inputs/square-gradient-stroke.png").unwrap();
let processed = image::open(&output_path).unwrap();
let background_color = [0x14, 0x19, 0x1e]; let reconstructed = overlay_on_background(&processed, background_color);
save_test_images(
"square_gradient_stroke",
"strict_auto",
&processed,
&reconstructed,
);
let similarity = calculate_similarity_percentage(&original, &reconstructed);
let psnr = calculate_psnr(&original, &reconstructed);
println!(
"Strict (auto colors) - Similarity: {:.2}%, PSNR: {:.2} dB",
similarity, psnr
);
assert!(
similarity > 99.0,
"Similarity {:.2}% is too low",
similarity
);
}
#[test]
fn test_square_gradient_stroke_non_strict_with_fg_high_threshold() {
ensure_output_dir();
let temp_dir = TempDir::new().unwrap();
let output_path = temp_dir.path().join("output.png");
Command::new(cargo::cargo_bin!("bgone"))
.args([
"tests/inputs/square-gradient-stroke.png",
output_path.to_str().unwrap(),
"--fg",
"00ffff", "--fg",
"ff00ff", "--fg",
"a7b511", "--bg",
"14191e", "--fg-threshold",
"0.5", ])
.assert()
.success();
let original = image::open("tests/inputs/square-gradient-stroke.png").unwrap();
let processed = image::open(&output_path).unwrap();
let background_color = [0x14, 0x19, 0x1e]; let reconstructed = overlay_on_background(&processed, background_color);
save_test_images(
"square_gradient_stroke",
"non_strict_with_fg_high_threshold",
&processed,
&reconstructed,
);
let similarity = calculate_similarity_percentage(&original, &reconstructed);
let psnr = calculate_psnr(&original, &reconstructed);
println!(
"Non-strict (high threshold) - Similarity: {:.2}%, PSNR: {:.2} dB",
similarity, psnr
);
assert!(
similarity > 99.0,
"Similarity {:.2}% is too low",
similarity
);
}