Add test for chained GRS transformations (#2475)

* added tests for chained tasks

* added tests for chained tasks, applied the feedback from 0hypercube

* some changes in grs chained test to make it more robust

* unnecessary changes
This commit is contained in:
Rahat 2025-03-30 01:51:40 +05:30 committed by GitHub
parent 41288d7642
commit a1ce796d94
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 74 additions and 0 deletions

View File

@ -908,4 +908,78 @@ mod test_transform_layer {
let translation_diff = (after_cancel.translation - original_transform.translation).length();
assert!(translation_diff < 1.0, "Translation component changed too much: {}", translation_diff);
}
#[tokio::test]
async fn test_grab_rotate_scale_chained() {
let mut editor = EditorTestUtils::create();
editor.new_document().await;
editor.drag_tool(ToolType::Rectangle, 0., 0., 100., 100., ModifierKeys::empty()).await;
let document = editor.active_document();
let layer = document.metadata().all_layers().next().unwrap();
editor.handle_message(NodeGraphMessage::SelectedNodesSet { nodes: vec![layer.to_node()] }).await;
let original_transform = get_layer_transform(&mut editor, layer).await.unwrap();
editor.handle_message(TransformLayerMessage::BeginGrab).await;
editor.move_mouse(150.0, 130.0, ModifierKeys::empty(), MouseKeys::NONE).await;
editor
.handle_message(TransformLayerMessage::PointerMove {
slow_key: Key::Shift,
increments_key: Key::Control,
})
.await;
let after_grab_transform = get_layer_transform(&mut editor, layer).await.unwrap();
let expected_translation = DVec2::new(50.0, 30.0);
let actual_translation = after_grab_transform.translation - original_transform.translation;
assert!(
(actual_translation - expected_translation).length() < 1e-5,
"Expected translation of {:?}, got {:?}",
expected_translation,
actual_translation
);
// 2. Chain to rotation - from current position to create ~45 degree rotation
editor.handle_message(TransformLayerMessage::BeginRotate).await;
editor.move_mouse(190.0, 90.0, ModifierKeys::empty(), MouseKeys::NONE).await;
editor
.handle_message(TransformLayerMessage::PointerMove {
slow_key: Key::Shift,
increments_key: Key::Control,
})
.await;
let after_rotate_transform = get_layer_transform(&mut editor, layer).await.unwrap();
// Checking for off-diagonal elements close to 0.707, which corresponds to cos(45°) and sin(45°)
assert!(
!after_rotate_transform.matrix2.abs_diff_eq(after_grab_transform.matrix2, 1e-5) &&
(after_rotate_transform.matrix2.x_axis.y.abs() - 0.707).abs() < 0.1 && // Check for off-diagonal elements close to 0.707
(after_rotate_transform.matrix2.y_axis.x.abs() - 0.707).abs() < 0.1, // that would indicate ~45° rotation
"Rotation should change matrix components with approximately 45° rotation"
);
// 3. Chain to scaling - scale(area) up by 2x
editor.handle_message(TransformLayerMessage::BeginScale).await;
editor.move_mouse(250.0, 200.0, ModifierKeys::empty(), MouseKeys::NONE).await;
editor
.handle_message(TransformLayerMessage::PointerMove {
slow_key: Key::Shift,
increments_key: Key::Control,
})
.await;
let after_scale_transform = get_layer_transform(&mut editor, layer).await.unwrap();
let before_scale_det = after_rotate_transform.matrix2.determinant();
let after_scale_det = after_scale_transform.matrix2.determinant();
assert!(
after_scale_det >= 2.0 * before_scale_det,
"Scale should increase the determinant of the matrix (before: {}, after: {})",
before_scale_det,
after_scale_det
);
editor.handle_message(TransformLayerMessage::ApplyTransformOperation { final_transform: true }).await;
let final_transform = get_layer_transform(&mut editor, layer).await.unwrap();
assert!(final_transform.abs_diff_eq(after_scale_transform, 1e-5), "Final transform should match the transform before committing");
assert!(!final_transform.abs_diff_eq(original_transform, 1e-5), "Final transform should be different from original transform");
}
}