using System.Text.RegularExpressions; using Admin.NET.Plugin.AiDOP.DataPlatform.Sequence; using Admin.NET.Plugin.AiDOP.Supply; using Xunit; namespace Admin.NET.Plugin.AiDOP.Tests.DataPlatform; /// /// WP9 S3:本库 NumberRuleFormatter 与 165 NbrSequenceFormatter 对同一规则输出逐字符相同。 /// public class PickBillNumberParityTests { private static readonly Regex Sm165Pattern = new(@"^SM[0-9]{8}[0-9]{3}$", RegexOptions.Compiled); [Theory] [InlineData("S", "M", "", "YYYYMMDD", 999, 1, "2026-08-09", "SM20260809001")] [InlineData("S", "M", "", "YYYYMMDD", 999, 42, "2026-08-09", "SM20260809042")] [InlineData("S", "M", "", "YYYYMMDD", 999, 999, "2026-05-10", "SM20260510999")] [InlineData("P", "W", "", "YYYYMMDD", 9999, 1, "2026-05-10", "PW202605100001")] [InlineData("D", "", "", "YYYYMMDD", 99999, 1, "2026-05-10", "D2026051000001")] public void Formatters_SameInputs_ProduceIdenticalNumbers( string pre1, string pre2, string pre3, string dateType, int maxValue, int serial, string nowIso, string expected) { var now = DateTime.Parse(nowIso); var local = NumberRuleFormatter.BuildNumber(pre1, pre2, pre3, dateType, true, serial, maxValue, now); var norm = NbrSequenceFormatter.NormalizeDateFormat(dateType); var (_, dateStr) = NbrSequenceFormatter.ResolvePeriod(norm, now); var pad = NbrSequenceFormatter.ResolvePadWidth(maxValue); var mes = NbrSequenceFormatter.BuildNumber(pre1, pre2, pre3, dateStr, serial, pad); Assert.Equal(expected, local); Assert.Equal(expected, mes); Assert.Equal(local, mes); } [Fact] public void SmMaxValue999_PadWidthIsThree() { Assert.Equal(3, NbrSequenceFormatter.ResolvePadWidth(999)); Assert.Equal(3, NumberRuleFormatter.ResolveSerialWidth(999)); } [Fact] public void SmxFallback_DoesNotMatch165Pattern() { var smx = "SMX" + DateTime.Now.ToString("yyyyMMddHHmmss") + "12345"; Assert.False(Sm165Pattern.IsMatch(smx)); Assert.True(Sm165Pattern.IsMatch("SM20260809001")); } }