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

68 lines
2.0 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>
/// 券码和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));
}
}