using System.Reflection; using System.Security.Cryptography; using System.Windows.Forms; using OpenNest.Data; using OpenNest.Forms; using OpenNest.IO; using OpenNest.Shapes; namespace OpenNest.WinForms.Tests.Forms; public class DrawingLibraryFormTests { private const string Server = "http://library.test:8090"; private static readonly TimeSpan TestTimeout = TimeSpan.FromSeconds(60); [Fact] public void ListsTheNestFilteredPage_AndAddThenAddAgainRaisesTheQuantity() { StaTestThread.Run( () => { var library = new FakeLibrary(); var record = library.Add("SYN-101", "Synthetic Steel", "Grade A", 0.25, Units.Inches, "Deburr both sides"); var nest = MatchingNest(); var messages = new List(); using var form = new DrawingLibraryForm(library, Server, nest); form.ShowMessage = (text, _, _) => { messages.Add(text); return DialogResult.OK; }; form.Show(); var grid = Field(form, "drawingGrid"); var notes = Field(form, "notesBox"); var quantity = Field(form, "quantityBox"); PumpUntil(() => grid.Rows.Count == 1, "the library page"); var query = Assert.Single(library.Queries); Assert.Equal(("Synthetic Steel", "Grade A", (double?)0.25), (query.MaterialName, query.MaterialGrade, query.Thickness)); Assert.Equal("SYN-101", grid.Rows[0].Cells["nameColumn"].Value); Assert.Equal("Laser", grid.Rows[0].Cells["cutTypeColumn"].Value); Assert.Equal("Deburr both sides", notes.Text); quantity.Value = 3; Run(form.AddSelectedAsync()); quantity.Value = 2; Run(form.AddSelectedAsync()); Assert.Empty(messages); var drawing = Assert.Single(nest.Drawings); Assert.Equal(5, drawing.Quantity.Required); Assert.Equal((Server, record.Id, record.Revision), (drawing.Library!.ServerKey, drawing.Library.Id, drawing.Library.Revision)); Assert.Same(drawing, Assert.Single(form.AddedDrawings)); Assert.Equal(new[] { (record.Id, record.Revision), (record.Id, record.Revision) }, library.Downloads); }, TestTimeout, "The drawing library dialog test did not complete."); } [Fact] public void MismatchWarning_IsShownBeforeTheAdd_AndCancelLeavesTheNestAlone() { StaTestThread.Run( () => { var library = new FakeLibrary(); library.Add("SYN-202", "Other Steel", "Grade B", 0.1875, Units.Inches, ""); var nest = MatchingNest(); var answers = new Queue(new[] { DialogResult.Cancel, DialogResult.OK }); var messages = new List(); using var form = new DrawingLibraryForm(library, Server, nest); form.ShowMessage = (text, buttons, _) => { messages.Add(text); Assert.Equal(MessageBoxButtons.OKCancel, buttons); return answers.Dequeue(); }; form.Show(); var grid = Field(form, "drawingGrid"); var showAll = Field(form, "showAllCheckBox"); showAll.Checked = true; PumpUntil(() => grid.Rows.Count == 1, "the unfiltered page"); Assert.Equal(("", "", (double?)null), (library.Queries[^1].MaterialName, library.Queries[^1].MaterialGrade, library.Queries[^1].Thickness)); Run(form.AddSelectedAsync()); Assert.Empty(nest.Drawings); Run(form.AddSelectedAsync()); Assert.Equal(2, messages.Count); Assert.Contains("thickness 0.1875 (nest 0.25)", messages[0]); Assert.Contains("cut pins are dropped", messages[0]); Assert.Single(nest.Drawings); }, TestTimeout, "The drawing library mismatch test did not complete."); } [Fact] public void Refusal_IsShownAndNothingIsAdded() { StaTestThread.Run( () => { var library = new FakeLibrary(); library.Add("SYN-303", "Synthetic Steel", "Grade A", 0.25, Units.Millimeters, ""); var nest = MatchingNest(); var messages = new List(); using var form = new DrawingLibraryForm(library, Server, nest); form.ShowMessage = (text, buttons, _) => { messages.Add(text); return DialogResult.OK; }; form.Show(); var grid = Field(form, "drawingGrid"); PumpUntil(() => grid.Rows.Count == 1, "the library page"); Run(form.AddSelectedAsync()); Assert.Contains("millimeters", Assert.Single(messages)); Assert.Empty(nest.Drawings); Assert.Empty(form.AddedDrawings); }, TestTimeout, "The drawing library refusal test did not complete."); } [Fact] public void EditSettings_SavesCutFirstAsANewRevision_AndTheAddAppliesIt() { StaTestThread.Run( () => { var library = new FakeLibrary(); var record = library.Add("SYN-404", "Synthetic Steel", "Grade A", 0.25, Units.Inches, "Test square"); var nest = MatchingNest(); using var form = new DrawingLibraryForm(library, Server, nest); form.ShowMessage = (text, _, _) => throw new Xunit.Sdk.XunitException(text); form.EditDrawing = edit => { using var editor = new EditLibraryDrawingForm(edit); editor.ShowMessage = (text, _, _) => throw new Xunit.Sdk.XunitException(text); editor.Show(); var save = Field