@@ -703,7 +703,10 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
703703#[ cfg( test) ]
704704mod test_transform_layer {
705705 use crate :: messages:: {
706- portfolio:: document:: graph_operation:: { transform_utils, utility_types:: ModifyInputsContext } ,
706+ portfolio:: document:: graph_operation:: {
707+ transform_utils,
708+ utility_types:: { ModifyInputsContext , TransformIn } ,
709+ } ,
707710 prelude:: Message ,
708711 tool:: transform_layer:: transform_layer_message_handler:: VectorModificationType ,
709712 } ;
@@ -1097,4 +1100,43 @@ mod test_transform_layer {
10971100 let final_transform = get_layer_transform ( & mut editor, layer) . await ;
10981101 assert ! ( final_transform. is_some( ) , "Transform node should exist after grab operation" ) ;
10991102 }
1103+ #[ tokio:: test]
1104+ async fn test_scale_to_zero_then_rescale ( ) {
1105+ let mut editor = EditorTestUtils :: create ( ) ;
1106+ editor. new_document ( ) . await ;
1107+ editor. drag_tool ( ToolType :: Rectangle , 0. , 0. , 100. , 100. , ModifierKeys :: empty ( ) ) . await ;
1108+ let document = editor. active_document ( ) ;
1109+ let layer = document. metadata ( ) . all_layers ( ) . next ( ) . unwrap ( ) ;
1110+
1111+ // First scale to near-zero
1112+ editor. handle_message ( TransformLayerMessage :: BeginScale ) . await ;
1113+ editor. handle_message ( TransformLayerMessage :: TypeDigit { digit : 0 } ) . await ;
1114+ editor. handle_message ( TransformLayerMessage :: TypeDecimalPoint ) . await ;
1115+ editor. handle_message ( TransformLayerMessage :: TypeDigit { digit : 0 } ) . await ;
1116+ editor. handle_message ( TransformLayerMessage :: TypeDigit { digit : 0 } ) . await ;
1117+ editor. handle_message ( TransformLayerMessage :: TypeDigit { digit : 0 } ) . await ;
1118+ editor. handle_message ( TransformLayerMessage :: TypeDigit { digit : 1 } ) . await ;
1119+ editor. handle_message ( TransformLayerMessage :: ApplyTransformOperation { final_transform : true } ) . await ;
1120+
1121+ let near_zero_transform = get_layer_transform ( & mut editor, layer) . await . unwrap ( ) ;
1122+ // Verify scale is near zero.
1123+ let scale_x = near_zero_transform. matrix2 . x_axis . length ( ) ;
1124+ let scale_y = near_zero_transform. matrix2 . y_axis . length ( ) ;
1125+ assert ! ( scale_x < 0.001 , "Scale factor X should be near zero, got: {}" , scale_x) ;
1126+ assert ! ( scale_y < 0.001 , "Scale factor Y should be near zero, got: {}" , scale_y) ;
1127+ assert ! ( scale_x > 0.0 , "Scale factor X should not be exactly zero" ) ;
1128+ assert ! ( scale_y > 0.0 , "Scale factor Y should not be exactly zero" ) ;
1129+
1130+ editor. handle_message ( TransformLayerMessage :: BeginScale ) . await ;
1131+ editor. handle_message ( TransformLayerMessage :: TypeDigit { digit : 2 } ) . await ;
1132+ editor. handle_message ( TransformLayerMessage :: ApplyTransformOperation { final_transform : true } ) . await ;
1133+
1134+ let final_transform = get_layer_transform ( & mut editor, layer) . await . unwrap ( ) ;
1135+ assert ! ( final_transform. is_finite( ) , "Transform should be finite after rescaling" ) ;
1136+
1137+ let new_scale_x = final_transform. matrix2 . x_axis . length ( ) ;
1138+ let new_scale_y = final_transform. matrix2 . y_axis . length ( ) ;
1139+ assert ! ( new_scale_x > 0.0 , "After rescaling, scale factor X should be non-zero" ) ;
1140+ assert ! ( new_scale_y > 0.0 , "After rescaling, scale factor Y should be non-zero" ) ;
1141+ }
11001142}
0 commit comments