68 lines
2.0 KiB
C#
68 lines
2.0 KiB
C#
using FsCheck;
|
||
using FsCheck.Xunit;
|
||
using HuangyanParking.Domain.Utils;
|
||
|
||
namespace HuangyanParking.Tests;
|
||
|
||
/// <summary>
|
||
/// 券码和UID生成的属性测试
|
||
/// </summary>
|
||
public class CouponCodeAndUidPropertyTests
|
||
{
|
||
/// <summary>
|
||
/// Feature: huangyan-parking-points, Property 1: 券码格式正确性
|
||
/// 对于任意生成的券码,长度为9位,由字母+数字组成,首字符不为'0'
|
||
/// Validates: Requirements 16.1, 16.2
|
||
/// </summary>
|
||
[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));
|
||
}
|
||
|
||
/// <summary>
|
||
/// Feature: huangyan-parking-points, Property 2: 券码唯一性
|
||
/// 对于任意批量生成的N个券码,所有券码互不相同
|
||
/// Validates: Requirements 16.3
|
||
/// </summary>
|
||
[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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Feature: huangyan-parking-points, Property 3: UID格式正确性
|
||
/// 对于任意生成的UID,长度为6位,纯数字,首位不为0
|
||
/// Validates: Requirements 1.3
|
||
/// </summary>
|
||
[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));
|
||
}
|
||
}
|