From 5ce1ea3dfc084d6bb056bf6a2d62c24070b59569 Mon Sep 17 00:00:00 2001 From: Marco Arnulfo <103679419+marcoarnulfo@users.noreply.github.com> Date: Tue, 13 Oct 2026 10:34:19 +0200 Subject: [PATCH] POLYGON: an Edge second endpoint on the first is refused and asked again (follow-up to #735) (#760) --- crates/engine/src/cmd/draw.rs | 3 +++ crates/engine/tests/draw_prompts.rs | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/crates/engine/src/cmd/draw.rs b/crates/engine/src/cmd/draw.rs index b0c514036..538e53c51 100644 --- a/crates/engine/src/cmd/draw.rs +++ b/crates/engine/src/cmd/draw.rs @@ -895,6 +895,9 @@ impl Interactive for PolygonM { let n = self.sides.unwrap_or(4); if self.edge { if let Input::Point(p) = i { + if self.edge_pts.first().is_some_and(|a| a.near(p, 1e-12)) { + return Err(crate::EngineError::Other("Edge endpoints must differ.".into())); + } self.edge_pts.push(p); if self.edge_pts.len() == 2 { s.add_entity(lwpoly(polygon_from_edge(self.edge_pts[0], self.edge_pts[1], n), true))?; diff --git a/crates/engine/tests/draw_prompts.rs b/crates/engine/tests/draw_prompts.rs index af373a5df..9ddecdb43 100644 --- a/crates/engine/tests/draw_prompts.rs +++ b/crates/engine/tests/draw_prompts.rs @@ -65,6 +65,20 @@ fn polygon_typed_radius_has_a_horizontal_bottom_edge() { } } +#[test] +fn polygon_edge_endpoints_must_differ() { + let mut s = Session::new(); + s.cmdline("polygon 4 e 1,1 1,1").unwrap(); + assert_eq!(s.doc().unwrap().model.len(), 0, "no polygon"); + assert!(logged(&s, "Edge endpoints must differ."), "{:?}", s.log); + assert!(s.running.is_some(), "still at the second endpoint prompt"); + s.cmdline("3,1").unwrap(); + assert!(s.running.is_none(), "a distinct endpoint finishes"); + let EntityKind::LwPolyline(p) = last(&s) else { panic!("no polygon") }; + assert!(p.closed && p.vertices.len() == 4); + assert!(p.vertices.iter().any(|v| v.p.near(Vec2::new(3.0, 1.0), 1e-9)), "the edge runs from 1,1 to 3,1"); +} + #[test] fn circle_center_prompt_rejects_garbage() { let mut s = Session::new();