using FsCheck; using FsCheck.Xunit; using HuangyanParking.Domain.Utils; namespace HuangyanParking.Tests; /// /// 核销验证的属性测试 /// public class VerifyPropertyTests { // 自定义生成器:生成有效的优惠券状态 private static readonly string[] ValidStatuses = ["unused", "used", "expired"]; /// /// Feature: huangyan-parking-points, Property 10: 券码验证正确性 /// 券码存在且未使用且属于当前门店则通过,否则失败并返回错误原因 /// Validates: Requirements 11.3, 11.5, 12.2 /// [Property(MaxTest = 100)] public bool CouponVerify_ShouldValidateCorrectly( bool couponExists, byte statusIndex, PositiveInt couponStoreIdWrapper, PositiveInt verifyStoreIdWrapper) { // 从有效状态中选取 var status = couponExists ? ValidStatuses[statusIndex % ValidStatuses.Length] : null; var couponStoreId = couponStoreIdWrapper.Get; var verifyStoreId = verifyStoreIdWrapper.Get; var result = CouponVerifier.Validate(couponExists, status, couponStoreId, verifyStoreId); if (!couponExists) { // 券码不存在 → 失败 return !result.IsValid && result.ErrorMessage == "券码无效"; } if (status == "used") { return !result.IsValid && result.ErrorMessage == "优惠券已使用"; } if (status == "expired") { return !result.IsValid && result.ErrorMessage == "优惠券已过期"; } if (status == "unused" && couponStoreId != verifyStoreId) { return !result.IsValid && result.ErrorMessage == "该优惠券不适用于本门店"; } if (status == "unused" && couponStoreId == verifyStoreId) { // 全部条件满足 → 通过 return result.IsValid; } // 其他异常状态 → 失败 return !result.IsValid; } /// /// Feature: huangyan-parking-points, Property 11: 核销操作正确性 /// 核销后券状态变为已使用,用户端查询反映已使用状态 /// Validates: Requirements 11.4, 11.6 /// [Property(MaxTest = 100)] public bool CouponVerify_AfterVerification_StatusShouldBeUsed() { // 对于未使用的优惠券执行核销 var newStatus = CouponVerifier.ApplyVerification("unused"); // 核销后状态应为已使用 return newStatus == "used"; } }