using SheetMe.Core.Serialization;
namespace SheetMe.Core.Tests;
/// WinForms MaskedTextBox 마스크 → 표시 문자열 변환 테스트.
[TestClass]
public sealed class LegacyMaskTests
{
/// 운영 실사용 마스크 상위 항목 — 2026-08-11 활성 디자인 전수 census 근거
[TestMethod]
[DataRow("0000년 90월 90일", "____년 __월 __일")] // 198건 — 최다
[DataRow("0000-00-00", "____-__-__")] // 51건
[DataRow("90:90", "__:__")] // 36건
[DataRow("90시90분", "__시__분")] // 22건
[DataRow("0000.00.00.", "____.__.__.")] // 21건
[DataRow("90월 90일", "__월 __일")] // 15건 — 연속 공백 보존
[DataRow("000-9000-0000", "___-____-____")] // 6건
[DataRow("( 90 : 00 )", "( __ : __ )")]
[DataRow("####/##/## ##:##", "____/__/__ __:__")] // # 지시자
[DataRow("0000년 90월 90일 90시 90분", "____년 __월 __일 __시 __분")]
public void ToPromptDisplay_ProductionMasks(string mask, string expected)
{
Assert.AreEqual(expected, LegacyMask.ToPromptDisplay(mask));
}
/// 이스케이프 — 백슬래시 다음 문자는 리터럴(운영에 '2\000년' 형태가 존재)
[TestMethod]
[DataRow(@"2\000년", "20__년")]
[DataRow(@"2\000년 90월 90일", "20__년 __월 __일")]
[DataRow(@"\9\0", "90")]
public void ToPromptDisplay_EscapedLiterals(string mask, string expected)
{
Assert.AreEqual(expected, LegacyMask.ToPromptDisplay(mask));
}
/// 문자·영숫자 지시자도 한 자리를 소비한다(운영 미사용이나 규약상 지원)
[TestMethod]
[DataRow("LLL", "___")]
[DataRow("???", "___")]
[DataRow("AAA", "___")]
[DataRow("aaa", "___")]
[DataRow("&&&", "___")]
[DataRow("CCC", "___")]
public void ToPromptDisplay_CharacterDirectives(string mask, string expected)
{
Assert.AreEqual(expected, LegacyMask.ToPromptDisplay(mask));
}
/// 대소문자 변환자는 자리를 차지하지 않고 표시에도 나오지 않는다
[TestMethod]
[DataRow(">LLL", "___")]
[DataRow("LL|LL", "____")]
public void ToPromptDisplay_CaseModifiersAreInvisible(string mask, string expected)
{
Assert.AreEqual(expected, LegacyMask.ToPromptDisplay(mask));
}
/// PromptChar 지정 — 운영엔 0건이지만 속성이 있으면 반영해야 한다
[TestMethod]
public void ToPromptDisplay_HonorsPromptChar()
{
Assert.AreEqual("0000년 00월 00일", LegacyMask.ToPromptDisplay("0000년 90월 90일", '0'));
Assert.AreEqual("####-##-##", LegacyMask.ToPromptDisplay("0000-00-00", '#'));
Assert.AreEqual(" - - ", LegacyMask.ToPromptDisplay("0000-00-00", ' '));
}
/// 빈 마스크·null 안전
[TestMethod]
public void ToPromptDisplay_EmptyInputs()
{
Assert.AreEqual(string.Empty, LegacyMask.ToPromptDisplay(null));
Assert.AreEqual(string.Empty, LegacyMask.ToPromptDisplay(string.Empty));
}
/// 끝에 홀로 남은 백슬래시는 리터럴로 — 인덱스 초과로 죽지 않아야 한다
[TestMethod]
public void ToPromptDisplay_TrailingBackslashIsLiteral()
{
Assert.AreEqual(@"__\", LegacyMask.ToPromptDisplay(@"00\"));
}
///
/// 표시 길이는 마스크의 시각 길이와 같아야 한다(변환자·이스케이프 제외).
/// 길이가 달라지면 캔버스에서 필드 폭이 어긋나 보인다.
///
[TestMethod]
[DataRow("0000년 90월 90일")]
[DataRow("0000.00.00.")]
[DataRow("( 90 : 00 )")]
public void ToPromptDisplay_PreservesVisibleLength(string mask)
{
Assert.AreEqual(mask.Length, LegacyMask.ToPromptDisplay(mask).Length);
}
}