using Paca.Core.Config; using Xunit; namespace Paca.Tests.Core; public class WorkspaceEncodingSanitizerTests { [Fact] public void IsCorrupted_ReturnsTrue_ForUnicodeReplacementAndMojibake() { // Corrupted characters found in real user config.json string corrupted1 = "\uFFFD\u06FE\uFFFD"; string corrupted2 = "\uFFFD\uFFFD\uFFFD\uFFFD"; string corrupted3 = "\uFFFD\u043D\uFFFD"; string corrupted4 = "??"; string empty = " "; Assert.True(WorkspaceConfigSanitizer.IsCorrupted(corrupted1)); Assert.True(WorkspaceConfigSanitizer.IsCorrupted(corrupted2)); Assert.True(WorkspaceConfigSanitizer.IsCorrupted(corrupted3)); Assert.True(WorkspaceConfigSanitizer.IsCorrupted(corrupted4)); Assert.True(WorkspaceConfigSanitizer.IsCorrupted(empty)); Assert.True(WorkspaceConfigSanitizer.IsCorrupted(null)); } [Fact] public void IsCorrupted_ReturnsFalse_ForValidKoreanAndEnglishNames() { Assert.False(WorkspaceConfigSanitizer.IsCorrupted("작업")); Assert.False(WorkspaceConfigSanitizer.IsCorrupted("개인")); Assert.False(WorkspaceConfigSanitizer.IsCorrupted("학습")); Assert.False(WorkspaceConfigSanitizer.IsCorrupted("기본")); Assert.False(WorkspaceConfigSanitizer.IsCorrupted("Work")); Assert.False(WorkspaceConfigSanitizer.IsCorrupted("Research 2026")); } [Fact] public void Sanitize_ReplacesAllCorruptedNamesWithCleanDefaults() { var corruptedList = new List { "\uFFFD\u06FE\uFFFD", "\uFFFD\uFFFD\uFFFD\uFFFD", "\uFFFD\u043D\uFFFD" }; var sanitized = WorkspaceConfigSanitizer.Sanitize(corruptedList); Assert.NotNull(sanitized); Assert.NotEmpty(sanitized); Assert.All(sanitized, name => Assert.False(WorkspaceConfigSanitizer.IsCorrupted(name))); Assert.Contains("작업", sanitized); Assert.Contains("개인", sanitized); Assert.Contains("학습", sanitized); } [Fact] public void Sanitize_PreservesValidNamesAndFiltersCorrupted() { var mixedList = new List { "프로젝트A", "\uFFFD\u06FE\uFFFD", "디자인" }; var sanitized = WorkspaceConfigSanitizer.Sanitize(mixedList); Assert.Equal(2, sanitized.Count); Assert.Equal("프로젝트A", sanitized[0]); Assert.Equal("디자인", sanitized[1]); } [Fact] public void AppConfig_Sanitize_CleansCorruptedWorkspaceNames() { var config = new AppConfig { WorkspaceNames = new List { "\uFFFD\u06FE\uFFFD", "\uFFFD\uFFFD\uFFFD\uFFFD" } }; config.Sanitize(); Assert.NotNull(config.WorkspaceNames); Assert.All(config.WorkspaceNames, name => Assert.False(WorkspaceConfigSanitizer.IsCorrupted(name))); Assert.Equal("작업", config.WorkspaceNames[0]); } }