using System.Collections; using System.ComponentModel; using System.Globalization; using System.Reflection; using System.Runtime.ExceptionServices; using System.Text.RegularExpressions; using System.Windows.Forms; using OpenNest.Forms; namespace OpenNest.WinForms.Tests.Forms; public class AutoNestFormStockOptionsTests { [Theory] [InlineData(false)] [InlineData(true)] public void StockOptionsKeepAnAddRowAfterAddingAPlate(bool loadSavedOptions) { RunSta(() => { using var form = new AutoNestForm(new Nest()); if (loadSavedOptions) form.LoadPlateOptions(new List { new() { Width = 48, Length = 96, Cost = 25 }, }, 0.5); form.OptimizePlateSize = true; var grid = GetGrid(form); var initialCount = form.GetPlateOptions().Count; AssertNewRow(grid); var rows = Assert.IsAssignableFrom(grid.DataSource); Assert.True(rows.AllowNew); var added = rows.AddNew()!; SetValue(added, "Size", "84 x 168"); SetValue(added, "Cost", 123.5); ((ICancelAddNew)rows).EndNew(rows.Count - 1); var options = form.GetPlateOptions(); Assert.Equal(initialCount + 1, options.Count); var option = options.Last(); Assert.Equal(84, option.Width); Assert.Equal(168, option.Length); Assert.Equal(123.5, option.Cost); AssertNewRow(grid); }); } [Fact] public void BlankAndCancelledRowsDoNotBecomeStockOptions() { RunSta(() => { using var form = new AutoNestForm(new Nest()); var saved = new List { new() { Width = 48, Length = 96, Cost = 25 }, }; form.LoadPlateOptions(saved, 0.5); var grid = GetGrid(form); var rows = Assert.IsAssignableFrom(grid.DataSource); var addNew = Assert.IsAssignableFrom(rows); rows.AddNew(); Assert.Single(form.GetPlateOptions()); addNew.CancelNew(rows.Count - 1); Assert.Single((IEnumerable)rows); rows.Clear(); Assert.Empty(form.GetPlateOptions()); AssertNewRow(grid); Assert.Single(saved); Assert.Equal(48, saved[0].Width); Assert.Equal(96, saved[0].Length); Assert.Equal(25, saved[0].Cost); }); } [Fact] public void StockSizeRegexHasExplicitTimeout() { var regex = Assert.IsType(typeof(AutoNestForm) .GetField("SizePattern", BindingFlags.Static | BindingFlags.NonPublic)!.GetValue(null)); Assert.Equal(TimeSpan.FromMilliseconds(250), regex.MatchTimeout); Assert.Equal(RegexOptions.None, regex.Options); } [Theory] [InlineData("48 x")] [InlineData("abc")] [InlineData("0 x 96")] [InlineData("-1 x 96")] [InlineData("١ x 96")] public void NonblankInvalidRowRejectsWholeCollection(string invalid) => RunSta(() => { using var form = new StockTestForm(); form.LoadPlateOptions(new List { new() { Width = 48, Length = 96, Cost = 25 } }, 0.5); var grid = GetGrid(form); var rows = Assert.IsAssignableFrom(grid.DataSource); var row = rows.AddNew()!; SetValue(row, "Size", invalid); ((ICancelAddNew)rows).EndNew(rows.Count - 1); Assert.False(form.TryGetPlateOptions(out var options, out var error)); Assert.Empty(options); Assert.Contains(invalid, error); Assert.Contains("row 2", error); Assert.Throws(() => form.GetPlateOptions()); Assert.NotEmpty(grid.Rows[1].ErrorText); SetValue(row, "Size", "72.5 × 144.25"); Assert.True(form.TryGetPlateOptions(out options, out error)); Assert.Null(error); Assert.Equal(2, options.Count); Assert.Equal(72.5, options[1].Width); Assert.Equal(144.25, options[1].Length); Assert.Equal(25, options[0].Cost); Assert.Empty(grid.Rows[1].ErrorText); }); [Fact] public void TimeoutAfterValidRowPublishesNoPrefixAndDoesNotAcceptDialog() => RunSta(() => { using var form = new StockTestForm(); form.LoadPlateOptions(new List { new() { Width = 48, Length = 96 } }, 0.5); var grid = GetGrid(form); var rows = Assert.IsAssignableFrom(grid.DataSource); var row = rows.AddNew()!; SetValue(row, "Size", "timeout row"); ((ICancelAddNew)rows).EndNew(rows.Count - 1); form.FailOn = "timeout row"; Assert.False(form.TryGetPlateOptions(out var options, out var error)); Assert.Empty(options); Assert.Contains("timeout row", error); Assert.True(form.TryClose(DialogResult.OK)); Assert.Equal(DialogResult.None, form.DialogResult); Assert.Contains("timeout row", Assert.Single(form.Notices)); Assert.True(form.MatchCalls > 1); form.Notices.Clear(); Assert.False(form.TryClose(DialogResult.Cancel)); Assert.Empty(form.Notices); Assert.False(Assert.IsType