| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733 |
- using System.Text;
- using Apq.Cfg.EncodingSupport;
- using Apq.Cfg.Sources.File;
- using static Apq.Cfg.EncodingSupport.EncodingDetectionResult;
- namespace Apq.Cfg.Tests;
- /// <summary>
- /// 编码检测相关测试
- /// </summary>
- public class EncodingTests : IDisposable
- {
- private readonly string _testDir;
- public EncodingTests()
- {
- _testDir = Path.Combine(Path.GetTempPath(), $"ApqCfgEncodingTests_{Guid.NewGuid():N}");
- Directory.CreateDirectory(_testDir);
- }
- public void Dispose()
- {
- if (Directory.Exists(_testDir))
- {
- try { Directory.Delete(_testDir, true); }
- catch { }
- }
- }
- // ========== EncodingOptions 测试 ==========
- [Fact]
- public void EncodingOptions_Default_HasCorrectValues()
- {
- // Arrange & Act
- var options = Apq.Cfg.EncodingSupport.EncodingOptions.Default;
- // Assert
- Assert.Equal(Apq.Cfg.EncodingSupport.EncodingReadStrategy.AutoDetect, options.ReadStrategy);
- Assert.Equal(Apq.Cfg.EncodingSupport.EncodingWriteStrategy.Utf8NoBom, options.WriteStrategy);
- Assert.Equal(0.6f, options.ConfidenceThreshold);
- Assert.True(options.EnableCache);
- Assert.False(options.EnableLogging);
- }
- [Fact]
- public void EncodingOptions_PowerShell_HasUtf8WithBom()
- {
- // Arrange & Act
- var options = Apq.Cfg.EncodingSupport.EncodingOptions.PowerShell;
- // Assert
- Assert.Equal(Apq.Cfg.EncodingSupport.EncodingWriteStrategy.Utf8WithBom, options.WriteStrategy);
- }
- [Fact]
- public void EncodingOptions_GetWriteEncoding_Utf8NoBom()
- {
- // Arrange
- var options = new Apq.Cfg.EncodingSupport.EncodingOptions { WriteStrategy = Apq.Cfg.EncodingSupport.EncodingWriteStrategy.Utf8NoBom };
- // Act
- var encoding = options.GetWriteEncoding();
- // Assert
- Assert.IsType<UTF8Encoding>(encoding);
- var utf8 = (UTF8Encoding)encoding;
- Assert.Empty(utf8.GetPreamble()); // 无 BOM
- }
- [Fact]
- public void EncodingOptions_GetWriteEncoding_Utf8WithBom()
- {
- // Arrange
- var options = new Apq.Cfg.EncodingSupport.EncodingOptions { WriteStrategy = Apq.Cfg.EncodingSupport.EncodingWriteStrategy.Utf8WithBom };
- // Act
- var encoding = options.GetWriteEncoding();
- // Assert
- Assert.IsType<UTF8Encoding>(encoding);
- var utf8 = (UTF8Encoding)encoding;
- Assert.Equal(3, utf8.GetPreamble().Length); // 有 BOM
- }
- [Fact]
- public void EncodingOptions_GetWriteEncoding_Preserve()
- {
- // Arrange
- Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
- var options = new Apq.Cfg.EncodingSupport.EncodingOptions { WriteStrategy = Apq.Cfg.EncodingSupport.EncodingWriteStrategy.Preserve };
- var detectedEncoding = Encoding.GetEncoding("GB2312");
- // Act
- var encoding = options.GetWriteEncoding(detectedEncoding);
- // Assert
- Assert.Equal(detectedEncoding, encoding);
- }
- [Fact]
- public void EncodingOptions_GetWriteEncoding_Specified()
- {
- // Arrange
- var specifiedEncoding = Encoding.Unicode;
- var options = new Apq.Cfg.EncodingSupport.EncodingOptions
- {
- WriteStrategy = Apq.Cfg.EncodingSupport.EncodingWriteStrategy.Specified,
- WriteEncoding = specifiedEncoding
- };
- // Act
- var encoding = options.GetWriteEncoding();
- // Assert
- Assert.Equal(specifiedEncoding, encoding);
- }
- // ========== EncodingDetectionResult 测试 ==========
- [Fact]
- public void EncodingDetectionResult_ToString_FormatsCorrectly()
- {
- // Arrange
- var result = new Apq.Cfg.EncodingSupport.EncodingDetectionResult(
- Encoding.UTF8,
- 0.95f,
- Apq.Cfg.EncodingSupport.EncodingDetectionMethod.Bom,
- true,
- "UTF-8",
- "/test/file.json");
- // Act
- var str = result.ToString();
- // Assert
- Assert.Contains("Bom", str);
- Assert.Contains("BOM", str);
- Assert.Contains("95", str); // 95%
- }
- // ========== EncodingDetector 测试 ==========
- [Fact]
- public void EncodingDetector_Detect_Utf8NoBom()
- {
- // Arrange
- var filePath = Path.Combine(_testDir, "utf8_no_bom.json");
- File.WriteAllText(filePath, """{"key": "value"}""", new UTF8Encoding(false));
- // Act
- var result = Apq.Cfg.EncodingSupport.EncodingDetector.Default.Detect(filePath);
- // Assert
- Assert.NotNull(result);
- Assert.Equal(Apq.Cfg.EncodingSupport.EncodingDetectionMethod.UtfUnknown, result.Method);
- Assert.False(result.HasBom);
- }
- [Fact]
- public void EncodingDetector_Detect_Utf8WithBom()
- {
- // Arrange
- var filePath = Path.Combine(_testDir, "utf8_with_bom.json");
- File.WriteAllText(filePath, """{"key": "value"}""", new UTF8Encoding(true));
- // Act
- var result = Apq.Cfg.EncodingSupport.EncodingDetector.Default.Detect(filePath);
- // Assert
- Assert.NotNull(result);
- Assert.Equal(Apq.Cfg.EncodingSupport.EncodingDetectionMethod.Bom, result.Method);
- Assert.True(result.HasBom);
- }
- [Fact]
- public void EncodingDetector_Detect_Utf16Le()
- {
- // Arrange
- var filePath = Path.Combine(_testDir, "utf16_le.json");
- File.WriteAllText(filePath, """{"key": "value"}""", Encoding.Unicode);
- // Act
- var result = Apq.Cfg.EncodingSupport.EncodingDetector.Default.Detect(filePath);
- // Assert
- Assert.NotNull(result);
- Assert.Equal(Apq.Cfg.EncodingSupport.EncodingDetectionMethod.Bom, result.Method);
- Assert.True(result.HasBom);
- }
- [Fact]
- public void EncodingDetector_Detect_NonExistentFile_ReturnsFallback()
- {
- // Arrange
- var filePath = Path.Combine(_testDir, "non_existent.json");
- // Act
- var result = Apq.Cfg.EncodingSupport.EncodingDetector.Default.Detect(filePath);
- // Assert
- Assert.NotNull(result);
- Assert.Equal(Apq.Cfg.EncodingSupport.EncodingDetectionMethod.Fallback, result.Method);
- Assert.Equal(Encoding.UTF8, result.Encoding);
- }
- [Fact]
- public void EncodingDetector_CustomReadMapping_OverridesDetection()
- {
- // Arrange
- var detector = new Apq.Cfg.EncodingSupport.EncodingDetector();
- var filePath = Path.Combine(_testDir, "custom_mapping.json");
- File.WriteAllText(filePath, """{"key": "value"}""", new UTF8Encoding(false));
- var customEncoding = Encoding.Unicode;
- detector.MappingConfig.AddReadMapping(filePath, EncodingMappingType.ExactPath, customEncoding, priority: 100);
- // Act
- var result = detector.Detect(filePath);
- // Assert
- Assert.Equal(Apq.Cfg.EncodingSupport.EncodingDetectionMethod.UserSpecified, result.Method);
- Assert.Equal(customEncoding, result.Encoding);
- // Cleanup
- detector.MappingConfig.RemoveReadMapping(filePath);
- }
- [Fact]
- public void EncodingDetector_Cache_ReturnsFromCache()
- {
- // Arrange
- var detector = new Apq.Cfg.EncodingSupport.EncodingDetector();
- var filePath = Path.Combine(_testDir, "cached.json");
- File.WriteAllText(filePath, """{"key": "value"}""", new UTF8Encoding(true));
- var options = new Apq.Cfg.EncodingSupport.EncodingOptions { EnableCache = true };
- // Act - 第一次检测
- var result1 = detector.Detect(filePath, options);
- // Act - 第二次检测(应该从缓存获取)
- var result2 = detector.Detect(filePath, options);
- // Assert
- Assert.Equal(Apq.Cfg.EncodingSupport.EncodingDetectionMethod.Bom, result1.Method);
- Assert.Equal(Apq.Cfg.EncodingSupport.EncodingDetectionMethod.Cached, result2.Method);
- }
- [Fact]
- public void EncodingDetector_Cache_InvalidatesOnFileChange()
- {
- // Arrange
- var detector = new Apq.Cfg.EncodingSupport.EncodingDetector();
- var filePath = Path.Combine(_testDir, "invalidate.json");
- File.WriteAllText(filePath, """{"key": "value"}""", new UTF8Encoding(true));
- var options = new Apq.Cfg.EncodingSupport.EncodingOptions { EnableCache = true };
- // Act - 第一次检测
- var result1 = detector.Detect(filePath, options);
- // 修改文件
- Thread.Sleep(100); // 确保时间戳不同
- File.WriteAllText(filePath, """{"key": "new_value"}""", new UTF8Encoding(true));
- // Act - 第二次检测(缓存应该失效)
- var result2 = detector.Detect(filePath, options);
- // Assert
- Assert.Equal(Apq.Cfg.EncodingSupport.EncodingDetectionMethod.Bom, result1.Method);
- Assert.Equal(Apq.Cfg.EncodingSupport.EncodingDetectionMethod.Bom, result2.Method); // 不是 Cached
- }
- [Fact]
- public void EncodingDetector_ExtensionMapping_ReturnsCorrectEncoding()
- {
- // Arrange
- var detector = new Apq.Cfg.EncodingSupport.EncodingDetector();
- var ps1Path = Path.Combine(_testDir, "script.ps1");
- // Act
- var encoding = detector.MappingConfig.GetWriteEncoding(ps1Path);
- // Assert
- Assert.NotNull(encoding);
- Assert.IsType<UTF8Encoding>(encoding);
- Assert.Equal(3, encoding.GetPreamble().Length); // UTF-8 BOM
- }
- [Fact]
- public void EncodingDetector_Logging_InvokesHandler()
- {
- // Arrange
- var detector = new Apq.Cfg.EncodingSupport.EncodingDetector();
- var filePath = Path.Combine(_testDir, "logging.json");
- File.WriteAllText(filePath, """{"key": "value"}""", new UTF8Encoding(true));
- Apq.Cfg.EncodingSupport.EncodingDetectionResult? loggedResult = null;
- detector.OnEncodingDetected += result => loggedResult = result;
- var options = new Apq.Cfg.EncodingSupport.EncodingOptions { EnableLogging = true };
- // Act
- detector.Detect(filePath, options);
- // Assert
- Assert.NotNull(loggedResult);
- Assert.Equal(filePath, Path.GetFullPath(loggedResult.FilePath));
- }
- [Fact]
- public void EncodingDetector_ClearCache_RemovesAllEntries()
- {
- // Arrange
- var detector = new Apq.Cfg.EncodingSupport.EncodingDetector();
- var filePath = Path.Combine(_testDir, "clear_cache.json");
- File.WriteAllText(filePath, """{"key": "value"}""", new UTF8Encoding(true));
- var options = new Apq.Cfg.EncodingSupport.EncodingOptions { EnableCache = true };
- detector.Detect(filePath, options);
- // Act
- detector.ClearCache();
- var result = detector.Detect(filePath, options);
- // Assert
- Assert.NotEqual(Apq.Cfg.EncodingSupport.EncodingDetectionMethod.Cached, result.Method);
- }
- // ========== CfgBuilder 编码选项测试 ==========
- [Fact]
- public async Task CfgBuilder_WithEncodingOptions_WritesWithCorrectEncoding()
- {
- // Arrange
- var jsonPath = Path.Combine(_testDir, "encoding_test.json");
- File.WriteAllText(jsonPath, """{}""");
- var encodingOptions = new Apq.Cfg.EncodingSupport.EncodingOptions
- {
- WriteStrategy = Apq.Cfg.EncodingSupport.EncodingWriteStrategy.Utf8WithBom
- };
- using var cfg = new CfgBuilder()
- .AddJson(jsonPath, level: 0, writeable: true, encoding: encodingOptions)
- .Build();
- // Act
- cfg.Set("Key", "Value");
- await cfg.SaveAsync();
- // Assert - 检查文件是否有 BOM
- var bytes = File.ReadAllBytes(jsonPath);
- Assert.True(bytes.Length >= 3);
- Assert.Equal(0xEF, bytes[0]);
- Assert.Equal(0xBB, bytes[1]);
- Assert.Equal(0xBF, bytes[2]);
- }
- [Fact]
- public void CfgBuilder_AddReadEncodingMapping_SetsReadMapping()
- {
- // Arrange
- var filePath = Path.Combine(_testDir, "custom_read.json");
- var customEncoding = Encoding.Unicode;
- // Act
- new CfgBuilder()
- .AddReadEncodingMapping(filePath, customEncoding);
- // Assert
- var result = FileCfgSourceBase.EncodingDetector.Detect(filePath);
- Assert.Equal(Apq.Cfg.EncodingSupport.EncodingDetectionMethod.UserSpecified, result.Method);
- Assert.Equal(customEncoding, result.Encoding);
- // Cleanup
- FileCfgSourceBase.EncodingDetector.MappingConfig.RemoveReadMapping(filePath);
- }
- [Fact]
- public void CfgBuilder_AddWriteEncodingMapping_SetsWriteMapping()
- {
- // Arrange
- var filePath = Path.Combine(_testDir, "custom_write.json");
- var customEncoding = Encoding.Unicode;
- // Act
- new CfgBuilder()
- .AddWriteEncodingMapping(filePath, customEncoding);
- // Assert
- var writeEncoding = FileCfgSourceBase.EncodingDetector.MappingConfig.GetWriteEncoding(filePath);
- Assert.NotNull(writeEncoding);
- Assert.Equal(customEncoding, writeEncoding);
- // Cleanup
- FileCfgSourceBase.EncodingDetector.MappingConfig.RemoveWriteMapping(filePath);
- }
- [Fact]
- public void EncodingDetector_SeparateReadWriteMappings_WorkIndependently()
- {
- // Arrange
- Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
- var detector = new Apq.Cfg.EncodingSupport.EncodingDetector();
- var filePath = Path.Combine(_testDir, "separate_rw.json");
- File.WriteAllText(filePath, """{"key": "value"}""", new UTF8Encoding(false));
- var readEncoding = Encoding.GetEncoding("GB2312");
- var writeEncoding = Encoding.Unicode;
- // Act
- detector.MappingConfig.AddReadMapping(filePath, EncodingMappingType.ExactPath, readEncoding, priority: 100);
- detector.MappingConfig.AddWriteMapping(filePath, EncodingMappingType.ExactPath, writeEncoding, priority: 100);
- // Assert - 读取映射
- var detectResult = detector.Detect(filePath);
- Assert.Equal(readEncoding, detectResult.Encoding);
- // Assert - 写入映射
- var customWriteEncoding = detector.MappingConfig.GetWriteEncoding(filePath);
- Assert.Equal(writeEncoding, customWriteEncoding);
- // Cleanup
- detector.MappingConfig.RemoveReadMapping(filePath);
- detector.MappingConfig.RemoveWriteMapping(filePath);
- }
- [Fact]
- public void CfgBuilder_WithEncodingDetectionLogging_RegistersHandler()
- {
- // Arrange
- var logged = false;
- // Act
- new CfgBuilder()
- .WithEncodingDetectionLogging(_ => logged = true);
- var filePath = Path.Combine(_testDir, "log_test.json");
- File.WriteAllText(filePath, """{}""");
- var options = new Apq.Cfg.EncodingSupport.EncodingOptions { EnableLogging = true };
- FileCfgSourceBase.EncodingDetector.Detect(filePath, options);
- // Assert
- Assert.True(logged);
- }
- // ========== 编码映射通配符测试 ==========
- [Fact]
- public void CfgBuilder_AddReadEncodingMappingWildcard_MatchesPattern()
- {
- // Arrange
- Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
- var customEncoding = Encoding.GetEncoding("GB2312");
- var pattern = "*.legacy.json";
- // Act
- new CfgBuilder()
- .AddReadEncodingMappingWildcard(pattern, customEncoding, priority: 100);
- var filePath = Path.Combine(_testDir, "config.legacy.json");
- File.WriteAllText(filePath, """{"key": "value"}""", new UTF8Encoding(false));
- // Assert
- var result = FileCfgSourceBase.EncodingDetector.Detect(filePath);
- Assert.Equal(EncodingDetectionMethod.UserSpecified, result.Method);
- Assert.Equal(customEncoding.CodePage, result.Encoding.CodePage);
- // Cleanup
- FileCfgSourceBase.EncodingDetector.MappingConfig.RemoveReadMapping(pattern);
- }
- [Fact]
- public void CfgBuilder_AddReadEncodingMappingWildcard_DoesNotMatchNonMatchingFile()
- {
- // Arrange
- Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
- var customEncoding = Encoding.GetEncoding("GB2312");
- var pattern = "*.legacy.json";
- // Act
- new CfgBuilder()
- .AddReadEncodingMappingWildcard(pattern, customEncoding, priority: 100);
- var filePath = Path.Combine(_testDir, "config.normal.json");
- File.WriteAllText(filePath, """{"key": "value"}""", new UTF8Encoding(true));
- // Assert - 不匹配的文件应该使用正常检测
- var result = FileCfgSourceBase.EncodingDetector.Detect(filePath);
- Assert.NotEqual(customEncoding.CodePage, result.Encoding.CodePage);
- // Cleanup
- FileCfgSourceBase.EncodingDetector.MappingConfig.RemoveReadMapping(pattern);
- }
- [Fact]
- public void CfgBuilder_AddWriteEncodingMappingWildcard_MatchesPattern()
- {
- // Arrange
- var customEncoding = new UTF8Encoding(true); // UTF-8 with BOM
- var pattern = "*.ps1";
- // Act
- new CfgBuilder()
- .AddWriteEncodingMappingWildcard(pattern, customEncoding, priority: 100);
- var filePath = Path.Combine(_testDir, "script.ps1");
- // Assert
- var writeEncoding = FileCfgSourceBase.EncodingDetector.MappingConfig.GetWriteEncoding(filePath);
- Assert.NotNull(writeEncoding);
- Assert.Equal(3, writeEncoding.GetPreamble().Length); // UTF-8 BOM
- // Cleanup
- FileCfgSourceBase.EncodingDetector.MappingConfig.RemoveWriteMapping(pattern);
- }
- // ========== 编码映射正则表达式测试 ==========
- [Fact]
- public void CfgBuilder_AddReadEncodingMappingRegex_MatchesPattern()
- {
- // Arrange
- Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
- var customEncoding = Encoding.GetEncoding("GB2312");
- var regexPattern = @"config\d+\.json$";
- // Act
- new CfgBuilder()
- .AddReadEncodingMappingRegex(regexPattern, customEncoding, priority: 100);
- var filePath = Path.Combine(_testDir, "config123.json");
- File.WriteAllText(filePath, """{"key": "value"}""", new UTF8Encoding(false));
- // Assert
- var result = FileCfgSourceBase.EncodingDetector.Detect(filePath);
- Assert.Equal(EncodingDetectionMethod.UserSpecified, result.Method);
- Assert.Equal(customEncoding.CodePage, result.Encoding.CodePage);
- // Cleanup
- FileCfgSourceBase.EncodingDetector.MappingConfig.RemoveReadMapping(regexPattern);
- }
- [Fact]
- public void CfgBuilder_AddReadEncodingMappingRegex_DoesNotMatchNonMatchingFile()
- {
- // Arrange
- Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
- var customEncoding = Encoding.GetEncoding("GB2312");
- var regexPattern = @"config\d+\.json$";
- // Act
- new CfgBuilder()
- .AddReadEncodingMappingRegex(regexPattern, customEncoding, priority: 100);
- var filePath = Path.Combine(_testDir, "configABC.json");
- File.WriteAllText(filePath, """{"key": "value"}""", new UTF8Encoding(true));
- // Assert - 不匹配的文件应该使用正常检测
- var result = FileCfgSourceBase.EncodingDetector.Detect(filePath);
- Assert.NotEqual(customEncoding.CodePage, result.Encoding.CodePage);
- // Cleanup
- FileCfgSourceBase.EncodingDetector.MappingConfig.RemoveReadMapping(regexPattern);
- }
- [Fact]
- public void CfgBuilder_AddWriteEncodingMappingRegex_MatchesPattern()
- {
- // Arrange
- var customEncoding = Encoding.Unicode;
- var regexPattern = @"logs[/\\].*\.log$";
- // Act
- new CfgBuilder()
- .AddWriteEncodingMappingRegex(regexPattern, customEncoding, priority: 100);
- var filePath = Path.Combine(_testDir, "logs", "app.log");
- // Assert
- var writeEncoding = FileCfgSourceBase.EncodingDetector.MappingConfig.GetWriteEncoding(filePath);
- Assert.NotNull(writeEncoding);
- Assert.Equal(customEncoding.CodePage, writeEncoding.CodePage);
- // Cleanup
- FileCfgSourceBase.EncodingDetector.MappingConfig.RemoveWriteMapping(regexPattern);
- }
- // ========== ConfigureEncodingMapping 委托测试 ==========
- [Fact]
- public void CfgBuilder_ConfigureEncodingMapping_AllowsCustomConfiguration()
- {
- // Arrange
- Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
- var customReadEncoding = Encoding.GetEncoding("GB2312");
- var customWriteEncoding = Encoding.Unicode;
- var filePath = Path.Combine(_testDir, "delegate_config.json");
- File.WriteAllText(filePath, """{"key": "value"}""", new UTF8Encoding(false));
- // Act
- new CfgBuilder()
- .ConfigureEncodingMapping(config =>
- {
- config.AddReadMapping(filePath, EncodingMappingType.ExactPath, customReadEncoding, priority: 100);
- config.AddWriteMapping(filePath, EncodingMappingType.ExactPath, customWriteEncoding, priority: 100);
- });
- // Assert - 读取映射
- var readResult = FileCfgSourceBase.EncodingDetector.Detect(filePath);
- Assert.Equal(EncodingDetectionMethod.UserSpecified, readResult.Method);
- Assert.Equal(customReadEncoding.CodePage, readResult.Encoding.CodePage);
- // Assert - 写入映射
- var writeEncoding = FileCfgSourceBase.EncodingDetector.MappingConfig.GetWriteEncoding(filePath);
- Assert.NotNull(writeEncoding);
- Assert.Equal(customWriteEncoding.CodePage, writeEncoding.CodePage);
- // Cleanup
- FileCfgSourceBase.EncodingDetector.MappingConfig.RemoveReadMapping(filePath);
- FileCfgSourceBase.EncodingDetector.MappingConfig.RemoveWriteMapping(filePath);
- }
- [Fact]
- public void CfgBuilder_ConfigureEncodingMapping_SupportsWildcardInDelegate()
- {
- // Arrange
- var customEncoding = new UTF8Encoding(true);
- var pattern = "*.script.ps1";
- // Act
- new CfgBuilder()
- .ConfigureEncodingMapping(config =>
- {
- config.AddWriteMapping(pattern, EncodingMappingType.Wildcard, customEncoding, priority: 100);
- });
- var filePath = Path.Combine(_testDir, "test.script.ps1");
- // Assert
- var writeEncoding = FileCfgSourceBase.EncodingDetector.MappingConfig.GetWriteEncoding(filePath);
- Assert.NotNull(writeEncoding);
- Assert.Equal(3, writeEncoding.GetPreamble().Length);
- // Cleanup
- FileCfgSourceBase.EncodingDetector.MappingConfig.RemoveWriteMapping(pattern);
- }
- // ========== WithEncodingConfidenceThreshold 测试 ==========
- [Fact]
- public void CfgBuilder_WithEncodingConfidenceThreshold_SetsThreshold()
- {
- // Arrange
- var filePath = Path.Combine(_testDir, "threshold_test.json");
- File.WriteAllText(filePath, """{"key": "value"}""", new UTF8Encoding(false));
- // Act
- var builder = new CfgBuilder()
- .WithEncodingConfidenceThreshold(0.9f);
- // Assert - 通过检测结果验证阈值设置
- // 由于阈值设置是全局的,我们只能验证方法调用不抛出异常
- Assert.NotNull(builder);
- }
- // ========== 编码映射优先级测试 ==========
- [Fact]
- public void EncodingMapping_HigherPriority_TakesPrecedence()
- {
- // Arrange
- Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
- var lowPriorityEncoding = Encoding.GetEncoding("GB2312");
- var highPriorityEncoding = Encoding.Unicode;
- var filePath = Path.Combine(_testDir, "priority_test.json");
- File.WriteAllText(filePath, """{"key": "value"}""", new UTF8Encoding(false));
- // Act - 先添加低优先级,再添加高优先级
- new CfgBuilder()
- .ConfigureEncodingMapping(config =>
- {
- config.AddReadMapping(filePath, EncodingMappingType.ExactPath, lowPriorityEncoding, priority: 10);
- config.AddReadMapping(filePath + "_high", EncodingMappingType.ExactPath, highPriorityEncoding, priority: 100);
- });
- // 使用通配符测试优先级
- var wildcardPattern = "*.priority.json";
- new CfgBuilder()
- .AddReadEncodingMappingWildcard(wildcardPattern, highPriorityEncoding, priority: 100);
- var testFile = Path.Combine(_testDir, "test.priority.json");
- File.WriteAllText(testFile, """{"key": "value"}""", new UTF8Encoding(false));
- // Assert
- var result = FileCfgSourceBase.EncodingDetector.Detect(testFile);
- Assert.Equal(highPriorityEncoding.CodePage, result.Encoding.CodePage);
- // Cleanup
- FileCfgSourceBase.EncodingDetector.MappingConfig.RemoveReadMapping(filePath);
- FileCfgSourceBase.EncodingDetector.MappingConfig.RemoveReadMapping(filePath + "_high");
- FileCfgSourceBase.EncodingDetector.MappingConfig.RemoveReadMapping(wildcardPattern);
- }
- // ========== 编码映射移除测试 ==========
- [Fact]
- public void EncodingMapping_RemoveMapping_RestoresDefaultBehavior()
- {
- // Arrange
- Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
- var customEncoding = Encoding.GetEncoding("GB2312");
- var filePath = Path.Combine(_testDir, "remove_test.json");
- File.WriteAllText(filePath, """{"key": "value"}""", new UTF8Encoding(true));
- // Act - 添加映射
- new CfgBuilder()
- .AddReadEncodingMapping(filePath, customEncoding);
- var resultWithMapping = FileCfgSourceBase.EncodingDetector.Detect(filePath);
- Assert.Equal(customEncoding.CodePage, resultWithMapping.Encoding.CodePage);
- // Act - 移除映射
- FileCfgSourceBase.EncodingDetector.MappingConfig.RemoveReadMapping(filePath);
- // Assert - 应该恢复默认检测行为
- var resultWithoutMapping = FileCfgSourceBase.EncodingDetector.Detect(filePath);
- Assert.NotEqual(customEncoding.CodePage, resultWithoutMapping.Encoding.CodePage);
- Assert.Equal(EncodingDetectionMethod.Bom, resultWithoutMapping.Method); // UTF-8 with BOM
- }
- }
|