Add error types and core image types: ImageFormat, ImageSource, Dimensions, QualityPreset

This commit is contained in:
2026-03-06 01:37:39 +02:00
parent dab049b0d3
commit 3e176e3d65
4 changed files with 303 additions and 2 deletions

View File

@@ -0,0 +1,46 @@
use pixstrip_core::error::PixstripError;
#[test]
fn error_display_image_load() {
let err = PixstripError::ImageLoad {
path: "/tmp/bad.jpg".into(),
reason: "corrupt header".into(),
};
let msg = err.to_string();
assert!(msg.contains("/tmp/bad.jpg"));
assert!(msg.contains("corrupt header"));
}
#[test]
fn error_display_unsupported_format() {
let err = PixstripError::UnsupportedFormat {
format: "bmp".into(),
};
assert!(err.to_string().contains("bmp"));
}
#[test]
fn error_display_io() {
let io_err = std::io::Error::new(std::io::ErrorKind::NotFound, "file missing");
let err = PixstripError::Io(io_err);
assert!(err.to_string().contains("file missing"));
}
#[test]
fn error_display_output_exists() {
let err = PixstripError::OutputExists {
path: "/tmp/out.jpg".into(),
};
assert!(err.to_string().contains("/tmp/out.jpg"));
}
#[test]
fn error_display_processing() {
let err = PixstripError::Processing {
operation: "resize".into(),
reason: "invalid dimensions".into(),
};
let msg = err.to_string();
assert!(msg.contains("resize"));
assert!(msg.contains("invalid dimensions"));
}

View File

@@ -0,0 +1,83 @@
use pixstrip_core::types::*;
use std::path::PathBuf;
#[test]
fn image_format_from_extension() {
assert_eq!(ImageFormat::from_extension("jpg"), Some(ImageFormat::Jpeg));
assert_eq!(ImageFormat::from_extension("JPEG"), Some(ImageFormat::Jpeg));
assert_eq!(ImageFormat::from_extension("png"), Some(ImageFormat::Png));
assert_eq!(ImageFormat::from_extension("webp"), Some(ImageFormat::WebP));
assert_eq!(ImageFormat::from_extension("avif"), Some(ImageFormat::Avif));
assert_eq!(ImageFormat::from_extension("gif"), Some(ImageFormat::Gif));
assert_eq!(ImageFormat::from_extension("tiff"), Some(ImageFormat::Tiff));
assert_eq!(ImageFormat::from_extension("tif"), Some(ImageFormat::Tiff));
assert_eq!(ImageFormat::from_extension("xyz"), None);
}
#[test]
fn image_format_extension_string() {
assert_eq!(ImageFormat::Jpeg.extension(), "jpg");
assert_eq!(ImageFormat::Png.extension(), "png");
assert_eq!(ImageFormat::WebP.extension(), "webp");
assert_eq!(ImageFormat::Avif.extension(), "avif");
}
#[test]
fn image_source_from_path() {
let source = ImageSource::from_path("/tmp/photo.jpg");
assert_eq!(source.path, PathBuf::from("/tmp/photo.jpg"));
assert_eq!(source.original_format, Some(ImageFormat::Jpeg));
}
#[test]
fn image_source_unknown_format() {
let source = ImageSource::from_path("/tmp/file.xyz");
assert_eq!(source.original_format, None);
}
#[test]
fn dimensions_display() {
let dims = Dimensions { width: 1920, height: 1080 };
assert_eq!(dims.to_string(), "1920x1080");
}
#[test]
fn dimensions_aspect_ratio() {
let dims = Dimensions { width: 1920, height: 1080 };
let ratio = dims.aspect_ratio();
assert!((ratio - 16.0 / 9.0).abs() < 0.01);
}
#[test]
fn dimensions_fit_within() {
let original = Dimensions { width: 4000, height: 3000 };
let max_box = Dimensions { width: 1200, height: 1200 };
let fitted = original.fit_within(max_box, false);
assert_eq!(fitted.width, 1200);
assert_eq!(fitted.height, 900);
}
#[test]
fn dimensions_fit_within_no_upscale() {
let original = Dimensions { width: 800, height: 600 };
let max_box = Dimensions { width: 1200, height: 1200 };
let fitted = original.fit_within(max_box, false);
assert_eq!(fitted.width, 800);
assert_eq!(fitted.height, 600);
}
#[test]
fn dimensions_fit_within_allow_upscale() {
let original = Dimensions { width: 800, height: 600 };
let max_box = Dimensions { width: 1200, height: 1200 };
let fitted = original.fit_within(max_box, true);
assert_eq!(fitted.width, 1200);
assert_eq!(fitted.height, 900);
}
#[test]
fn quality_preset_values() {
assert!(QualityPreset::Maximum.jpeg_quality() > QualityPreset::High.jpeg_quality());
assert!(QualityPreset::High.jpeg_quality() > QualityPreset::Medium.jpeg_quality());
assert!(QualityPreset::Medium.jpeg_quality() > QualityPreset::Low.jpeg_quality());
}