using SheetMe.Core.Catalog; namespace SheetMe.Core.Tests; /// /// 배선 한 칸 선택 — Select 형 필터는 .NET DataTable.Select 를 그대로 쓰므로 /// 여기서는 "같은 엔진에 제대로 넘겼는가"(필터 적용·행 선택·사유)를 본다. /// [TestClass] public sealed class DataTableFieldPickerTests { #region Methods private static readonly string[] Columns = { "NAM", "TYP" }; private static readonly string[][] Rows = { new[] { "감기", "M" }, new[] { "골절", "S" }, new[] { "당뇨", "S" }, }; private static DataTableFieldSpec Select(string filter, int row, string field = "NAM") => new() { TableName = "T", Form = DataTableFieldForm.Select, Filter = filter, RowIndex = row, Field = field, }; [TestMethod] public void Select_필터가_행을_거른다() { // TYP='S' 인 행이 둘 — 0번은 골절, 1번은 당뇨 Assert.AreEqual("골절", DataTableFieldPicker.Pick(Columns, Rows, Select("TYP = 'S'", 0)).Text); Assert.AreEqual("당뇨", DataTableFieldPicker.Pick(Columns, Rows, Select("TYP = 'S'", 1)).Text); } [TestMethod] public void Select_필터에_맞는_행이_없으면_사유다() { var value = DataTableFieldPicker.Pick(Columns, Rows, Select("TYP = 'X'", 0)); Assert.IsFalse(value.Resolved); StringAssert.Contains(value.Text, "맞는 행이 없습니다"); } [TestMethod] public void Select_필터_문법이_깨지면_사유다() { // 레거시 런타임은 빈 catch 로 삼켜 빈칸이 됐다 — 여기서는 사유가 나온다 var value = DataTableFieldPicker.Pick(Columns, Rows, Select("TYP === ", 0)); Assert.IsFalse(value.Resolved); StringAssert.Contains(value.Text, "해석할 수 없습니다"); } [TestMethod] public void Rows_형은_행_번호로_고른다() { var spec = new DataTableFieldSpec { TableName = "T", Form = DataTableFieldForm.Rows, RowIndex = 2, Field = "NAM", }; Assert.AreEqual("당뇨", DataTableFieldPicker.Pick(Columns, Rows, spec).Text); } [TestMethod] public void 중복_컬럼명은_Fill_규칙으로_비껴_담고_첫_컬럼과_매칭된다() { // SELECT * 조인에서 같은 이름이 두 번 오는 경우 — 첫 컬럼의 값이 나와야 한다 var dup = new[] { "NAM", "NAM" }; var rows = new[] { new[] { "첫값", "둘값" } }; Assert.AreEqual("첫값", DataTableFieldPicker.Pick(dup, rows, Select("NAM = '첫값'", 0)).Text); } #endregion }