Skip to content

Commit 97116db

Browse files
refactor
1 parent 4ac6c36 commit 97116db

File tree

2 files changed

+67
-56
lines changed

2 files changed

+67
-56
lines changed

editor/src/messages/tool/tool_messages/freehand_tool.rs

+42-56
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,45 @@ mod test_freehand {
364364
.collect()
365365
}
366366

367+
fn verify_path_points(vector_data_list: &[(VectorData, DAffine2)], expected_captured_points: &[DVec2], tolerance: f64) -> Result<(), String> {
368+
if vector_data_list.len() == 0 {
369+
return Err("No vector data found after drawing".to_string());
370+
}
371+
372+
let path_data = vector_data_list.iter().find(|(data, _)| data.point_domain.ids().len() > 0).ok_or("Could not find path data")?;
373+
374+
let (vector_data, transform) = path_data;
375+
let point_count = vector_data.point_domain.ids().len();
376+
let segment_count = vector_data.segment_domain.ids().len();
377+
378+
let actual_positions: Vec<DVec2> = vector_data
379+
.point_domain
380+
.ids()
381+
.iter()
382+
.filter_map(|&point_id| {
383+
let position = vector_data.point_domain.position_from_id(point_id)?;
384+
Some(transform.transform_point2(position))
385+
})
386+
.collect();
387+
388+
if segment_count != point_count - 1 {
389+
return Err(format!("Expected segments to be one less than points, got {} segments for {} points", segment_count, point_count));
390+
}
391+
392+
if point_count != expected_captured_points.len() {
393+
return Err(format!("Expected {} points, got {}", expected_captured_points.len(), point_count));
394+
}
395+
396+
for (i, (&expected, &actual)) in expected_captured_points.iter().zip(actual_positions.iter()).enumerate() {
397+
let distance = (expected - actual).length();
398+
if distance >= tolerance {
399+
return Err(format!("Point {} position mismatch: expected {:?}, got {:?} (distance: {})", i, expected, actual, distance));
400+
}
401+
}
402+
403+
Ok(())
404+
}
405+
367406
#[tokio::test]
368407
async fn test_freehand_transformed_artboard() {
369408
let mut editor = EditorTestUtils::create();
@@ -388,64 +427,11 @@ mod test_freehand {
388427
let mouse_points = [DVec2::new(150.0, 100.0), DVec2::new(200.0, 150.0), DVec2::new(250.0, 130.0), DVec2::new(300.0, 170.0)];
389428

390429
// Expected points that will actually be captured by the tool
391-
let expected_captured_points = [DVec2::new(200.0, 150.0), DVec2::new(250.0, 130.0), DVec2::new(300.0, 170.0)];
392-
393-
let first_point = mouse_points[0];
394-
editor.move_mouse(first_point.x, first_point.y, ModifierKeys::empty(), MouseKeys::empty()).await;
395-
editor.left_mousedown(first_point.x, first_point.y, ModifierKeys::empty()).await;
396-
397-
for &point in &mouse_points[1..] {
398-
editor.move_mouse(point.x, point.y, ModifierKeys::empty(), MouseKeys::LEFT).await;
399-
}
400-
401-
editor
402-
.mouseup(
403-
EditorMouseState {
404-
editor_position: mouse_points[mouse_points.len() - 1],
405-
mouse_keys: MouseKeys::empty(),
406-
scroll_delta: ScrollDelta::default(),
407-
},
408-
ModifierKeys::empty(),
409-
)
410-
.await;
430+
let expected_captured_points = &mouse_points[1..];
431+
editor.drag_path(&mouse_points, ModifierKeys::empty()).await;
411432

412433
let vector_data_list = get_vector_data(&mut editor).await;
413-
414-
assert!(vector_data_list.len() > 0, "No vector data found after drawing");
415-
416-
let path_data = vector_data_list.iter().find(|(data, _)| data.point_domain.ids().len() > 0).expect("Could not find path data");
417-
418-
let (vector_data, transform) = path_data;
419-
420-
let point_count = vector_data.point_domain.ids().len();
421-
let segment_count = vector_data.segment_domain.ids().len();
422-
423-
let actual_positions: Vec<DVec2> = vector_data
424-
.point_domain
425-
.ids()
426-
.iter()
427-
.filter_map(|&point_id| {
428-
let position = vector_data.point_domain.position_from_id(point_id)?;
429-
Some(transform.transform_point2(position))
430-
})
431-
.collect();
432-
433-
assert_eq!(segment_count, point_count - 1, "Expected segments to be one less than points");
434-
435-
assert_eq!(point_count, expected_captured_points.len(), "Expected {} points, got {}", expected_captured_points.len(), point_count);
436-
437-
for (i, (&expected, &actual)) in expected_captured_points.iter().zip(actual_positions.iter()).enumerate() {
438-
let distance = (expected - actual).length();
439-
let tolerance = 1.0;
440-
assert!(
441-
distance < tolerance,
442-
"Point {} position mismatch: expected {:?}, got {:?} (distance: {})",
443-
i,
444-
expected,
445-
actual,
446-
distance
447-
);
448-
}
434+
verify_path_points(&vector_data_list, expected_captured_points, 1.0).expect("Path points verification failed");
449435
}
450436

451437
#[tokio::test]

editor/src/test_utils.rs

+25
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,31 @@ impl EditorTestUtils {
239239

240240
self.press(Key::Enter, ModifierKeys::empty()).await;
241241
}
242+
pub async fn drag_path(&mut self, points: &[DVec2], modifier_keys: ModifierKeys) {
243+
if points.is_empty() {
244+
return;
245+
}
246+
247+
let first_point = points[0];
248+
self.move_mouse(first_point.x, first_point.y, modifier_keys, MouseKeys::empty()).await;
249+
self.left_mousedown(first_point.x, first_point.y, modifier_keys).await;
250+
251+
// Move through all intermediate points
252+
for &point in &points[1..] {
253+
self.move_mouse(point.x, point.y, modifier_keys, MouseKeys::LEFT).await;
254+
}
255+
256+
// Mouse up at the last point
257+
self.mouseup(
258+
EditorMouseState {
259+
editor_position: points[points.len() - 1],
260+
mouse_keys: MouseKeys::empty(),
261+
scroll_delta: ScrollDelta::default(),
262+
},
263+
modifier_keys,
264+
)
265+
.await;
266+
}
242267
}
243268

244269
pub trait FrontendMessageTestUtils {

0 commit comments

Comments
 (0)