using System.Data; using System.Reflection; using System.Windows.Forms; using OpenNest.Forms; using OpenNest.IO.Bom; namespace OpenNest.WinForms.Tests.Forms; public class BomImportFormTests { [Fact] public void PartColumns_KeepBomOrderAndOnlyMaterialThicknessAndQtyAreEditable() { RunSta(() => { using var form = Show(out var parts); Assert.Equal( new[] { "Item #", "File Name", "Description", "Material", "Thickness", "Qty", "Status" }, parts.Columns.Cast().OrderBy(c => c.DisplayIndex).Select(c => c.HeaderText) ); Assert.All( parts.Columns.Cast(), c => Assert.Equal(DataGridViewColumnSortMode.NotSortable, c.SortMode) ); Assert.Equal( new[] { "colMaterial", "colThickness", "colQty" }, parts.Columns.Cast().Where(c => !c.ReadOnly).Select(c => c.Name) ); }); } [Fact] public void EditingQty_ChangesThatPartAndTheGroupTotal() { RunSta(() => { using var form = Show(out var parts); var first = Ready("PT01", qty: 2); var second = Ready("PT02", qty: 3); form.LoadRows(new[] { first, second }); Assert.Equal(5, GroupTotal(form, 0)); Assert.True(Edit(parts, 0, "colQty", "5")); Assert.Equal(5, first.Qty); Assert.Equal(3, second.Qty); Assert.Equal(8, GroupTotal(form, 0)); Assert.Equal("Ready", parts.Rows[0].Cells["colStatus"].Value); }); } [Theory] [InlineData("0")] [InlineData("-1")] [InlineData("2.5")] [InlineData("abc")] [InlineData("")] public void InvalidQty_IsRefusedAndTheOldValueKept(string text) { RunSta(() => { using var form = Show(out var parts); var part = Ready("PT01", qty: 2); form.LoadRows(new[] { part }); Assert.False(Edit(parts, 0, "colQty", text)); Assert.True(parts.IsCurrentCellInEditMode); Assert.False(string.IsNullOrEmpty(parts.CurrentCell.ErrorText)); parts.CancelEdit(); Assert.True(parts.EndEdit()); Assert.Equal(2, part.Qty); Assert.Equal(2, GroupTotal(form, 0)); }); } [Theory] [InlineData("colQty", "0")] [InlineData("colQty", "abc")] [InlineData("colThickness", "-1")] [InlineData("colThickness", "abc")] public void ProgrammaticCommitOfInvalidText_KeepsTheRowsValue(string column, string text) { RunSta(() => { using var form = Show(out var parts); var part = Ready("PT01", qty: 2); form.LoadRows(new[] { part }); parts.CurrentCell = parts.Rows[0].Cells[column]; Assert.True(parts.BeginEdit(selectAll: true)); parts.EditingControl!.Text = text; Assert.True(parts.EndEdit()); Assert.Equal(2, part.Qty); Assert.Equal(0.25, part.Thickness); Assert.Equal(BomRowStatus.Ready, part.Status); }); } [Fact] public void Edits_ChangeThePartShownInThatRow_AfterTheRowsAreReloadedInAnotherOrder() { RunSta(() => { using var form = Show(out var parts); var a = Ready("PT01", qty: 1); var b = Ready("PT02", qty: 1); var c = Ready("PT03", qty: 1); form.LoadRows(new[] { a, b, c }); Assert.True(Edit(parts, 2, "colMaterial", "Aluminum")); Assert.Equal("Aluminum", c.Material); Assert.Equal("Stainless", a.Material); form.LoadRows(new[] { c, a, b }); Assert.Same(c, parts.Rows[0].DataBoundItem); Assert.True(Edit(parts, 0, "colQty", "9")); Assert.Equal(9, c.Qty); Assert.Equal(1, a.Qty); }); } [Fact] public void RowsWithoutADrawing_CannotEnterEditMode() { RunSta(() => { using var form = Show(out var parts); var noDrawing = Ready("PT01", qty: 1); noDrawing.DxfPath = null; form.LoadRows(new[] { noDrawing, Ready("PT02", qty: 1) }); parts.CurrentCell = parts.Rows[0].Cells["colQty"]; Assert.False(parts.BeginEdit(selectAll: true)); Assert.False(parts.IsCurrentCellInEditMode); parts.CurrentCell = parts.Rows[1].Cells["colQty"]; Assert.True(parts.BeginEdit(selectAll: true)); parts.CancelEdit(); }); } [Fact] public void BlankingMaterialOrThickness_MarksTheRowAndDropsItFromTheGroups() { RunSta(() => { using var form = Show(out var parts); var first = Ready("PT01", qty: 1); var second = Ready("PT02", qty: 1); form.LoadRows(new[] { first, second }); Assert.True(Edit(parts, 0, "colMaterial", " ")); Assert.Equal("", first.Material); Assert.Equal("Needs material", parts.Rows[0].Cells["colStatus"].Value); Assert.False(Edit(parts, 1, "colThickness", "abc")); parts.CancelEdit(); Assert.True(parts.EndEdit()); Assert.Equal(0.25, second.Thickness); Assert.True(Edit(parts, 1, "colThickness", "")); Assert.Null(second.Thickness); Assert.Equal("Needs thickness", parts.Rows[1].Cells["colStatus"].Value); Assert.Empty(GroupsTable(form).Rows); Assert.Equal("0 ready, 1 needs a material, 1 needs a thickness", Field