PickBillNumberParityTests.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. using System.Text.RegularExpressions;
  2. using Admin.NET.Plugin.AiDOP.DataPlatform.Sequence;
  3. using Admin.NET.Plugin.AiDOP.Supply;
  4. using Xunit;
  5. namespace Admin.NET.Plugin.AiDOP.Tests.DataPlatform;
  6. /// <summary>
  7. /// WP9 S3:本库 NumberRuleFormatter 与 165 NbrSequenceFormatter 对同一规则输出逐字符相同。
  8. /// </summary>
  9. public class PickBillNumberParityTests
  10. {
  11. private static readonly Regex Sm165Pattern = new(@"^SM[0-9]{8}[0-9]{3}$", RegexOptions.Compiled);
  12. [Theory]
  13. [InlineData("S", "M", "", "YYYYMMDD", 999, 1, "2026-08-09", "SM20260809001")]
  14. [InlineData("S", "M", "", "YYYYMMDD", 999, 42, "2026-08-09", "SM20260809042")]
  15. [InlineData("S", "M", "", "YYYYMMDD", 999, 999, "2026-05-10", "SM20260510999")]
  16. [InlineData("P", "W", "", "YYYYMMDD", 9999, 1, "2026-05-10", "PW202605100001")]
  17. [InlineData("D", "", "", "YYYYMMDD", 99999, 1, "2026-05-10", "D2026051000001")]
  18. public void Formatters_SameInputs_ProduceIdenticalNumbers(
  19. string pre1, string pre2, string pre3, string dateType, int maxValue, int serial, string nowIso, string expected)
  20. {
  21. var now = DateTime.Parse(nowIso);
  22. var local = NumberRuleFormatter.BuildNumber(pre1, pre2, pre3, dateType, true, serial, maxValue, now);
  23. var norm = NbrSequenceFormatter.NormalizeDateFormat(dateType);
  24. var (_, dateStr) = NbrSequenceFormatter.ResolvePeriod(norm, now);
  25. var pad = NbrSequenceFormatter.ResolvePadWidth(maxValue);
  26. var mes = NbrSequenceFormatter.BuildNumber(pre1, pre2, pre3, dateStr, serial, pad);
  27. Assert.Equal(expected, local);
  28. Assert.Equal(expected, mes);
  29. Assert.Equal(local, mes);
  30. }
  31. [Fact]
  32. public void SmMaxValue999_PadWidthIsThree()
  33. {
  34. Assert.Equal(3, NbrSequenceFormatter.ResolvePadWidth(999));
  35. Assert.Equal(3, NumberRuleFormatter.ResolveSerialWidth(999));
  36. }
  37. [Fact]
  38. public void SmxFallback_DoesNotMatch165Pattern()
  39. {
  40. var smx = "SMX" + DateTime.Now.ToString("yyyyMMddHHmmss") + "12345";
  41. Assert.False(Sm165Pattern.IsMatch(smx));
  42. Assert.True(Sm165Pattern.IsMatch("SM20260809001"));
  43. }
  44. }