SeibroRedCondiParserTests.cs 2.0 KB

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