55 lines
2.1 KiB
Rust
55 lines
2.1 KiB
Rust
|
|
//! Selection pixel-clearing regression tests.
|
|||
|
|
//!
|
|||
|
|
//! **Purpose:** Verifies that destructive selection operations use the active
|
|||
|
|
//! document selection mask rather than the brush stroke's temporary mask cache.
|
|||
|
|
//!
|
|||
|
|
//! **Logic & Workflow:** Each test creates an opaque raster layer through the
|
|||
|
|
//! public engine API, installs a deterministic selection mask, clears selected
|
|||
|
|
//! pixels, and compares alpha values inside and outside that mask.
|
|||
|
|
//!
|
|||
|
|
//! **Side Effects / Dependencies:** Uses only in-memory `hcie-engine-api` state;
|
|||
|
|
//! no files, network services, GUI runtime, or engine internals are accessed.
|
|||
|
|
|
|||
|
|
use hcie_engine_api::Engine;
|
|||
|
|
|
|||
|
|
/// Confirms that selection clearing removes internal pixels and preserves all
|
|||
|
|
/// pixels external to the selection.
|
|||
|
|
///
|
|||
|
|
/// **Purpose:** Prevents a regression where `clear_selection_pixels` consulted
|
|||
|
|
/// an empty stroke cache and consequently cleared the complete active layer.
|
|||
|
|
///
|
|||
|
|
/// **Logic & Workflow:** Creates a 3×3 opaque layer, selects only its center
|
|||
|
|
/// pixel, invokes selection clearing, then checks every resulting alpha value.
|
|||
|
|
///
|
|||
|
|
/// **Arguments & Returns:** Takes no arguments and returns nothing; assertion
|
|||
|
|
/// failures report whether an internal or external pixel was handled wrongly.
|
|||
|
|
///
|
|||
|
|
/// **Side Effects / Dependencies:** Mutates only the local in-memory engine and
|
|||
|
|
/// records the normal undo snapshot generated by the clear operation.
|
|||
|
|
#[test]
|
|||
|
|
fn clear_selection_pixels_clears_inside_and_preserves_outside() {
|
|||
|
|
let mut engine = Engine::new(3, 3);
|
|||
|
|
engine.set_active_layer_pixels(vec![255; 3 * 3 * 4]);
|
|||
|
|
|
|||
|
|
let mut mask = vec![0; 3 * 3];
|
|||
|
|
mask[4] = 255;
|
|||
|
|
engine.set_selection_mask(mask);
|
|||
|
|
|
|||
|
|
engine.clear_selection_pixels();
|
|||
|
|
|
|||
|
|
let pixels = engine
|
|||
|
|
.get_active_layer_pixels()
|
|||
|
|
.expect("a new engine must have an active raster layer");
|
|||
|
|
for pixel_index in 0..9 {
|
|||
|
|
let alpha = pixels[pixel_index * 4 + 3];
|
|||
|
|
if pixel_index == 4 {
|
|||
|
|
assert_eq!(alpha, 0, "selected center pixel must be cleared");
|
|||
|
|
} else {
|
|||
|
|
assert_eq!(
|
|||
|
|
alpha, 255,
|
|||
|
|
"unselected pixel {pixel_index} must be preserved"
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|