using System.Windows.Forms;
using OpenNest.CNC.CuttingStrategy;
using OpenNest.Controls;
using OpenNest.Data;
using OpenNest.Forms;
using static OpenNest.WinForms.Tests.FormTesting;
namespace OpenNest.WinForms.Tests.Forms;
///
/// Cutting settings kept per machine thickness: the Tabs & Pierce tab of Machine
/// Configuration, copying them between thicknesses, and the cutting panel's machine modes.
///
public class MachineTabsPierceFormsTests
{
[Fact]
public void TabsPierceTab_SetsTheThicknessesCuttingSettingsOnlyWhileChecked()
{
RunSta(() =>
{
var directory = Path.Combine(Path.GetTempPath(), "OpenNestTests", Guid.NewGuid().ToString());
Directory.CreateDirectory(directory);
try
{
var provider = new LocalJsonProvider(directory);
provider.SaveMachine(new MachineConfig
{
Name = "Laser",
Materials = { new MaterialConfig { Name = "Mild Steel", Thicknesses = { new ThicknessConfig { Value = 0.25 } } } },
});
using var form = new MachineConfigForm(provider);
var node = Descendants(Find(form, "_tree").Nodes).Single(n => n.Tag is ThicknessConfig);
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 page = All(form).Single().TabPages.Cast().Single(p => p.Text == "Tabs & Pierce");
var use = All(page).Single(c => c.Text == "Use for this thickness");
var panel = All(page).Single();
// A thickness edits its leads on its own tabs, so this panel has none.
Assert.Empty(All(page));
Assert.False(use.Checked);
Assert.False(panel.Enabled);
Assert.Null(shown.Cutting);
use.Checked = true;
Assert.NotNull(shown.Cutting);
Assert.False(shown.Cutting!.Tabs);
All(panel).Single(c => c.Text == "Add tabs to hold parts in the sheet").Checked = true;
All(panel).Single(r => r.Text == "Tab parts by size").Checked = true;
Assert.True(shown.Cutting!.Tabs);
Assert.True(shown.Cutting.TabBySize);
use.Checked = false;
Assert.Null(shown.Cutting);
}
finally
{
Directory.Delete(directory, recursive: true);
}
});
}
[Fact]
public void CopyCutting_GivesEachThicknessItsOwnCopy()
{
var source = new ThicknessCuttingConfig { Tabs = true, TabSize = 0.04, TabSizeMaxWidth = 3 };
var copy = MachineConfigForm.CopyCutting(source);
Assert.NotSame(source, copy);
Assert.True(copy.Tabs);
Assert.Equal(0.04, copy.TabSize);
Assert.Equal(3, copy.TabSizeMaxWidth);
Assert.Null(MachineConfigForm.CopyCutting(null));
}
[Fact]
public void CuttingPanel_ShowsWhereItSavesAndOffersOnlyMachineLeads()
{
RunSta(() =>
{
using var panel = new CuttingPanel
{
MachineLeads = true,
Source = "Saved for Fiber 1 · Mild Steel A36 0.25 in",
};
panel.LoadFromParameters(new CuttingParameters());
Assert.Contains(All