Files
SheetMe/tests/SheetMe.Core.Tests/DataTableFieldPickerTests.cs
MsystechandClaude Fable 5 2310971a10 인쇄 용지를 문서 크기로 제시 + Select 형 배선 필터 실행 — 남은 과제 2건
① PDF 높이 어긋남(735pt vs 문서 642pt) 원인 규명·수정: 인쇄가
용지(PrintTicket)를 지정하지 않아 드라이버가 폭이 비슷한 기본 용지
(540×735pt ≈ 16절 190×260mm — test1.pdf MediaBox 실측)에 문서를
얹었다. 폭이 우연히 같아 좌우는 멀쩡하고 아래에만 33mm 여백이 붙어
화면과 다른 종이가 됐다. ShowDialog 전에 PageMediaSize 를 문서 첫
페이지 DIP 크기로 제시 — 사용자가 대화상자에서 용지를 바꾸면 그
선택이 이긴다. (레거시는 사용자가 고른 용지에 문서를 맞추는 방식
(clPrintDesignSheet.vb:660)이라 이 기본값 제시와 충돌하지 않는다.)

② Select 형 DataTableField 필터(운영 268건, 12%) 실행:
지금까지 "아직 옮기지 않았습니다" 사유였다. 필터 문법을 직접 파싱하지
않고 .NET DataTable.Select 에 그대로 넘긴다 — 레거시 배선이 쓰는
바로 그 엔진이라 문법 호환을 증명할 필요가 없다. 행 선택을 순수 함수
(DataTableFieldPicker)로 분리해 DB 없이 검증(테스트 5건 — 필터·0행·
문법 오류·Rows 형·중복 컬럼명 Fill 규칙). 알려진 한계 주석: 우리
결과는 전부 문자열 컬럼이라 숫자 대소 비교 필터는 사전순이 될 수
있다(운영 필터 대부분은 동등 비교).

- dotnet test 347/347 (picker 5건 추가) · --edit-smoke 실패 0
- --db-patient ①~㊱ 전건 통과
- --db-render P062 md5 8d683835f5d81e7bb41c79071d6bf954 불변

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 09:35:27 +09:00

74 lines
2.6 KiB
C#

using SheetMe.Core.Catalog;
namespace SheetMe.Core.Tests;
/// <summary>
/// 배선 한 칸 선택 — Select 형 필터는 .NET DataTable.Select 를 그대로 쓰므로
/// 여기서는 "같은 엔진에 제대로 넘겼는가"(필터 적용·행 선택·사유)를 본다.
/// </summary>
[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
}