using SheetMe.Data.Stores;
namespace SheetMe.Core.Tests;
/// E_SctMst 트리 순회(레거시 bzSaveSheetDesignNControlInfo 이식) 테스트.
[TestClass]
public sealed class SctMstXmlWalkerTests
{
private static string SamplePath
=> Path.Combine(AppContext.BaseDirectory, "Assets", "sheetdesign_sample.xml");
/// 알파벳 시퀀스 — 레거시 GetNextAlphabetSequence 와 동일
[TestMethod]
[DataRow("A", "B")]
[DataRow("Y", "Z")]
[DataRow("Z", "AA")]
[DataRow("AA", "AB")]
[DataRow("AZ", "BA")]
[DataRow("ZZ", "AAA")]
[DataRow("AAZ", "ABA")]
public void NextAlphabetSequence_MatchesLegacy(string current, string expected)
{
Assert.AreEqual(expected, SctMstXmlWalker.NextAlphabetSequence(current));
}
/// 실샘플 순회 — 전체 Object 수(118)와 루트/자식 규약
[TestMethod]
public void Walk_RealSample_ProducesLegacyRows()
{
var rows = SctMstXmlWalker.Walk(File.ReadAllText(SamplePath));
Assert.AreEqual(118, rows.Count, "루트(MDesignerHost) 포함 118행이어야 합니다.");
var root = rows[0];
Assert.AreEqual("MDesignerHost1", root.ObjName);
Assert.AreEqual("A".PadRight(15), root.ObjId);
Assert.AreEqual("M.EMR.UserControl.MDesignerHost", root.ObjType);
Assert.AreEqual(string.Empty.PadRight(15), root.ParentId);
// 첫 자식: ObjId = AAA...? 루트 A 의 첫 자식 = A + AA = "AAA"? 아님 — 부모ID+AA = "AAA" 가 아니라 "A"+"AA"="AAA"
var firstChild = rows[1];
Assert.AreEqual("AAA".PadRight(15), firstChild.ObjId, "루트 A 의 첫 자식은 A+AA=AAA");
Assert.AreEqual("A".PadRight(15), firstChild.ParentId);
// 모든 행의 ObjId 는 15자 패딩
Assert.IsTrue(rows.All(r => r.ObjId.Length == 15));
// ObjType 은 AQN 이 아니라 풀 클래스명(콤마 없음)
Assert.IsTrue(rows.All(r => !r.ObjType.Contains(',')));
}
/// Text Property 가 SctObjTxt 로 추출되는지
[TestMethod]
public void Walk_ExtractsText()
{
const string xml =
"" +
"" +
"";
var rows = SctMstXmlWalker.Walk(xml);
Assert.AreEqual(2, rows.Count);
Assert.AreEqual("제목입니다", rows[1].ObjText);
Assert.AreEqual("3", rows[1].ObjSeq);
Assert.AreEqual("M.EMR.UserControl.Label", rows[1].ObjType);
}
}