From 16ce03877cb5d09f04ba1f95e744fd1f81799722 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Sun, 4 Oct 2026 01:39:38 -0400 Subject: [PATCH] Test: Image Rotation rotates every layer, not just the active one (re #1) (#21) Guards the whole-canvas rotation behaviour (the reported symptom was rotation affecting only the selected layer, on 0.1.1). remap_document already rotates all raster layers, masks, channels and the selection; this locks it in. Non-raster layers (text/shape/smart) rotating under canvas rotation remains a tracked follow-up. Co-authored-by: Claude Opus 4.8 --- crates/engine/src/tests.rs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/crates/engine/src/tests.rs b/crates/engine/src/tests.rs index 52ae2ab7..5d824bec 100644 --- a/crates/engine/src/tests.rs +++ b/crates/engine/src/tests.rs @@ -213,6 +213,33 @@ fn canvas_flips_and_rotation() { assert_eq!(px(&mut s, 0, 0), vec![1.0, 0.0, 0.0, 1.0]); } +#[test] +fn image_rotation_rotates_every_layer_not_just_the_active_one() { + // Issue #1: Image Rotation must rotate the whole canvas, not only the selected layer. + let mut s = Session::new(); + s.execute("file.new", json!({"width": 20, "height": 10, "background": "white"})).unwrap(); + // A second (lower) layer with a red dot at the top-left; keep a third layer active. + s.execute("layer.new.layer", json!({})).unwrap(); + s.edit("dot", |doc, a| { + doc.layer_mut(a.unwrap()).unwrap().surface_mut().unwrap().fill_rect(photocraft_geom::Rect::new(2, 2, 4, 4), &[1.0, 0.0, 0.0, 1.0]); + Ok(()) + }) + .unwrap(); + let dotted = s.active().unwrap().active_layer.unwrap(); + s.execute("layer.new.layer", json!({})).unwrap(); // a different, empty active layer + assert_ne!(s.active().unwrap().active_layer.unwrap(), dotted, "active layer is not the dotted one"); + + s.execute("image.imageRotation.180", json!({})).unwrap(); + + // The non-active layer's content rotated too: (2,2)..(4,4) in 20x10 → (16,6)..(18,8). + let st = s.active().unwrap(); + let surf = st.doc.layer(dotted).unwrap().surface().unwrap(); + assert_eq!(surf.rgba(17, 6), [1.0, 0.0, 0.0, 1.0], "dot moved to the opposite corner"); + assert_eq!(surf.rgba(3, 3)[3], 0.0, "original spot is now empty"); + // The Background layer rotated as well (still fully opaque white everywhere). + assert_eq!(st.doc.layers[0].surface().unwrap().rgba(1, 1), [1.0, 1.0, 1.0, 1.0]); +} + #[test] fn fill_layers_and_colors() { let mut s = session_with_doc();