using System.ComponentModel;
using Common.Utils;
namespace Common.Test;
///
/// EnumHelper 枚举工具测试
/// 展示枚举解析、描述获取、标志位操作等功能
///
[TestClass]
public class EnumHelperTests
{
#region 测试枚举定义
///
/// 订单状态枚举
///
public enum OrderStatus
{
[System.ComponentModel.Description("待支付")]
Pending = 0,
[System.ComponentModel.Description("已支付")]
Paid = 1,
[System.ComponentModel.Description("已发货")]
Shipped = 2,
[System.ComponentModel.Description("已完成")]
Completed = 3,
[System.ComponentModel.Description("已取消")]
Cancelled = 4
}
///
/// 用户权限枚举(标志位)
///
[Flags]
public enum UserPermissions
{
[System.ComponentModel.Description("无权限")]
None = 0,
[System.ComponentModel.Description("读取权限")]
Read = 1,
[System.ComponentModel.Description("写入权限")]
Write = 2,
[System.ComponentModel.Description("删除权限")]
Delete = 4,
[System.ComponentModel.Description("管理权限")]
Admin = 8,
[System.ComponentModel.Description("全部权限")]
All = Read | Write | Delete | Admin
}
///
/// 日志级别(无描述)
///
public enum LogLevel
{
Debug = 1,
Info = 2,
Warning = 3,
Error = 4,
Fatal = 5
}
#endregion
#region 枚举解析测试
[TestMethod]
public void Parse_ValidString_ReturnsEnum()
{
// Act
var result1 = EnumHelper.Parse("Paid");
var result2 = EnumHelper.Parse("paid"); // 忽略大小写
// Assert
Assert.IsNotNull(result1);
Assert.AreEqual(OrderStatus.Paid, result1.Value);
Assert.IsNotNull(result2);
Assert.AreEqual(OrderStatus.Paid, result2.Value);
}
[TestMethod]
public void Parse_InvalidString_ReturnsNull()
{
// Act
var result = EnumHelper.Parse("InvalidValue");
// Assert
Assert.IsNull(result);
}
[TestMethod]
public void ParseOrDefault_InvalidString_ReturnsDefaultValue()
{
// Act
var result = EnumHelper.ParseOrDefault("InvalidValue", OrderStatus.Pending);
// Assert
Assert.AreEqual(OrderStatus.Pending, result);
}
[TestMethod]
public void ParseFromInt_ValidValue_ReturnsEnum()
{
// Act
var result = EnumHelper.ParseFromInt(2);
// Assert
Assert.IsNotNull(result);
Assert.AreEqual(OrderStatus.Shipped, result.Value);
}
[TestMethod]
public void ParseFromInt_InvalidValue_ReturnsNull()
{
// Act
var result = EnumHelper.ParseFromInt(999);
// Assert
Assert.IsNull(result);
}
[TestMethod]
public void ParseFromDescription_ValidDescription_ReturnsEnum()
{
// Act
var result = EnumHelper.ParseFromDescription("已支付");
// Assert
Assert.IsNotNull(result);
Assert.AreEqual(OrderStatus.Paid, result.Value);
}
[TestMethod]
public void ParseFromDescription_InvalidDescription_ReturnsNull()
{
// Act
var result = EnumHelper.ParseFromDescription("不存在的状态");
// Assert
Assert.IsNull(result);
}
#endregion
#region 枚举描述测试
[TestMethod]
public void GetDescription_WithDescriptionAttribute_ReturnsDescription()
{
// Arrange
var status = OrderStatus.Paid;
// Act
var description = status.GetDescription();
// Assert
Assert.AreEqual("已支付", description);
}
[TestMethod]
public void GetDescription_WithoutDescriptionAttribute_ReturnsEnumName()
{
// Arrange
var level = LogLevel.Error;
// Act
var description = level.GetDescription();
// Assert
Assert.AreEqual("Error", description);
}
[TestMethod]
public void GetAllDescriptions_ReturnsAllDescriptions()
{
// Act
var descriptions = EnumHelper.GetAllDescriptions();
// Assert
Assert.AreEqual(5, descriptions.Count);
Assert.AreEqual("待支付", descriptions[OrderStatus.Pending]);
Assert.AreEqual("已支付", descriptions[OrderStatus.Paid]);
Assert.AreEqual("已完成", descriptions[OrderStatus.Completed]);
}
#endregion
#region 枚举列表测试
[TestMethod]
public void GetValues_ReturnsAllValues()
{
// Act
var values = EnumHelper.GetValues();
// Assert
Assert.AreEqual(5, values.Length);
CollectionAssert.Contains(values, OrderStatus.Pending);
CollectionAssert.Contains(values, OrderStatus.Paid);
CollectionAssert.Contains(values, OrderStatus.Shipped);
}
[TestMethod]
public void GetNames_ReturnsAllNames()
{
// Act
var names = EnumHelper.GetNames();
// Assert
Assert.AreEqual(5, names.Length);
CollectionAssert.Contains(names, "Pending");
CollectionAssert.Contains(names, "Paid");
CollectionAssert.Contains(names, "Shipped");
}
[TestMethod]
public void GetOptions_ReturnsListForDropdown()
{
// Act
var options = EnumHelper.GetOptions();
// Assert
Assert.AreEqual(5, options.Count);
var paidOption = options.First(o => o.Value == 1);
Assert.AreEqual("Paid", paidOption.Name);
Assert.AreEqual("已支付", paidOption.Description);
Assert.AreEqual("已支付", paidOption.DisplayText);
}
[TestMethod]
public void GetDictionary_ReturnsValueNamePairs()
{
// Act
var dict = EnumHelper.GetDictionary();
// Assert
Assert.AreEqual(5, dict.Count);
Assert.AreEqual("Paid", dict[1]);
Assert.AreEqual("Shipped", dict[2]);
}
[TestMethod]
public void GetDictionaryWithDescription_ReturnsValueDescriptionPairs()
{
// Act
var dict = EnumHelper.GetDictionaryWithDescription();
// Assert
Assert.AreEqual(5, dict.Count);
Assert.AreEqual("已支付", dict[1]);
Assert.AreEqual("已发货", dict[2]);
}
#endregion
#region 枚举验证测试
[TestMethod]
public void IsDefined_ValidValue_ReturnsTrue()
{
// Act & Assert
Assert.IsTrue(EnumHelper.IsDefined(1));
Assert.IsTrue(EnumHelper.IsDefined("Paid"));
Assert.IsTrue(EnumHelper.IsDefined(OrderStatus.Paid));
}
[TestMethod]
public void IsDefined_InvalidValue_ReturnsFalse()
{
// Act & Assert
Assert.IsFalse(EnumHelper.IsDefined(999));
Assert.IsFalse(EnumHelper.IsDefined("InvalidStatus"));
}
#endregion
#region 标志位枚举操作测试
[TestMethod]
public void HasFlag_ChecksFlagCorrectly()
{
// Arrange
var permissions = UserPermissions.Read | UserPermissions.Write;
// Act & Assert
Assert.IsTrue(permissions.HasFlag(UserPermissions.Read));
Assert.IsTrue(permissions.HasFlag(UserPermissions.Write));
Assert.IsFalse(permissions.HasFlag(UserPermissions.Delete));
}
[TestMethod]
public void AddFlag_AddsNewFlag()
{
// Arrange
var permissions = UserPermissions.Read;
// Act
var newPermissions = permissions.AddFlag(UserPermissions.Write);
// Assert
Assert.IsTrue(newPermissions.HasFlag(UserPermissions.Read));
Assert.IsTrue(newPermissions.HasFlag(UserPermissions.Write));
}
[TestMethod]
public void RemoveFlag_RemovesExistingFlag()
{
// Arrange
var permissions = UserPermissions.Read | UserPermissions.Write | UserPermissions.Delete;
// Act
var newPermissions = permissions.RemoveFlag(UserPermissions.Write);
// Assert
Assert.IsTrue(newPermissions.HasFlag(UserPermissions.Read));
Assert.IsFalse(newPermissions.HasFlag(UserPermissions.Write));
Assert.IsTrue(newPermissions.HasFlag(UserPermissions.Delete));
}
[TestMethod]
public void ToggleFlag_TogglesFlag()
{
// Arrange
var permissions = UserPermissions.Read;
// Act: 切换 Write(添加)
var withWrite = permissions.ToggleFlag(UserPermissions.Write);
Assert.IsTrue(withWrite.HasFlag(UserPermissions.Write));
// Act: 再次切换 Write(移除)
var withoutWrite = withWrite.ToggleFlag(UserPermissions.Write);
Assert.IsFalse(withoutWrite.HasFlag(UserPermissions.Write));
}
[TestMethod]
public void GetFlags_ReturnsAllSetFlags()
{
// Arrange
var permissions = UserPermissions.Read | UserPermissions.Write | UserPermissions.Admin;
// Act
var flags = permissions.GetFlags().ToList();
// Assert: None 不应该包含在内(因为值是 0)
Assert.IsTrue(flags.Contains(UserPermissions.Read));
Assert.IsTrue(flags.Contains(UserPermissions.Write));
Assert.IsTrue(flags.Contains(UserPermissions.Admin));
Assert.IsFalse(flags.Contains(UserPermissions.Delete));
}
[TestMethod]
public void CombineFlags_CombinesMultipleFlags()
{
// Act
var combined = EnumHelper.CombineFlags(
UserPermissions.Read,
UserPermissions.Write,
UserPermissions.Delete
);
// Assert
Assert.IsTrue(combined.HasFlag(UserPermissions.Read));
Assert.IsTrue(combined.HasFlag(UserPermissions.Write));
Assert.IsTrue(combined.HasFlag(UserPermissions.Delete));
Assert.IsFalse(combined.HasFlag(UserPermissions.Admin));
}
#endregion
#region 枚举转换测试
[TestMethod]
public void ToInt_ConvertsToInteger()
{
// Arrange
var status = OrderStatus.Paid;
// Act
var intValue = status.ToInt();
// Assert
Assert.AreEqual(1, intValue);
}
[TestMethod]
public void ToLong_ConvertsToLong()
{
// Arrange
var status = OrderStatus.Shipped;
// Act
var longValue = status.ToLong();
// Assert
Assert.AreEqual(2L, longValue);
}
[TestMethod]
public void ToEnum_ConvertsIntToEnum()
{
// Arrange
var value = 3;
// Act
var status = value.ToEnum();
// Assert
Assert.AreEqual(OrderStatus.Completed, status);
}
#endregion
#region 枚举信息测试
[TestMethod]
public void GetCount_ReturnsEnumCount()
{
// Act
var count = EnumHelper.GetCount();
// Assert
Assert.AreEqual(5, count);
}
[TestMethod]
public void GetMinValue_ReturnsSmallestValue()
{
// Act
var min = EnumHelper.GetMinValue();
// Assert
Assert.AreEqual(OrderStatus.Pending, min);
}
[TestMethod]
public void GetMaxValue_ReturnsLargestValue()
{
// Act
var max = EnumHelper.GetMaxValue();
// Assert
Assert.AreEqual(OrderStatus.Cancelled, max);
}
[TestMethod]
public void IsFlagsEnum_DetectsFlagsAttribute()
{
// Act
var isFlagsEnum = EnumHelper.IsFlagsEnum();
var isNotFlagsEnum = EnumHelper.IsFlagsEnum();
// Assert
Assert.IsTrue(isFlagsEnum);
Assert.IsFalse(isNotFlagsEnum);
}
#endregion
#region 枚举比较测试
[TestMethod]
public void Equals_ComparesEnumValues()
{
// Act & Assert
Assert.IsTrue(EnumHelper.Equals(OrderStatus.Paid, OrderStatus.Paid));
Assert.IsFalse(EnumHelper.Equals(OrderStatus.Paid, OrderStatus.Pending));
}
[TestMethod]
public void In_ChecksIfValueInList()
{
// Arrange
var status = OrderStatus.Paid;
// Act & Assert
Assert.IsTrue(status.In(OrderStatus.Pending, OrderStatus.Paid, OrderStatus.Shipped));
Assert.IsFalse(status.In(OrderStatus.Completed, OrderStatus.Cancelled));
}
[TestMethod]
public void NotIn_ChecksIfValueNotInList()
{
// Arrange
var status = OrderStatus.Paid;
// Act & Assert
Assert.IsFalse(status.NotIn(OrderStatus.Pending, OrderStatus.Paid, OrderStatus.Shipped));
Assert.IsTrue(status.NotIn(OrderStatus.Completed, OrderStatus.Cancelled));
}
#endregion
#region 随机枚举测试
[TestMethod]
public void GetRandom_ReturnsValidEnum()
{
// Act
var random = EnumHelper.GetRandom();
// Assert
Assert.IsTrue(EnumHelper.IsDefined(random));
}
[TestMethod]
public void GetRandomExcept_ExcludesSpecifiedValues()
{
// Act: 多次获取随机值,确保不包含排除的值
for (var i = 0; i < 10; i++)
{
var random = EnumHelper.GetRandomExcept(OrderStatus.Pending, OrderStatus.Cancelled);
// Assert
Assert.IsTrue(random.NotIn(OrderStatus.Pending, OrderStatus.Cancelled));
}
}
#endregion
#region 实际应用场景测试
[TestMethod]
public void Scenario_OrderStatusWorkflow()
{
// Arrange: 模拟订单状态流转
var currentStatus = OrderStatus.Pending;
// Act: 支付订单
currentStatus = OrderStatus.Paid;
Assert.AreEqual("已支付", currentStatus.GetDescription());
// Act: 发货
currentStatus = OrderStatus.Shipped;
Assert.AreEqual("已发货", currentStatus.GetDescription());
// Assert: 检查状态是否在允许的范围内
var validStatuses = new[] { OrderStatus.Shipped, OrderStatus.Completed };
Assert.IsTrue(currentStatus.In(validStatuses));
}
[TestMethod]
public void Scenario_PermissionManagement()
{
// Arrange: 初始化普通用户权限
var userPermissions = UserPermissions.Read;
// Act: 升级为编辑权限
userPermissions = userPermissions.AddFlag(UserPermissions.Write);
Assert.IsTrue(userPermissions.HasFlag(UserPermissions.Write));
// Act: 再添加删除权限
userPermissions = userPermissions.AddFlag(UserPermissions.Delete);
// Assert: 验证权限
var grantedPermissions = userPermissions.GetFlags().ToList();
Assert.AreEqual(3, grantedPermissions.Count);
Assert.IsTrue(grantedPermissions.Contains(UserPermissions.Read));
Assert.IsTrue(grantedPermissions.Contains(UserPermissions.Write));
Assert.IsTrue(grantedPermissions.Contains(UserPermissions.Delete));
// Act: 撤销写入权限
userPermissions = userPermissions.RemoveFlag(UserPermissions.Write);
Assert.IsFalse(userPermissions.HasFlag(UserPermissions.Write));
}
[TestMethod]
public void Scenario_DropdownBinding()
{
// Arrange: 模拟为前端下拉框准备数据
var statusOptions = EnumHelper.GetOptions();
// Act: 转换为前端所需的格式
var dropdownData = statusOptions.Select(o => new
{
Value = o.Value,
Text = o.DisplayText
}).ToList();
// Assert
Assert.AreEqual(5, dropdownData.Count);
Assert.AreEqual("待支付", dropdownData[0].Text);
Assert.AreEqual(0, dropdownData[0].Value);
}
[TestMethod]
public void Scenario_StatusValidation()
{
// Arrange: 从前端接收状态值
var statusFromFrontend = 2;
// Act: 验证并转换
if (EnumHelper.IsDefined(statusFromFrontend))
{
var status = statusFromFrontend.ToEnum();
var description = status.GetDescription();
// Assert
Assert.AreEqual(OrderStatus.Shipped, status);
Assert.AreEqual("已发货", description);
}
else
{
Assert.Fail("Invalid status value");
}
}
[TestMethod]
public void Scenario_ParseUserInput()
{
// Arrange: 用户输入的状态名称
var userInput = "paid"; // 可能是小写
// Act: 解析
var status = EnumHelper.Parse(userInput);
// Assert
Assert.IsNotNull(status);
Assert.AreEqual(OrderStatus.Paid, status.Value);
Assert.AreEqual("已支付", status.Value.GetDescription());
}
#endregion
}