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";
}
}