using System; using System.Reflection; using System.Text; using Xunit; using CncModels.Enum; namespace CncModels.Tests { /// /// 测试所有 CncModels.Enum 下的字符串常量,确保值与命名约定一致。 /// 约定:字段名转换为 snake_case 小写字符串后应当与常量值一致。 /// 例如 AlertType.CollectFail 应为 "collect_fail"。 /// public class EnumTests { /// /// 遍历除 LogLevel 外的所有枚举类,验证 snake_case 命名约定 /// 覆盖场景:AlertType/CollectStatus/DataStatus/CardType/DataType/MatchBy/SegmentCloseReason/CollectorServiceStatus/ValueType /// [Fact] public void SnakeCaseEnums_ShouldMatchFieldNames() { Type[] snakeCaseEnums = new Type[] { typeof(AlertType), typeof(CollectStatus), typeof(DataStatus), typeof(CardType), typeof(DataType), typeof(MatchBy), typeof(SegmentCloseReason), typeof(CollectorServiceStatus), typeof(CncModels.Enum.ValueType) }; foreach (var t in snakeCaseEnums) { var fields = t.GetFields(BindingFlags.Public | BindingFlags.Static); Assert.True(fields.Length > 0, $"类型 {t.Name} 不包含公共静态字段。"); foreach (var f in fields) { if (f.FieldType != typeof(string)) continue; string value = (string)f.GetValue(null); string expected = ToSnakeCase(f.Name); Assert.Equal(expected, value); } } } /// /// 验证 LogLevel 枚举值为大写(数据库中 log_level 存储为大写) /// 覆盖场景:DEBUG/INFO/WARN/ERROR 全部值 /// [Fact] public void LogLevel_ShouldBeUppercase() { Assert.Equal("DEBUG", LogLevel.Debug); Assert.Equal("INFO", LogLevel.Info); Assert.Equal("WARN", LogLevel.Warn); Assert.Equal("ERROR", LogLevel.Error); } private string ToSnakeCase(string input) { if (string.IsNullOrEmpty(input)) return input; var sb = new StringBuilder(); for (int i = 0; i < input.Length; i++) { char c = input[i]; if (char.IsUpper(c)) { if (i > 0) sb.Append('_'); sb.Append(char.ToLowerInvariant(c)); } else { sb.Append(c); } } return sb.ToString(); } } }