using FsCheck; using FsCheck.Xunit; using HuangyanParking.Domain.Utils; namespace HuangyanParking.Tests; /// /// 券码和UID生成的属性测试 /// public class CouponCodeAndUidPropertyTests { /// /// Feature: huangyan-parking-points, Property 1: 券码格式正确性 /// 对于任意生成的券码,长度为9位,由字母+数字组成,首字符不为'0' /// Validates: Requirements 16.1, 16.2 /// [Property(MaxTest = 100)] public bool CouponCode_ShouldHaveValidFormat() { var code = CouponCodeGenerator.Generate(); // 长度为9位 if (code.Length != 9) return false; // 首字符不为'0' if (code[0] == '0') return false; // 所有字符由字母+数字组成 return code.All(c => char.IsLetterOrDigit(c)); } /// /// Feature: huangyan-parking-points, Property 2: 券码唯一性 /// 对于任意批量生成的N个券码,所有券码互不相同 /// Validates: Requirements 16.3 /// [Property(MaxTest = 100)] public bool CouponCodes_ShouldBeUnique(PositiveInt countWrapper) { // 限制批量数量在2-50之间 var count = Math.Clamp(countWrapper.Get, 2, 50); var codes = Enumerable.Range(0, count) .Select(_ => CouponCodeGenerator.Generate()) .ToList(); return codes.Distinct().Count() == codes.Count; } /// /// Feature: huangyan-parking-points, Property 3: UID格式正确性 /// 对于任意生成的UID,长度为6位,纯数字,首位不为0 /// Validates: Requirements 1.3 /// [Property(MaxTest = 100)] public bool Uid_ShouldHaveValidFormat() { var uid = UidGenerator.Generate(); // 长度为6位 if (uid.Length != 6) return false; // 首位不为0 if (uid[0] == '0') return false; // 纯数字 return uid.All(c => char.IsDigit(c)); } }