using System.Windows.Forms; using OpenNest.Data; using OpenNest.Forms; namespace OpenNest.WinForms.Tests.Forms; /// /// The Outside Cuts and Inside Cuts tabs of a thickness in Machine Configuration: inside cuts /// follow the outside leads until "Same as outside cuts" is cleared, which gives them a copy. /// public class MachineCutsFormsTests { [Fact] public void InsideCutsTab_GivesHolesTheirOwnLeads() { RunSta(() => { var directory = Path.Combine(Path.GetTempPath(), "OpenNestTests", Guid.NewGuid().ToString()); Directory.CreateDirectory(directory); try { var provider = new LocalJsonProvider(directory); var thickness = new ThicknessConfig { Value = 0.25, LeadIn = new LeadConfig { Type = "Arc", Radius = 0.125 }, LeadOut = new LeadConfig { Type = "None" }, }; provider.SaveMachine(new MachineConfig { Name = "Laser", Materials = { new MaterialConfig { Name = "Mild Steel", Thicknesses = { thickness } } }, }); using var form = new MachineConfigForm(provider); var node = Descendants(Find(form, "_tree").Nodes).Single(n => n.Tag is ThicknessConfig); // A hidden tree raises no AfterSelect, so show the thickness as selecting it would. typeof(MachineConfigForm) .GetMethod("Tree_AfterSelect", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic)! .Invoke(form, new object[] { null, new TreeViewEventArgs(node) }); var shown = (ThicknessConfig)node.Tag; var pages = All(form).Single().TabPages.Cast().ToList(); Assert.DoesNotContain(pages, p => p.Text is "Lead In" or "Lead Out"); var outside = pages.Single(p => p.Text == "Outside Cuts"); Assert.DoesNotContain(All(outside), c => c.Items.Contains("Clean Hole")); var inside = pages.Single(p => p.Text == "Inside Cuts"); var same = All(inside).Single(c => c.Text == "Same as outside cuts"); Assert.True(same.Checked); Assert.All(All(inside), c => Assert.False(c.Enabled)); Assert.NotNull(All(inside).Single().Parameters); same.Checked = false; Assert.Equal("Arc", shown.InsideLeadIn!.Type); Assert.Equal(0.125, shown.InsideLeadIn.Radius); Assert.NotSame(shown.LeadIn, shown.InsideLeadIn); Assert.All(All(inside), c => Assert.True(c.Enabled)); All(inside).Single(c => c.Items.Contains("Clean Hole")).SelectedItem = "Clean Hole"; Assert.Equal("Clean Hole", shown.InsideLeadIn.Type); Assert.Equal("Arc", shown.LeadIn.Type); // Only the chosen type's fields show: line length and arc radius. var leadInGrid = All(inside).ToList(); Assert.Equal(2, leadInGrid.Count); leadInGrid[1].Value = 0.07m; Assert.Equal(0.07, shown.InsideLeadIn.Radius, 6); Assert.Equal(0.125, shown.LeadIn.Radius); var preview = All(inside).Single().Parameters; Assert.Equal(0.07, Assert.IsType(preview.InternalLeadIn).ArcRadius, 6); same.Checked = true; Assert.Null(shown.InsideLeadIn); Assert.Null(shown.InsideLeadOut); } finally { Directory.Delete(directory, recursive: true); } }); } private static IEnumerable Descendants(TreeNodeCollection nodes) => nodes.Cast().SelectMany(n => Descendants(n.Nodes).Prepend(n)); private static T Find(Control root, string name) where T : Control => Assert.IsType(root.Controls.Find(name, true).Single()); private static IEnumerable All(Control root) where T : Control { foreach (Control child in root.Controls) { if (child is T match) yield return match; foreach (var nested in All(child)) yield return nested; } } private static void RunSta(System.Action action) => StaTestThread.Run(action, Timeout.InfiniteTimeSpan, "The STA test did not complete."); }