| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- using Infrastructure.StockData;
- namespace Application.Tests;
- /// <summary>
- /// SEIBro getRedCondiInfo 파서 — 대문자 <RESULT> 래퍼. 상환조건구분(1중간/2만기)×평가횟수별 조건문·계산식 다수 행 매핑.
- /// 상환조건내용은 1000자 자유 텍스트(원문 이모지·괄호 보존) — 절삭 없이 파싱하는지 확인.
- /// </summary>
- [TestClass]
- public sealed class SeibroRedCondiParserTests
- {
- [TestMethod]
- public void Parse_SampleXml_MapsConditions_And1000CharText()
- {
- var rows = SeibroRedCondiParser.Parse(SeibroXml.Parse(SeibroFixtures.Read("getRedCondiInfo.xml")));
- Assert.AreEqual(10, rows.Count, "중간평가 8 + 만기 2");
- var mid1 = rows.Single(c => c.RedCondiTpcd == "1" && c.ValatNtimesSeq == 1);
- Assert.AreEqual(new DateOnly(2018, 12, 6), mid1.MidValatPayDt);
- Assert.AreEqual(new DateOnly(2018, 12, 3), mid1.MidValatBeginDt);
- StringAssert.Contains(mid1.RedCondiContent, "95%이상", "상환조건 텍스트 원문 보존");
- Assert.AreEqual("액면금액의 101.7900%", mid1.RedFormulaContent);
- // 만기상환(2) 두 건 — 원금손실 시나리오 텍스트
- var expiryLoss = rows.Single(c => c.RedCondiTpcd == "2" && c.ValatNtimesSeq == 2);
- StringAssert.Contains(expiryLoss.RedCondiContent, "65% 미만", "만기 원금손실 조건");
- Assert.AreEqual("액면금액 * (만기평가가격/최초기준가격)", expiryLoss.RedFormulaContent);
- }
- [TestMethod]
- public void Parse_LongText_NotTruncated()
- {
- var longText = new string('가', 900);
- var xml = $"""
- <vector result="1"><data vectorkey="0" type="Document"><RESULT>
- <RED_CONDI_TPCD value="1"/><VALAT_NTIMES_SEQ value="1"/>
- <RED_CONDI_CONTENT value="{longText}"/>
- </RESULT></data></vector>
- """;
- var rows = SeibroRedCondiParser.Parse(SeibroXml.Parse(xml));
- Assert.AreEqual(1, rows.Count);
- Assert.AreEqual(900, rows[0].RedCondiContent!.Length, "900자 그대로 파싱");
- }
- }
|