StockTagParserTests.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using Application.Helpers;
  2. namespace Application.Tests;
  3. /// <summary>
  4. /// $종목 태그 파서 단위 테스트 (d2 §③·§⑤) — 순수 함수, DB 무관.
  5. /// 저장 토큰 `$005930(삼성전자)` 에서 6자리 코드 추출·중복 제거·비코드 무시를 검증한다.
  6. /// </summary>
  7. [TestClass]
  8. public sealed class StockTagParserTests
  9. {
  10. [TestMethod]
  11. public void Extract_TokenWithName_ReturnsCode()
  12. {
  13. var codes = StockTagParser.Extract("삼성전자 좋습니다 $005930(삼성전자) 매수");
  14. Assert.AreEqual(1, codes.Count);
  15. Assert.AreEqual("005930", codes[0]);
  16. }
  17. [TestMethod]
  18. public void Extract_BareCode_ReturnsCode()
  19. {
  20. var codes = StockTagParser.Extract("$000660 갑니다");
  21. Assert.AreEqual(1, codes.Count);
  22. Assert.AreEqual("000660", codes[0]);
  23. }
  24. [TestMethod]
  25. public void Extract_MultipleCodes_PreservesOrder()
  26. {
  27. var codes = StockTagParser.Extract("$005930(삼성전자) 와 $000660(SK하이닉스) 비교");
  28. CollectionAssert.AreEqual(new[] { "005930", "000660" }, codes);
  29. }
  30. [TestMethod]
  31. public void Extract_DuplicateCodes_Deduped()
  32. {
  33. var codes = StockTagParser.Extract("$005930(삼성전자) 언급 후 다시 $005930 언급");
  34. Assert.AreEqual(1, codes.Count);
  35. Assert.AreEqual("005930", codes[0]);
  36. }
  37. [TestMethod]
  38. public void Extract_NonSixDigit_Ignored()
  39. {
  40. // 5자리·7자리·문자 혼합은 종목코드가 아니다.
  41. var codes = StockTagParser.Extract("$00593 아님 $0059301 아님 $abcdef 아님 $12 아님");
  42. Assert.AreEqual(0, codes.Count);
  43. }
  44. [TestMethod]
  45. public void Extract_SevenDigitBoundary_NotMatched()
  46. {
  47. // 6자리 뒤에 숫자가 이어지면 종목코드로 보지 않는다(경계 검사).
  48. var codes = StockTagParser.Extract("$0059301");
  49. Assert.AreEqual(0, codes.Count);
  50. }
  51. [TestMethod]
  52. public void Extract_NoDollarSign_Ignored()
  53. {
  54. var codes = StockTagParser.Extract("005930 은 태그가 아니다");
  55. Assert.AreEqual(0, codes.Count);
  56. }
  57. [TestMethod]
  58. public void Extract_NullOrEmpty_ReturnsEmpty()
  59. {
  60. Assert.AreEqual(0, StockTagParser.Extract(null).Count);
  61. Assert.AreEqual(0, StockTagParser.Extract("").Count);
  62. }
  63. }