huangye-parking/server/tests/HuangyanParking.Tests/PointsAndExchangePropertyTests.cs
2026-02-28 17:35:49 +08:00

78 lines
2.9 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using FsCheck;
using FsCheck.Xunit;
using HuangyanParking.Domain.Utils;
namespace HuangyanParking.Tests;
/// <summary>
/// 积分计算和兑换的属性测试
/// </summary>
public class PointsAndExchangePropertyTests
{
/// <summary>
/// Feature: huangyan-parking-points, Property 7: 积分计算正确性
/// 对于任意充电金额和积分规则,计算结果应等于 floor(充电金额/规则金额)*规则积分值
/// Validates: Requirements 14.3
/// </summary>
[Property(MaxTest = 100)]
public bool Points_Calculation_ShouldMatchFormula(PositiveInt chargeAmountInt, PositiveInt ruleAmountInt, PositiveInt rulePointsInt)
{
// 使用正整数构造合理的金额转为decimal模拟元为单位
var chargeAmount = (decimal)chargeAmountInt.Get;
var ruleChargeAmount = (decimal)ruleAmountInt.Get;
var rulePointsValue = rulePointsInt.Get;
var result = PointsCalculator.Calculate(chargeAmount, ruleChargeAmount, rulePointsValue);
var expected = (int)Math.Floor(chargeAmount / ruleChargeAmount) * rulePointsValue;
return result == expected;
}
/// <summary>
/// Feature: huangyan-parking-points, Property 8: 积分兑换校验正确性
/// 余额>=所需积分时兑换成功且余额减少,余额<所需积分时拒绝且余额不变
/// Validates: Requirements 6.2, 6.3, 6.4
/// </summary>
[Property(MaxTest = 100)]
public bool Points_Exchange_ShouldValidateCorrectly(NonNegativeInt balanceWrapper, PositiveInt requiredWrapper)
{
var balance = balanceWrapper.Get;
var required = requiredWrapper.Get;
var canExchange = PointsCalculator.CanExchange(balance, required);
var newBalance = PointsCalculator.Deduct(balance, required);
if (balance >= required)
{
// 余额充足:兑换成功,余额减少对应值
return canExchange && newBalance.HasValue && newBalance.Value == balance - required;
}
else
{
// 余额不足拒绝兑换余额不变返回null
return !canExchange && !newBalance.HasValue;
}
}
/// <summary>
/// Feature: huangyan-parking-points, Property 9: 优惠券兑换不变量
/// 兑换后模板剩余数量减1用户持有数量加1
/// Validates: Requirements 6.4
/// </summary>
[Property(MaxTest = 100)]
public bool Coupon_Exchange_Invariant_ShouldHold(PositiveInt remainingWrapper, NonNegativeInt userCountWrapper)
{
var templateRemaining = remainingWrapper.Get;
var userCouponCount = userCountWrapper.Get;
// 模拟兑换操作
var newRemaining = templateRemaining - 1;
var newUserCount = userCouponCount + 1;
// 不变量模板剩余减1用户持有加1
return newRemaining == templateRemaining - 1
&& newUserCount == userCouponCount + 1
&& newRemaining >= 0;
}
}