You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
haoliang-net/tests/CncModels.Tests/EnumTests.cs

84 lines
2.8 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Reflection;
using System.Text;
using Xunit;
using CncModels.Enum;
namespace CncModels.Tests
{
/// <summary>
/// 测试所有 CncModels.Enum 下的字符串常量,确保值与命名约定一致。
/// 约定:字段名转换为 snake_case 小写字符串后应当与常量值一致。
/// 例如 AlertType.CollectFail 应为 "collect_fail"。
/// </summary>
public class EnumTests
{
/// <summary>
/// 遍历除 LogLevel 外的所有枚举类,验证 snake_case 命名约定
/// 覆盖场景AlertType/CollectStatus/DataStatus/CardType/DataType/MatchBy/SegmentCloseReason/CollectorServiceStatus/ValueType
/// </summary>
[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);
}
}
}
/// <summary>
/// 验证 LogLevel 枚举值为大写(数据库中 log_level 存储为大写)
/// 覆盖场景DEBUG/INFO/WARN/ERROR 全部值
/// </summary>
[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();
}
}
}