using Infrastructure.StockData; namespace Application.Tests; /// /// SEIBro getAssetInfo 파서 — 대문자 <RESULT> 래퍼. 다수 기초자산(AssetSeq) + 행사기준가·평가일 매핑. /// ⚠️ 기초자산코드 2체계: 반환 STND_BASSET_CD 가 입력 KSD02* 와 다른 KSD31*/KR7* 체계로 와도 **원문 그대로 보존**하는지 확인. /// [TestClass] public sealed class SeibroAssetParserTests { [TestMethod] public void Parse_SampleXml_MapsAssets_PreservesRawBassetCode() { var rows = SeibroAssetParser.Parse(SeibroXml.Parse(SeibroFixtures.Read("getAssetInfo.xml"))); Assert.AreEqual(3, rows.Count, "기초자산 3종"); var hscei = rows.Single(c => c.AssetSeq == 1); // 반환 코드 KSD310000306 (입력 HSCEI 는 KSD020000201) — 매핑 흡수 없이 원문 보존 Assert.AreEqual("KSD310000306", hscei.Fields.StndBassetCd, "반환 코드체계(KSD31*) 원문 보존"); Assert.AreEqual("Hang Seng China Enterprises Index", hscei.Fields.StndBassetNm); Assert.AreEqual(11073m, hscei.Fields.XrcStdprc); Assert.AreEqual(55m, hscei.Fields.XrcStopLolmtRatio); Assert.AreEqual(6090.15m, hscei.Fields.XrcStopLolmtPrice); Assert.AreEqual("1", hscei.Fields.BassetFirstValatTpcd, "종가"); Assert.AreEqual(new DateOnly(2018, 6, 29), hscei.Fields.FirstStdprcDecsnBeginDt); Assert.AreEqual(new DateOnly(2021, 6, 29), hscei.Fields.LastStdprcDecsnExpryDt); Assert.AreEqual("2", hscei.Fields.RvltSeverTpcd, "버림"); // S&P 500 (XML 엔티티 & 디코딩 확인) var snp = rows.Single(c => c.AssetSeq == 2); Assert.AreEqual("KSD310000568", snp.Fields.StndBassetCd); Assert.AreEqual("S&P 500 Index", snp.Fields.StndBassetNm, "& 디코딩"); // 단일종목(삼성전자) 기초자산 — KR7* 체계도 원문 보존 var samsung = rows.Single(c => c.AssetSeq == 3); Assert.AreEqual("KR7005930003", samsung.Fields.StndBassetCd); Assert.AreEqual("삼성전자", samsung.Fields.StndBassetNm); } [TestMethod] public void Parse_MissingAssetSeq_SkipsRow() { const string xml = """ """; var rows = SeibroAssetParser.Parse(SeibroXml.Parse(xml)); Assert.AreEqual(0, rows.Count, "ASSET_SEQ 없으면 스킵"); } }