using Admin.NET.Plugin.AiDOP.DataPlatform.Sequence; using Xunit; namespace Admin.NET.Plugin.AiDOP.Tests.DataPlatform; public class NbrSequenceFormatterTests { [Fact] public void NormalizeDateFormat_StripsCommas() { Assert.Equal("YYYYMMDD", NbrSequenceFormatter.NormalizeDateFormat("YYYY,MM,DD")); Assert.Equal("", NbrSequenceFormatter.NormalizeDateFormat(null)); } [Theory] [InlineData("", "", "2026-05-10")] [InlineData("YYMMDD", "260510", "2026-05-10")] [InlineData("YYYYMMDD", "20260510", "2026-05-10")] [InlineData("YYYYMM", "202605", "2026-05-01")] [InlineData("yyyymmdd", "20260510", "2026-05-10")] // 陷阱 #4:大小写 public void ResolvePeriod_MatchesSpec(string fmt, string expectedDateStr, string expectedNbrDate) { var now = new DateTime(2026, 5, 10, 15, 30, 0); var (nbrDate, nbrDateStr) = NbrSequenceFormatter.ResolvePeriod(fmt, now); Assert.Equal(expectedDateStr, nbrDateStr); Assert.Equal(DateTime.Parse(expectedNbrDate), nbrDate); } [Fact] public void ResolvePadWidth_UsesMaxValueStringLength() { Assert.Equal(3, NbrSequenceFormatter.ResolvePadWidth(999)); Assert.Equal(8, NbrSequenceFormatter.ResolvePadWidth(99999999)); } [Fact] public void BuildNumber_SmStyle() { var n = NbrSequenceFormatter.BuildNumber("S", "M", "", "20260510", 5, 3); Assert.Equal("SM20260510005", n); } [Fact] public void BuildNumber_WhenSerialWiderThanPad_Throws() { Assert.Throws(() => NbrSequenceFormatter.BuildNumber("S", "M", "", "20260510", 1000, 3)); } [Fact] public void BuildRange_PrStyleIncrement3() { var list = NbrSequenceFormatter.BuildRange("P", "R", "", "20260510", 53, 3, 8); Assert.Equal(new[] { "PR2026051000000053", "PR2026051000000054", "PR2026051000000055" }, list); } }