using SheetMe.Core.Catalog;
namespace SheetMe.Core.Tests;
///
/// 쿼리 치환 변수 카탈로그 테스트 — 레거시 bzDesignSheetLoader.ConvertQuery 의
/// "접두어를 GetType.FullName 과 완전일치 비교" 규칙을 시뮬레이션한다.
///
[TestClass]
public sealed class LegacyQueryVariableCatalogTests
{
/// 레거시 ConvertQuery 와 동일한 접두어 추출 — Substring(0, LastIndexOf("."))
private static string PrefixOf(string token)
{
var inner = token[2..^2];
return inner[..inner.LastIndexOf('.')];
}
/// 모든 토큰이 <<…>> 로 감싸이고 중복이 없어야 한다
[TestMethod]
public void Tokens_AreWellFormedAndUnique()
{
var seen = new HashSet(StringComparer.Ordinal);
foreach (var variable in LegacyQueryVariableCatalog.All)
{
StringAssert.StartsWith(variable.Token, "<<", $"{variable.Token}: '<<' 로 시작해야 합니다.");
StringAssert.EndsWith(variable.Token, ">>", $"{variable.Token}: '>>' 로 끝나야 합니다.");
Assert.IsTrue(seen.Add(variable.Token), $"중복 토큰: {variable.Token}");
Assert.IsFalse(string.IsNullOrWhiteSpace(variable.Description), $"{variable.Token}: 설명이 비어 있습니다.");
}
}
///
/// 레거시 완전일치 시뮬레이션 — 접두어가 런타임 비교 대상 3종 중 하나와 정확히 같아야 한다.
/// 축약형이나 DataRow 접근형(.item("컬럼"))이 섞이면 여기서 걸린다.
///
[TestMethod]
public void EveryToken_ResolvesUnderLegacyExactMatchRule()
{
foreach (var variable in LegacyQueryVariableCatalog.All)
{
var prefix = PrefixOf(variable.Token);
CollectionAssert.Contains(LegacyQueryVariableCatalog.Prefixes.ToList(), prefix,
$"{variable.Token}: 접두어 '{prefix}' 가 런타임 비교 대상이 아닙니다 → 치환되지 않고 SQL 에 그대로 남습니다.");
}
}
/// 접두어는 클래스 전체 이름이어야 한다 — 축약형 회귀 방지(이 버그가 실제로 있었다)
[TestMethod]
public void Prefixes_AreFullyQualifiedTypeNames()
{
foreach (var prefix in LegacyQueryVariableCatalog.Prefixes)
{
StringAssert.StartsWith(prefix, "M.", $"'{prefix}' 가 어셈블리 네임스페이스로 시작하지 않습니다.");
Assert.IsTrue(prefix.Count(c => c == '.') >= 2, $"'{prefix}' 가 클래스 전체 이름 형태가 아닙니다.");
}
}
/// 운영에서 실제로 쓰이는 토큰이 목록에 있어야 한다(2026-08-11 census 근거)
[TestMethod]
[DataRow("M.CMM.HISOperatingInfo.bzPatientInfo.ComNum")]
[DataRow("M.CMM.HISOperatingInfo.bzPatientInfo.ChtNum")]
[DataRow("M.CMM.HISOperatingInfo.bzPatientInfo.OemNum1")]
[DataRow("M.CMM.HISOperatingInfo.bzPatientInfo.OemNum2")]
[DataRow("M.CMM.HISOperatingInfo.bzPatientInfo.OemVar1")]
[DataRow("M.CMM.HISOperatingInfo.bzPatientInfo.ComNum_Refer")]
[DataRow("M.CMM.HISOperatingInfo.bzPatientInfo.AdpDtm")]
[DataRow("M.CMM.HISOperatingInfo.bzWorkInfo.WrkDte")]
public void ProductionTokens_ArePresent(string inner)
{
Assert.IsTrue(LegacyQueryVariableCatalog.All.Any(v => v.Token == $"<<{inner}>>"),
$"운영에서 쓰이는 토큰이 목록에 없습니다: <<{inner}>>");
}
}