Files
SheetMe/tests/SheetMe.Core.Tests/FarPointSpreadParserTests.cs
MsystechandClaude Fable 5 16c07f48dc 초기 커밋: SheetMe 서식생성기 (P0~P5 완료 상태)
레거시 서식생성기(VB.NET WinForms) 대체용 C#/.NET 10 WPF 디자이너.
기준선: 실DB 활성 디자인 1,271건 왕복 의미론 diff 0 / 예외 0, 단위 테스트 49/49.

이 커밋에 함께 포함된 자격증명 분리:
- appsettings.json 을 __HOST__/__PASSWORD__ 플레이스홀더로 전환
- 실접속 정보는 appsettings.Development.json 으로 분리(.gitignore 제외,
  csproj Debug 조건부 복사라 Release 산출물에 실리지 않음)
- ConfigLoader 를 환경변수 > Development > appsettings 순 레이어링으로 변경,
  미치환 플레이스홀더는 '미설정'으로 간주

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

115 lines
4.6 KiB
C#

using SheetMe.Core.Serialization;
namespace SheetMe.Core.Tests;
/// <summary>
/// FarPoint Spread XML 파서 테스트.
/// 합성 샘플 기반(테스트 DB 의 실물 2건은 셀 없는 기본 골격) — 셀 있는 실서식 확보 시 재검증.
/// </summary>
[TestClass]
public sealed class FarPointSpreadParserTests
{
private const string SyntheticXml = """
<?xml version="1.0" encoding="utf-8"?>
<Spread class="M.EMR.UserControl.Spread" assembly="M.EMR.UserControl">
<Presentation>
<Sheets>
<Sheet index="0">
<AxisModels>
<Row class="FarPoint.Win.Spread.Model.DefaultSheetAxisModel" defaultSize="24" orientation="Vertical" count="500">
<Items>
<Item index="0"><Size>40</Size></Item>
<Item index="2"><Size>60</Size></Item>
</Items>
</Row>
<Column class="FarPoint.Win.Spread.Model.DefaultSheetAxisModel" orientation="Horizontal" count="500">
<Items>
<Item index="-1"><Size>80</Size></Item>
<Item index="1"><Size>120</Size></Item>
</Items>
</Column>
</AxisModels>
<SpanModel class="FarPoint.Win.Spread.Model.DefaultSheetSpanModel">
<CellRange Row="0" Column="0" RowCount="1" ColumnCount="2" />
</SpanModel>
</Sheet>
</Sheets>
</Presentation>
<Data>
<Sheets>
<Sheet index="0">
<DataArea class="FarPoint.Win.Spread.Model.DefaultSheetDataModel" rows="500" columns="500">
<Cell Row="0" Column="0"><Data type="System.String">평가 항목</Data></Cell>
<Cell Row="1" Column="0"><Data type="System.String">보행</Data></Cell>
<Cell Row="1" Column="1"><Data type="System.String">3</Data></Cell>
</DataArea>
</Sheet>
</Sheets>
</Data>
</Spread>
""";
/// <summary>합성 샘플 — 축 크기/기본값/스팬/셀 추출</summary>
[TestMethod]
public void Parse_Synthetic_ExtractsAll()
{
var grid = FarPointSpreadParser.Parse(SyntheticXml);
Assert.IsNotNull(grid);
Assert.AreEqual(24, grid!.DefaultRowHeight, "defaultSize 어트리뷰트");
Assert.AreEqual(80, grid.DefaultColWidth, "index=-1 Item 기본값");
Assert.AreEqual(40, grid.RowHeightOf(0));
Assert.AreEqual(24, grid.RowHeightOf(1), "미지정 행은 기본값");
Assert.AreEqual(60, grid.RowHeightOf(2));
Assert.AreEqual(120, grid.ColWidthOf(1));
Assert.AreEqual(80, grid.ColWidthOf(0));
Assert.AreEqual(1, grid.Spans.Count);
Assert.AreEqual(2, grid.Spans[0].ColSpan);
Assert.AreEqual(3, grid.Cells.Count);
Assert.AreEqual("평가 항목", grid.Cells[0].Text);
Assert.AreEqual(1, grid.Cells[2].Row);
Assert.AreEqual(1, grid.Cells[2].Col);
}
/// <summary>실물 기본 골격(S999) — 예외 없이 파싱, 기본 크기 유지</summary>
[TestMethod]
public void Parse_EmptySkeleton_Succeeds()
{
const string skeleton = """
<Spread class="M.EMR.UserControl.Spread">
<Presentation>
<Sheets><Sheet index="0">
<AxisModels>
<Row class="FarPoint.Win.Spread.Model.DefaultSheetAxisModel" orientation="Vertical" count="500">
<Items><Item index="-1" /></Items>
</Row>
<Column class="FarPoint.Win.Spread.Model.DefaultSheetAxisModel" orientation="Horizontal" count="500">
<Items><Item index="-1" /></Items>
</Column>
</AxisModels>
</Sheet></Sheets>
</Presentation>
<Data><Sheets><Sheet index="0">
<DataArea class="FarPoint.Win.Spread.Model.DefaultSheetDataModel" rows="500" columns="500" />
</Sheet></Sheets></Data>
</Spread>
""";
var grid = FarPointSpreadParser.Parse(skeleton);
Assert.IsNotNull(grid);
Assert.AreEqual(20, grid!.DefaultRowHeight);
Assert.AreEqual(62, grid.DefaultColWidth);
Assert.AreEqual(0, grid.Cells.Count);
}
/// <summary>손상 입력 — null 반환(자리표시 렌더 유지)</summary>
[TestMethod]
public void Parse_Invalid_ReturnsNull()
{
Assert.IsNull(FarPointSpreadParser.Parse("not xml at all <"));
}
}