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 InvalidShapeInputClearsOldPreviewAndBlocksAddUntilCorrected() => ArchUnitsTests.RunSta(() => { using var form = new ShapeLibraryForm(); var list = Find(form, "shapeListBox"); list.SelectedItem = list.Items.Cast().Single(entry => (Type)entry.GetType().GetProperty("ShapeType")!.GetValue(entry)! == typeof(RectangleShape)); var preview = Find(form, "previewBox"); var add = Find