78 lines
2.9 KiB
C#
78 lines
2.9 KiB
C#
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;
|
||
}
|
||
}
|