S6ProcessInspectionJudgeTests.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. using Admin.NET.Plugin.AiDOP.Manufacturing;
  2. using Xunit;
  3. namespace Admin.NET.Plugin.AiDOP.Tests.S6.Manufacturing;
  4. /// <summary>S6 Phase 1C 判定引擎单测(纯函数,后端唯一判定真源)。</summary>
  5. public class S6ProcessInspectionJudgeTests
  6. {
  7. // ── NUMERIC 逐样本 ──(闭区间 9.8~10.2)
  8. [Theory]
  9. [InlineData("10.0", S6Judgement.Pass)] // inside
  10. [InlineData("9.8", S6Judgement.Pass)] // lower bound (闭)
  11. [InlineData("10.2", S6Judgement.Pass)] // upper bound (闭)
  12. [InlineData("9.79", S6Judgement.Fail)] // below
  13. [InlineData("10.21", S6Judgement.Fail)] // above
  14. [InlineData("abc", S6Judgement.Invalid)]// 非法数字 → 不默认 PASS
  15. [InlineData("", S6Judgement.Invalid)] // 空
  16. public void JudgeSample_Numeric_ClosedInterval(string actual, string expect)
  17. => Assert.Equal(expect, S6ProcessInspectionJudge.JudgeSample(S6ResultType.Numeric, actual, "9.8", "10.2"));
  18. [Fact]
  19. public void JudgeSample_Numeric_LowerOnly() // 仅下限 >=5
  20. {
  21. Assert.Equal(S6Judgement.Pass, S6ProcessInspectionJudge.JudgeSample(S6ResultType.Numeric, "5", "5", null));
  22. Assert.Equal(S6Judgement.Fail, S6ProcessInspectionJudge.JudgeSample(S6ResultType.Numeric, "4.9", "5", null));
  23. }
  24. [Fact]
  25. public void JudgeSample_Numeric_UpperOnly() // 仅上限 <=10
  26. {
  27. Assert.Equal(S6Judgement.Pass, S6ProcessInspectionJudge.JudgeSample(S6ResultType.Numeric, "10", null, "10"));
  28. Assert.Equal(S6Judgement.Fail, S6ProcessInspectionJudge.JudgeSample(S6ResultType.Numeric, "10.1", null, "10"));
  29. }
  30. [Fact]
  31. public void JudgeSample_Numeric_NoLimits_Invalid() // 无上下限 → 无法判定
  32. => Assert.Equal(S6Judgement.Invalid, S6ProcessInspectionJudge.JudgeSample(S6ResultType.Numeric, "5", null, null));
  33. // ── NON_NUMERIC 逐样本 ──
  34. [Theory]
  35. [InlineData("OK", S6Judgement.Pass)]
  36. [InlineData("ok", S6Judgement.Pass)]
  37. [InlineData("NG", S6Judgement.Fail)]
  38. [InlineData("maybe", S6Judgement.Invalid)]
  39. public void JudgeSample_NonNumeric(string actual, string expect)
  40. => Assert.Equal(expect, S6ProcessInspectionJudge.JudgeSample(S6ResultType.NonNumeric, actual, null, null));
  41. // ── 单项聚合 ──(要求 3 样本)
  42. [Fact]
  43. public void AggregateItem_Partial_InProgressPending()
  44. {
  45. var (st, r) = S6ProcessInspectionJudge.AggregateItem(3, new[] { S6Judgement.Pass });
  46. Assert.Equal(S6ItemStatus.InProgress, st);
  47. Assert.Equal(S6Judgement.Pending, r);
  48. }
  49. [Fact]
  50. public void AggregateItem_CompleteAllPass()
  51. {
  52. var (st, r) = S6ProcessInspectionJudge.AggregateItem(3, new[] { S6Judgement.Pass, S6Judgement.Pass, S6Judgement.Pass });
  53. Assert.Equal(S6ItemStatus.Completed, st);
  54. Assert.Equal(S6Judgement.Pass, r);
  55. }
  56. [Fact]
  57. public void AggregateItem_OneFail_Fail()
  58. {
  59. var (st, r) = S6ProcessInspectionJudge.AggregateItem(3, new[] { S6Judgement.Pass, S6Judgement.Fail, S6Judgement.Pass });
  60. Assert.Equal(S6ItemStatus.Completed, st);
  61. Assert.Equal(S6Judgement.Fail, r);
  62. }
  63. [Fact]
  64. public void AggregateItem_ZeroRecorded_NotStarted()
  65. {
  66. var (st, r) = S6ProcessInspectionJudge.AggregateItem(3, System.Array.Empty<string>());
  67. Assert.Equal(S6ItemStatus.NotStarted, st);
  68. Assert.Equal(S6Judgement.Pending, r);
  69. }
  70. [Fact]
  71. public void AggregateItem_NonNumericSingle_CompletePass()
  72. {
  73. var (st, r) = S6ProcessInspectionJudge.AggregateItem(1, new[] { S6Judgement.Pass });
  74. Assert.Equal(S6ItemStatus.Completed, st);
  75. Assert.Equal(S6Judgement.Pass, r);
  76. }
  77. // ── 整单聚合 ──
  78. [Fact]
  79. public void AggregateOverall_AllCompletePass_Pass()
  80. => Assert.Equal(S6Judgement.Pass, S6ProcessInspectionJudge.AggregateOverall(new[] { (S6ItemStatus.Completed, S6Judgement.Pass), (S6ItemStatus.Completed, S6Judgement.Pass) }));
  81. [Fact]
  82. public void AggregateOverall_OneFail_Fail()
  83. => Assert.Equal(S6Judgement.Fail, S6ProcessInspectionJudge.AggregateOverall(new[] { (S6ItemStatus.Completed, S6Judgement.Pass), (S6ItemStatus.Completed, S6Judgement.Fail) }));
  84. [Fact]
  85. public void AggregateOverall_Incomplete_Pending()
  86. => Assert.Equal(S6Judgement.Pending, S6ProcessInspectionJudge.AggregateOverall(new[] { (S6ItemStatus.Completed, S6Judgement.Pass), (S6ItemStatus.InProgress, S6Judgement.Pending) }));
  87. [Fact]
  88. public void AggregateOverall_Invalid_Invalid()
  89. => Assert.Equal(S6Judgement.Invalid, S6ProcessInspectionJudge.AggregateOverall(new[] { (S6ItemStatus.Completed, S6Judgement.Invalid), (S6ItemStatus.Completed, S6Judgement.Pass) }));
  90. [Fact]
  91. public void AllItemsCompleted_GatesComplete()
  92. {
  93. Assert.True(S6ProcessInspectionJudge.AllItemsCompleted(new[] { (S6ItemStatus.Completed, S6Judgement.Pass) }));
  94. Assert.False(S6ProcessInspectionJudge.AllItemsCompleted(new[] { (S6ItemStatus.Completed, S6Judgement.Pass), (S6ItemStatus.InProgress, S6Judgement.Pending) }));
  95. Assert.False(S6ProcessInspectionJudge.AllItemsCompleted(System.Array.Empty<(string, string)>()));
  96. }
  97. }