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