Fix edge cases and consistency issues
This commit is contained in:
@@ -109,3 +109,137 @@ fn position_bottom_left() {
|
||||
assert_eq!(x, 10);
|
||||
assert_eq!(y, 1020);
|
||||
}
|
||||
|
||||
// --- Margin variation tests ---
|
||||
|
||||
#[test]
|
||||
fn margin_zero_top_left() {
|
||||
let (x, y) = calculate_position(
|
||||
WatermarkPosition::TopLeft,
|
||||
Dimensions { width: 1920, height: 1080 },
|
||||
Dimensions { width: 200, height: 50 },
|
||||
0,
|
||||
);
|
||||
assert_eq!(x, 0);
|
||||
assert_eq!(y, 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn margin_zero_bottom_right() {
|
||||
let (x, y) = calculate_position(
|
||||
WatermarkPosition::BottomRight,
|
||||
Dimensions { width: 1920, height: 1080 },
|
||||
Dimensions { width: 200, height: 50 },
|
||||
0,
|
||||
);
|
||||
assert_eq!(x, 1720); // 1920 - 200
|
||||
assert_eq!(y, 1030); // 1080 - 50
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn large_margin_top_left() {
|
||||
let (x, y) = calculate_position(
|
||||
WatermarkPosition::TopLeft,
|
||||
Dimensions { width: 1920, height: 1080 },
|
||||
Dimensions { width: 200, height: 50 },
|
||||
100,
|
||||
);
|
||||
assert_eq!(x, 100);
|
||||
assert_eq!(y, 100);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn large_margin_bottom_right() {
|
||||
let (x, y) = calculate_position(
|
||||
WatermarkPosition::BottomRight,
|
||||
Dimensions { width: 1920, height: 1080 },
|
||||
Dimensions { width: 200, height: 50 },
|
||||
100,
|
||||
);
|
||||
assert_eq!(x, 1620); // 1920 - 200 - 100
|
||||
assert_eq!(y, 930); // 1080 - 50 - 100
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn margin_does_not_affect_center() {
|
||||
let (x1, y1) = calculate_position(
|
||||
WatermarkPosition::Center,
|
||||
Dimensions { width: 1920, height: 1080 },
|
||||
Dimensions { width: 200, height: 50 },
|
||||
0,
|
||||
);
|
||||
let (x2, y2) = calculate_position(
|
||||
WatermarkPosition::Center,
|
||||
Dimensions { width: 1920, height: 1080 },
|
||||
Dimensions { width: 200, height: 50 },
|
||||
100,
|
||||
);
|
||||
assert_eq!(x1, x2);
|
||||
assert_eq!(y1, y2);
|
||||
}
|
||||
|
||||
// --- Edge case tests ---
|
||||
|
||||
#[test]
|
||||
fn watermark_larger_than_image() {
|
||||
// Watermark is bigger than the image - should not panic, saturating_sub clamps to 0
|
||||
let (x, y) = calculate_position(
|
||||
WatermarkPosition::BottomRight,
|
||||
Dimensions { width: 100, height: 100 },
|
||||
Dimensions { width: 200, height: 200 },
|
||||
10,
|
||||
);
|
||||
// (100 - 200 - 10) saturates to 0
|
||||
assert_eq!(x, 0);
|
||||
assert_eq!(y, 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn watermark_exact_image_size() {
|
||||
let (x, y) = calculate_position(
|
||||
WatermarkPosition::Center,
|
||||
Dimensions { width: 200, height: 100 },
|
||||
Dimensions { width: 200, height: 100 },
|
||||
0,
|
||||
);
|
||||
assert_eq!(x, 0);
|
||||
assert_eq!(y, 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn zero_size_image() {
|
||||
let (x, y) = calculate_position(
|
||||
WatermarkPosition::Center,
|
||||
Dimensions { width: 0, height: 0 },
|
||||
Dimensions { width: 200, height: 50 },
|
||||
10,
|
||||
);
|
||||
assert_eq!(x, 0);
|
||||
assert_eq!(y, 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn margin_exceeds_available_space() {
|
||||
// Margin is huge relative to image size
|
||||
let (x, y) = calculate_position(
|
||||
WatermarkPosition::BottomRight,
|
||||
Dimensions { width: 100, height: 100 },
|
||||
Dimensions { width: 50, height: 50 },
|
||||
200,
|
||||
);
|
||||
// saturating_sub: 100 - 50 - 200 = 0
|
||||
assert_eq!(x, 0);
|
||||
assert_eq!(y, 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn one_pixel_image() {
|
||||
let (x, y) = calculate_position(
|
||||
WatermarkPosition::TopLeft,
|
||||
Dimensions { width: 1, height: 1 },
|
||||
Dimensions { width: 1, height: 1 },
|
||||
0,
|
||||
);
|
||||
assert_eq!(x, 0);
|
||||
assert_eq!(y, 0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user