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();
}
}
}