using System.Drawing; using System.Reflection; using System.Text.RegularExpressions; using System.Windows.Forms; using OpenNest.Controls; using OpenNest.Forms; using OpenNest.Shapes; namespace OpenNest.WinForms.Tests.Forms; public class ShapeLibraryFormTests { [Fact] public void FriendlyNameRegexHasExplicitTimeout() { var regex = Assert.IsType(typeof(ShapeLibraryForm) .GetField("FriendlyNamePattern", BindingFlags.Static | BindingFlags.NonPublic)!.GetValue(null)); Assert.Equal(TimeSpan.FromMilliseconds(100), regex.MatchTimeout); Assert.Equal(RegexOptions.None, regex.Options); } [Theory] [InlineData("PipeFlangeShape", "Pipe Flange")] [InlineData("HolePatternDiameter", "Hole Pattern Diameter")] [InlineData("NgonShape", "Ngon")] [InlineData("ABCShape", "ABC")] public void FriendlyNamesKeepSuffixAndWordBoundaryBehavior(string input, string expected) { Assert.Equal(expected, ShapeLibraryForm.FriendlyName(input)); } [Theory] [InlineData("PipeFlangeShape", "PipeFlange")] [InlineData("HolePatternDiameter", "HolePatternDiameter")] public void FriendlyNameTimeoutDiscardsPartialFormatting(string input, string expected) { var notices = new List(); var result = ShapeLibraryForm.FriendlyName(input, name => { Assert.Equal(expected, name); // Simulate a replacement failing after it has transformed a prefix internally. var partial = name.Insert(4, " "); Assert.NotEqual(expected, partial); throw new RegexMatchTimeoutException(); }, notices.Add); Assert.Equal(expected, result); Assert.Contains(expected, Assert.Single(notices)); } [Fact] public void ParametersAreDimensionsOnTheDrawingNotASidePanel() => ArchUnitsTests.RunSta(() => { using var form = new ShapeLibraryForm(); SelectShape(form, typeof(RectangleShape)); var preview = Find(form, "previewBox"); Assert.Empty(form.Controls.Find("parametersPanel", true)); Assert.Equal(new[] { "Length", "Width" }, preview.LabelKeys); Assert.NotNull(preview.LabelBounds("Length")); }); [Fact] public void TypingADimensionResizesTheShape() => ArchUnitsTests.RunSta(() => { using var form = new ShapeLibraryForm(); SelectShape(form, typeof(RectangleShape)); var preview = Find(form, "previewBox"); var box = OpenEditor(form, "Length"); Assert.Equal("Length", preview.ActiveKey); box.Text = "20 1/2"; Press(box, Keys.Enter); Assert.Null(form.ActiveEditor); Assert.Equal(20.5, preview.Plate.Parts.Single().BoundingBox.Length, 6); InvokeAdd(form); Assert.Equal(20.5, form.GetDrawings().Single().Program.BoundingBox().Length, 6); }); [Fact] public void InvalidEntryStaysOpenInRedAndKeepsTheLastShape() => ArchUnitsTests.RunSta(() => { using var form = new ShapeLibraryForm(); SelectShape(form, typeof(RectangleShape)); var preview = Find(form, "previewBox"); var length = preview.Plate.Parts.Single().BoundingBox.Length; var box = OpenEditor(form, "Length"); box.Text = "invalid dimension"; Press(box, Keys.Enter); Assert.Same(box, form.ActiveEditor); Assert.Equal(Color.Red, box.ForeColor); box.Text = "0"; Press(box, Keys.Enter); Assert.Same(box, form.ActiveEditor); Press(box, Keys.Escape); Assert.Null(form.ActiveEditor); Assert.Equal(length, preview.Plate.Parts.Single().BoundingBox.Length, 6); Assert.True(Find