RBD-MS tSQLt Report

FAILED

117 passed, 78 failed, 195 total

ResultTest
No individual test rows were parsed. See raw output.

Raw Output

(0 rows affected)
Start                   End                     OriginalDelayId OriginalStart           OriginalEnd             Comments                                                                                                                                                                                                                                                         JustifiedByUser                                    JustifiedDatetime       DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId    
----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ -----------
2026-05-01 06:00:00.000 2026-05-01 08:00:00.000               1 2026-05-01 06:00:00.000 2026-05-01 18:00:00.000 NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
2026-05-01 08:00:00.000 2026-05-01 16:00:00.000               1 2026-05-01 06:00:00.000 2026-05-01 18:00:00.000 NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
2026-05-01 16:00:00.000 2026-05-01 18:00:00.000               1 2026-05-01 06:00:00.000 2026-05-01 18:00:00.000 NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
Start                   End                     OriginalDelayId OriginalStart           OriginalEnd             Comments                                                                                                                                                                                                                                                         JustifiedByUser                                    JustifiedDatetime       DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId    
----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ -----------
Start                   End                     OriginalDelayId OriginalStart           OriginalEnd             Comments                                                                                                                                                                                                                                                         JustifiedByUser                                    JustifiedDatetime       DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId    
----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ -----------
2026-05-01 06:00:00.000 2026-05-01 08:00:00.000               1 2026-05-01 06:00:00.000 2026-05-01 18:00:00.000 NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
2026-05-01 08:00:00.000 2026-05-01 16:00:00.000               1 2026-05-01 06:00:00.000 2026-05-01 18:00:00.000 NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
2026-05-01 16:00:00.000 2026-05-01 18:00:00.000               1 2026-05-01 06:00:00.000 2026-05-01 18:00:00.000 NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
Start                   End                     OriginalDelayId OriginalStart           OriginalEnd             Comments                                                                                                                                                                                                                                                         JustifiedByUser                                    JustifiedDatetime       DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId    
----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ -----------
2026-05-01 06:00:00.000 2026-05-01 08:00:00.000               1 2026-05-01 06:00:00.000 2026-05-01 08:00:00.000 NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
2026-05-01 08:00:00.000 2026-05-01 16:00:00.000               1 2026-05-01 08:00:00.000 2026-05-01 16:00:00.000 NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
2026-05-01 16:00:00.000 2026-05-01 18:00:00.000               1 2026-05-01 16:00:00.000 2026-05-01 18:00:00.000 NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
Start                   End                     OriginalDelayId OriginalStart           OriginalEnd             Comments                                                                                                                                                                                                                                                         JustifiedByUser                                    JustifiedDatetime       DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId    
----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ -----------
2026-05-01 06:00:00.000 2026-05-01 08:00:00.000               1 2026-05-01 06:00:00.000 2026-05-01 10:00:00.000 NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
2026-05-01 08:00:00.000 2026-05-01 10:00:00.000               1 2026-05-01 06:00:00.000 2026-05-01 10:00:00.000 NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
Start                   End                     OriginalDelayId OriginalStart           OriginalEnd             Comments                                                                                                                                                                                                                                                         JustifiedByUser                                    JustifiedDatetime       DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId    
----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ -----------
2026-05-01 08:00:00.000 2026-05-01 10:00:00.000               1 2026-05-01 08:00:00.000 2026-05-01 10:00:00.000 NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
Start                   End                     OriginalDelayId OriginalStart           OriginalEnd             Comments                                                                                                                                                                                                                                                         JustifiedByUser                                    JustifiedDatetime       DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId    
----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ -----------
2026-05-01 06:00:00.000 2026-05-01 08:00:00.000               1 2026-05-01 06:00:00.000 2026-05-01 10:00:00.000 NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
2026-05-01 08:00:00.000 2026-05-01 10:00:00.000               1 2026-05-01 06:00:00.000 2026-05-01 10:00:00.000 NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
Start                   End                     OriginalDelayId OriginalStart           OriginalEnd             Comments                                                                                                                                                                                                                                                         JustifiedByUser                                    JustifiedDatetime       DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId    
----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ -----------
2026-05-01 06:00:00.000 2026-05-01 08:00:00.000               1 2026-05-01 06:00:00.000 2026-05-01 10:00:00.000 NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
2026-05-01 08:00:00.000 2026-05-01 10:00:00.000               1 2026-05-01 06:00:00.000 2026-05-01 10:00:00.000 NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
Start                   End                     OriginalDelayId OriginalStart           OriginalEnd             Comments                                                                                                                                                                                                                                                         JustifiedByUser                                    JustifiedDatetime       DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId    
----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ -----------
2026-05-01 06:00:00.000 2026-05-01 08:00:00.000               1 2026-05-01 06:00:00.000 2026-05-01 10:00:00.000 NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
2026-05-01 08:00:00.000 2026-05-01 10:00:00.000               1 2026-05-01 06:00:00.000 2026-05-01 10:00:00.000 NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
Start                   End                     OriginalDelayId OriginalStart           OriginalEnd             Comments                                                                                                                                                                                                                                                         JustifiedByUser                                    JustifiedDatetime       DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId    
----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ -----------
2026-05-01 06:00:00.000 2026-05-01 08:00:00.000               1 2026-05-01 06:00:00.000 2026-05-01 10:00:00.000 broken thing                                                                                                                                                                                                                                                     alice                                              2026-05-01 11:00:00.000           5               2             1            0           1
2026-05-01 08:00:00.000 2026-05-01 10:00:00.000               1 2026-05-01 06:00:00.000 2026-05-01 10:00:00.000 broken thing                                                                                                                                                                                                                                                     alice                                              2026-05-01 11:00:00.000           5               2             1            0           1
Start                   End                     OriginalDelayId OriginalStart           OriginalEnd             Comments                                                                                                                                                                                                                                                         JustifiedByUser                                    JustifiedDatetime       DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId    
----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ -----------
2026-05-01 02:00:00.000 2026-05-01 06:00:00.000               1 2026-05-01 02:00:00.000 2026-05-01 06:00:00.000 NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
Start                   End                     OriginalDelayId OriginalStart           OriginalEnd             Comments                                                                                                                                                                                                                                                         JustifiedByUser                                    JustifiedDatetime       DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId    
----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ -----------
2026-05-01 06:00:00.000 2026-05-01 08:00:00.000               1 2026-05-01 06:00:00.000 2026-05-01 18:00:00.000 NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
2026-05-01 08:00:00.000 2026-05-01 16:00:00.000               1 2026-05-01 06:00:00.000 2026-05-01 18:00:00.000 NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
2026-05-01 16:00:00.000 2026-05-01 18:00:00.000               1 2026-05-01 06:00:00.000 2026-05-01 18:00:00.000 NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
Start                   End                     OriginalDelayId OriginalStart           OriginalEnd             Comments                                                                                                                                                                                                                                                         JustifiedByUser                                    JustifiedDatetime       DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId    
----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ -----------
2026-05-01 06:00:00.000 2026-05-01 08:00:00.000               1 2026-05-01 06:00:00.000                    NULL NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
2026-05-01 08:00:00.000                    NULL               1 2026-05-01 06:00:00.000                    NULL NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
Start                   End                     OriginalDelayId OriginalStart           OriginalEnd             Comments                                                                                                                                                                                                                                                         JustifiedByUser                                    JustifiedDatetime       DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId    
----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ -----------
2026-05-01 06:00:00.000 2026-05-01 08:00:00.000             999 2026-05-01 06:00:00.000 2026-05-01 10:00:00.000 NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
2026-05-01 08:00:00.000 2026-05-01 10:00:00.000             999 2026-05-01 06:00:00.000 2026-05-01 10:00:00.000 NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
Start                   End                     OriginalDelayId OriginalStart           OriginalEnd             Comments                                                                                                                                                                                                                                                         JustifiedByUser                                    JustifiedDatetime       DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId    
----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ -----------
2026-05-01 06:00:00.000 2026-05-01 08:00:00.000               1 2026-05-01 06:00:00.000                    NULL NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
2026-05-01 08:00:00.000 2026-05-01 16:00:00.000               1 2026-05-01 06:00:00.000                    NULL NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
2026-05-01 16:00:00.000 2026-05-02 00:00:00.000               1 2026-05-01 06:00:00.000                    NULL NULL                                                                                                                                                                                                                                                             NULL                                                                  NULL        NULL            NULL             0            0           1
Start                   End                     OriginalDelayId OriginalStart           OriginalEnd             Comments                                                                                                                                                                                                                                                         JustifiedByUser                                    JustifiedDatetime       DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId    
----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ -----------
  BatchId:10 ReferenceId:5000 PartId:100 Timestamp:Feb  2 2026 12:00AM by NULL Success
  BatchId:1 ReferenceId:5000 PartId:100 Timestamp:Jan  1 2026 12:00AM by NULL Success
  BatchId:1 ReferenceId:5000 PartId:100 Timestamp:Jan  1 2026 12:00AM by NULL Success
  BatchId:1 ReferenceId:925357780 PartId:100 Timestamp:Jan  1 2026 12:00AM by NULL Success
  BatchId:10 ReferenceId:7777 PartId:100 Timestamp:Jan  1 2026 12:00AM by NULL Success
  BatchId:1 ReferenceId:5000 PartId:100 Timestamp:Jan  1 2026 12:00AM by test Success
  BatchId:11 ReferenceId:9999 PartId:100 Timestamp:NULL by NULL Success
.[test 4 INSERT with explicit IsDefaultArray writes the value] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144
.[test 1 INSERT writes PartTypeId and PartName] failed: (Error) Message: @User is not a parameter for procedure UpsertPart. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 1 | Number: 8145
.[test 26 LOG insert writes an informational audit log row] failed: (Error) Message: @User is not a parameter for procedure UpsertPart. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 1 | Number: 8145
.[test 28 LOG update with no changes writes no audit log row] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144
.[test 13 UPDATE preserves IsActive IsDefaultArray and AuxPartId] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144
.[test 24 VALIDATE NULL User throws] failed: (Failure) Exception did not match expectation!
Expected Message to be like <%User is required%>
Actual Message            : <Procedure or function 'UpsertPart' expects parameter '@PartTypeId', which was not supplied.>
Expected Error Number: 50000
Actual Error Number  : 201
.[test 11 UPDATE overwrites PartTypeId and PartName of the targeted row] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144
.[test 22 VALIDATE on non-existent PartId throws] failed: (Failure) Exception did not match expectation!
Expected Message to be like <%PartId=99 not found%>
Actual Message            : <Procedure or function UpsertPart has too many arguments specified.>
Expected Error Number: 50000
Actual Error Number  : 8144
.[test 23 UPDATE with no changes still returns the PartId] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144
.[test 20 UPDATE with AuxPartId = -1 preserves current] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144
.[test 16 UPDATE with empty PartName preserves current] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144
.[test 5 INSERT with explicit AuxPartId writes the value] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144
.[test 15 UPDATE with PartTypeId = -1 preserves current] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144
.[test 17 UPDATE with explicit IsActive flips the value] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144
.[test 2 INSERT returns the new identity value] failed: (Error) Message: @User is not a parameter for procedure UpsertPart. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 1 | Number: 8145
.[test 31 LOG custom LogMessage replaces the auto-generated update message] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144
.[test 21 UPDATE with explicit NULL AuxPartId clears the value] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144
.[test 7 VALIDATE empty PartName throws] failed: (Failure) Exception did not match expectation!
Expected Message to be like <%PartName is required%>
Actual Message            : <@User is not a parameter for procedure UpsertPart.>
Expected Error Number: 50000
Actual Error Number  : 8145
.[test 25 VALIDATE empty User throws] failed: (Failure) Exception did not match expectation!
Expected Message to be like <%User is required%>
Actual Message            : <Procedure or function 'UpsertPart' expects parameter '@PartTypeId', which was not supplied.>
Expected Error Number: 50000
Actual Error Number  : 201
.[test 19 UPDATE with explicit AuxPartId writes the new value] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144
.[test 32 LOG custom LogMessage is ignored on no-change update] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144
.[test 18 UPDATE with explicit IsDefaultArray flips the value] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144
.[test 10 VALIDATE NULL PartTypeId throws] failed: (Failure) Exception did not match expectation!
Expected Message to be like <%PartTypeId is required%>
Actual Message            : <@User is not a parameter for procedure UpsertPart.>
Expected Error Number: 50000
Actual Error Number  : 8145
.[test 12 UPDATE returns the targeted PartId] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144
.[test 6 INSERT allows duplicate PartName values] failed: (Error) Message: @User is not a parameter for procedure UpsertPart. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 1 | Number: 8145
.[test 8 VALIDATE NULL PartName throws] failed: (Failure) Exception did not match expectation!
Expected Message to be like <%PartName is required%>
Actual Message            : <@User is not a parameter for procedure UpsertPart.>
Expected Error Number: 50000
Actual Error Number  : 8145
.[test 9 VALIDATE PartTypeId = -1 throws] failed: (Failure) Exception did not match expectation!
Expected Message to be like <%PartTypeId is required%>
Actual Message            : <@User is not a parameter for procedure UpsertPart.>
Expected Error Number: 50000
Actual Error Number  : 8145
.[test 30 LOG custom LogMessage replaces the auto-generated insert message] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144
.[test 27 LOG update with changes writes an informational audit log row with the delta] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144
.[test 29 LOG User parameter is forwarded to the audit log] failed: (Error) Message: @User is not a parameter for procedure UpsertPart. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 1 | Number: 8145
.[test 14 UPDATE only affects the targeted row] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144
.[test 3 INSERT leaves IsActive IsDefaultArray and AuxPartId at table defaults] failed: (Error) Message: @User is not a parameter for procedure UpsertPart. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 1 | Number: 8145
.[test 11 UPDATE with explicit SortOrder writes the new value] failed: (Error) Message: Procedure or function 'UpsertPartType' expects parameter '@PartTypeName', which was not supplied. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 4 | Number: 201
.[test 1 INSERT writes PartTypeName IsArray IsReplaceable and InheritedFrom] failed: (Error) Message: @IsReplaceable is not a parameter for procedure UpsertPartType. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 1 | Number: 8145
.[test 8 UPDATE with empty PartTypeName preserves current] failed: (Error) Message: @User is not a parameter for procedure UpsertPartType. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 1 | Number: 8145
.[test 7 UPDATE returns the targeted PartTypeId] failed: (Error) Message: @User is not a parameter for procedure UpsertPartType. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 1 | Number: 8145
.[test 3 INSERT with optional params omitted honours table defaults] failed: (Error) Message: @User is not a parameter for procedure UpsertPartType. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 1 | Number: 8145
.[test 10 UPDATE with IsArray IsReplaceable and SortOrder omitted preserves current] failed: (Error) Message: @User is not a parameter for procedure UpsertPartType. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 1 | Number: 8145
.[test 14 UPDATE with no changes still returns the PartTypeId] failed: (Error) Message: Procedure or function UpsertPartType has too many arguments specified. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 2 | Number: 8144
.[test 12 VALIDATE on non-existent PartTypeId throws] failed: (Failure) Exception did not match expectation!
Expected Message to be like <%PartTypeId=99 not found%>
Actual Message            : <@User is not a parameter for procedure UpsertPartType.>
Expected Error Number: 50000
Actual Error Number  : 8145
.[test 6 UPDATE overwrites all five columns of the existing row] failed: (Error) Message: Procedure or function UpsertPartType has too many arguments specified. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 2 | Number: 8144
.[test 9 UPDATE with InheritedFrom = -1 preserves current] failed: (Error) Message: Procedure or function 'UpsertPartType' expects parameter '@PartTypeName', which was not supplied. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 4 | Number: 201
.[test 17 LOG insert writes an informational audit log row] failed: (Error) Message: @User is not a parameter for procedure UpsertPartType. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 1 | Number: 8145
.[test 20 LOG User parameter is forwarded to the audit log] failed: (Error) Message: @User is not a parameter for procedure UpsertPartType. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 1 | Number: 8145
.[test 23 LOG custom LogMessage is ignored on no-change update] failed: (Error) Message: Procedure or function UpsertPartType has too many arguments specified. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 2 | Number: 8144
.[test 19 LOG update with no changes writes no audit log row] failed: (Error) Message: Procedure or function UpsertPartType has too many arguments specified. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 2 | Number: 8144
.[test 13 VALIDATE InheritedFrom equal to PartTypeId throws] failed: (Failure) Exception did not match expectation!
Expected Message to be like <%cannot inherit from itself%>
Actual Message            : <Procedure or function 'UpsertPartType' expects parameter '@PartTypeName', which was not supplied.>
Expected Error Number: 50000
Actual Error Number  : 201
.[test 4 VALIDATE empty PartTypeName throws] failed: (Failure) Exception did not match expectation!
Expected Message to be like <%PartTypeName is required%>
Actual Message            : <@User is not a parameter for procedure UpsertPartType.>
Expected Error Number: 50000
Actual Error Number  : 8145
.[test 5 VALIDATE NULL PartTypeName throws] failed: (Failure) Exception did not match expectation!
Expected Message to be like <%PartTypeName is required%>
Actual Message            : <@User is not a parameter for procedure UpsertPartType.>
Expected Error Number: 50000
Actual Error Number  : 8145
.[test 15 VALIDATE NULL User throws] failed: (Failure) Exception did not match expectation!
Expected Message to be like <%User is required%>
Actual Message            : <Procedure or function 'UpsertPartType' expects parameter '@PartTypeName', which was not supplied.>
Expected Error Number: 50000
Actual Error Number  : 201
.[test 22 LOG custom LogMessage replaces the auto-generated update message] failed: (Error) Message: @User is not a parameter for procedure UpsertPartType. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 1 | Number: 8145
.[test 16 VALIDATE empty User throws] failed: (Failure) Exception did not match expectation!
Expected Message to be like <%User is required%>
Actual Message            : <Procedure or function 'UpsertPartType' expects parameter '@PartTypeName', which was not supplied.>
Expected Error Number: 50000
Actual Error Number  : 201
.[test 2 INSERT returns the new identity value] failed: (Error) Message: @User is not a parameter for procedure UpsertPartType. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 1 | Number: 8145
.[test 21 LOG custom LogMessage replaces the auto-generated insert message] failed: (Error) Message: @User is not a parameter for procedure UpsertPartType. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 1 | Number: 8145
.[test 18 LOG update with changes writes an informational audit log row with the delta] failed: (Error) Message: @User is not a parameter for procedure UpsertPartType. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 1 | Number: 8145
.[test 17 LOG update with no changes writes no audit log row] failed: (Error) Message: Procedure or function UpsertPartTypeTree has too many arguments specified. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 2 | Number: 8144
.[test 9 UPDATE overwrites PositionName when edge already exists] failed: (Error) Message: Procedure or function UpsertPartTypeTree has too many arguments specified. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 2 | Number: 8144
.[test 20 LOG custom LogMessage replaces the auto-generated update message] failed: (Error) Message: Procedure or function UpsertPartTypeTree has too many arguments specified. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 2 | Number: 8144
.[test 11 UPDATE with empty PositionName preserves current] failed: (Error) Message: Procedure or function UpsertPartTypeTree has too many arguments specified. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 2 | Number: 8144
.[test 19 LOG custom LogMessage replaces the auto-generated insert message] failed: (Error) Message: Procedure or function UpsertPartTypeTree has too many arguments specified. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 2 | Number: 8144
.[test 14 VALIDATE empty User throws] failed: (Failure) Exception did not match expectation!
Expected Message to be like <%User is required%>
Actual Message            : <@User is not a parameter for procedure UpsertPartTypeTree.>
Expected Error Number: 50000
Actual Error Number  : 8145
.[test 16 LOG update with changes writes an informational audit log row with the delta] failed: (Error) Message: Procedure or function UpsertPartTypeTree has too many arguments specified. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 2 | Number: 8144
.[test 4 INSERT allows the same child type at multiple positions of the same parent] failed: (Error) Message: Procedure or function UpsertPartTypeTree has too many arguments specified. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 2 | Number: 8144
.[test 5 VALIDATE NULL ParentPartTypeId throws] failed: (Failure) Exception did not match expectation!
Expected Message to be like <%ParentPartTypeId is required%>
Actual Message            : <@User is not a parameter for procedure UpsertPartTypeTree.>
Expected Error Number: 50000
Actual Error Number  : 8145
.[test 1 INSERT writes ParentPartTypeId PartTypeId PositionId and PositionName] failed: (Error) Message: Procedure or function UpsertPartTypeTree has too many arguments specified. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 2 | Number: 8144
.[test 10 UPDATE returns zero] failed: (Error) Message: Procedure or function UpsertPartTypeTree has too many arguments specified. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 2 | Number: 8144
.[test 3 INSERT with omitted PositionName writes NULL] failed: (Error) Message: @User is not a parameter for procedure UpsertPartTypeTree. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 1 | Number: 8145
.[test 2 INSERT returns zero] failed: (Error) Message: Procedure or function UpsertPartTypeTree has too many arguments specified. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 2 | Number: 8144
.[test 6 VALIDATE NULL PartTypeId throws] failed: (Failure) Exception did not match expectation!
Expected Message to be like <%PartTypeId is required%>
Actual Message            : <@User is not a parameter for procedure UpsertPartTypeTree.>
Expected Error Number: 50000
Actual Error Number  : 8145
.[test 13 VALIDATE NULL User throws] failed: (Failure) Exception did not match expectation!
Expected Message to be like <%User is required%>
Actual Message            : <@User is not a parameter for procedure UpsertPartTypeTree.>
Expected Error Number: 50000
Actual Error Number  : 8145
.[test 7 VALIDATE NULL PositionId throws] failed: (Failure) Exception did not match expectation!
Expected Message to be like <%PositionId is required%>
Actual Message            : <@User is not a parameter for procedure UpsertPartTypeTree.>
Expected Error Number: 50000
Actual Error Number  : 8145
.[test 8 VALIDATE self-referencing edge throws] failed: (Failure) Exception did not match expectation!
Expected Message to be like <%Self-referencing edge not allowed%>
Actual Message            : <@User is not a parameter for procedure UpsertPartTypeTree.>
Expected Error Number: 50000
Actual Error Number  : 8145
.[test 15 LOG insert writes an informational audit log row] failed: (Error) Message: Procedure or function UpsertPartTypeTree has too many arguments specified. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 2 | Number: 8144
.[test 12 UPDATE with explicit NULL PositionName clears the value] failed: (Error) Message: Procedure or function UpsertPartTypeTree has too many arguments specified. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 2 | Number: 8144
.[test 21 LOG custom LogMessage is ignored on no-change update] failed: (Error) Message: Procedure or function UpsertPartTypeTree has too many arguments specified. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 2 | Number: 8144
.[test 18 LOG User parameter is forwarded to the audit log] failed: (Error) Message: Procedure or function UpsertPartTypeTree has too many arguments specified. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 2 | Number: 8144
UpsertTask TO-DEFAULT-ARRAY 100 on Jan  1 2020 12:00AM by TESTER | LastTaskId=3000 IsDefaultArray=0 | Path A: Fresh Removal Success
UpsertTask 100 to 1 pos 1 on May 22 2026  6:00AM by CORRECTOR | LastTaskId=3002 IsDefaultArray=0 | Path B: Correction Success
UpsertTask TO-DEFAULT-ARRAY 100 on Jan  1 2099 12:00AM by TESTER | LastTaskId=3000 IsDefaultArray=0 | Path A: Fresh Removal Success
UpsertTask TO-DEFAULT-ARRAY 100 on Jan  1 2099 12:00AM by TESTER | LastTaskId=3000 IsDefaultArray=0 | Path A: Fresh Removal Success
UpsertTask TO-DEFAULT-ARRAY 100 on Jan  1 2020 12:00AM by TESTER | LastTaskId=3001 IsDefaultArray=1 | Path B: Correction Success
UpsertTask 100 to NULL pos NULL on May 22 2026 12:00PM by CORRECTOR | LastTaskId=3002 IsDefaultArray=0 | Path B: Correction Success
UpsertTask 100 to 1 pos 1 on Jan  1 2099 12:00AM by TESTER | LastTaskId=3001 IsDefaultArray=1 | Path A: Fresh Install Success
UpsertTask 100 to NULL pos 1 on Jan  1 2099 12:00AM by TESTER | LastTaskId=NULL IsDefaultArray=NULL | Path A: Fresh Install Success
.[test 33 VALIDATE: INSTALL fresh requires ParentPartId] failed: (Failure) Expected an error to be raised.
UpsertTask TO-DEFAULT-ARRAY 100 on Jan  1 2099 12:00AM by TESTER | LastTaskId=NULL IsDefaultArray=NULL | Path A: Fresh Removal Success
UpsertTask CREATE+INSTALL Type=3 Name=Roof #42 to 1 pos 1 on Jan  1 2099 12:00AM by TESTER | Created PartId=101 | Success
UpsertTask 100 to 200 pos 9 on May 22 2026  6:00AM by CORRECTOR | LastTaskId=3002 IsDefaultArray=0 | Path B: Correction Success
UpsertTask 100 to 1 pos 1 on Jun 10 2026  3:30PM by TESTER | LastTaskId=3001 IsDefaultArray=1 | Path A: Fresh Install Success
UpsertTask 100 to 1 pos 1 on Jan  1 2099 12:00AM by TESTER | LastTaskId=3001 IsDefaultArray=1 | Path A: Fresh Install Success
UpsertTask CREATE+INSTALL Type=3 Name=Roof #42 to 1 pos 1 on Jan  1 2099 12:00AM by TESTER | Created PartId=101 | Error: boom from MovePart spy
.[test 24 LOG: error path writes error log and re-raises] failed: (Error) Message: UpsertTask CREATE+INSTALL Type=3 Name=Roof #42 to 1 pos 1 on Jan  1 2099 12:00AM by TESTER | Created PartId=101 | Error: boom from MovePart spy | Procedure: EQP.UpsertTask (93) | Severity, State: 16, 17 | Number: 50000 (There was also a ROLLBACK ERROR --> Message: The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION. | Procedure: tSQLt.Private_RunTest_TestExecution (154) | Severity, State: 16, 1 | Number: 3903)
UpsertTask CREATE+INSTALL Type=3 Name=Roof #42 to 1 pos 1 on Jan  1 2099 12:00AM by TESTER | Created PartId=101 | Success
UpsertTask 100 to 1 pos 1 on May 22 2026  6:00AM by TESTER | LastTaskId=3002 IsDefaultArray=0 | Path B: Correction Success
UpsertTask 100 to 1 pos 1 on Jan  1 2020 12:00AM by TESTER | LastTaskId=3001 IsDefaultArray=1 | Path A: Fresh Install Success
UpsertTask TO-DEFAULT-ARRAY 100 on May 21 2026  2:30PM by TESTER | LastTaskId=3001 IsDefaultArray=1 | Path B: Correction Success
UpsertTask TO-DEFAULT-ARRAY 100 on May 21 2026  2:30PM by CORRECTOR | LastTaskId=3001 IsDefaultArray=1 | Path B: Correction Success
UpsertTask CREATE+INSTALL Type=3 Name=Roof #42 to 1 pos 1 on Jan  1 2020 12:00AM by TESTER | Created PartId=101 | Success
UpsertTask CREATE+INSTALL Type=3 Name=Roof #42 to 1 pos 1 on Jan  1 2099 12:00AM by TESTER | Created PartId=101 | Success
UpsertTask 100 to 1 pos 1 on Jan  1 2099 12:00AM by TESTER | LastTaskId=NULL IsDefaultArray=NULL | Path A: Fresh Install Success
UpsertTask 100 to 1 pos 1 on Jan  1 2099 12:00AM by TESTER | LastTaskId=3001 IsDefaultArray=1 | Path A: Fresh Install Success
UpsertTask CREATE+INSTALL Type=3 Name=Roof #42 to 1 pos 1 on Jan  1 2099 12:00AM by TESTER | Created PartId=101 | Success
UpsertTask TO-DEFAULT-ARRAY 100 on Jan  1 2099 12:00AM by TESTER | LastTaskId=3000 IsDefaultArray=0 | Path A: Fresh Removal Success
UpsertTask TO-DEFAULT-ARRAY 100 on Apr  1 2026 12:00AM by TESTER | LastTaskId=3001 IsDefaultArray=1 | Path B: Correction Success
UpsertTask TO-DEFAULT-ARRAY 100 on May 21 2026  2:30PM by CORRECTOR | LastTaskId=3001 IsDefaultArray=1 | Path B: Correction Success
 
+----------------------+
|Test Execution Summary|
+----------------------+
 
|No |Test Case Name                                                                                                       |Dur(ms)|Result |
+---+---------------------------------------------------------------------------------------------------------------------+-------+-------+
|1  |[DEL_GetDelay_Tests].[test IsDelayManual is aliased as IsManual for manual delay]                                    |    107|Success|
|2  |[DEL_GetDelay_Tests].[test returns delay row when DelayId exists]                                                    |     62|Success|
|3  |[DEL_GetDelay_Tests].[test returns empty result set when DelayId does not exist]                                     |     80|Success|
|4  |[DEL_GetDelay_Tests].[test returns NULL End for active delay]                                                        |     81|Success|
|5  |[DEL_GetDelay_Tests].[test returns NULL justification fields for unjustified delay]                                  |    151|Success|
|6  |[DEL_GetDelay_Tests].[test returns only matching delay when multiple delays exist]                                   |   1418|Success|
|7  |[DEL_GetDelay_Tests].[test returns split delay original fields]                                                      |    108|Success|
|8  |[DEL_SpliceDelaysByShiftJob_Tests].[test assigns ShiftId via GetShiftId for new slices]                              |    107|Success|
|9  |[DEL_SpliceDelaysByShiftJob_Tests].[test closes open delay at boundary for past shifts]                              |     91|Success|
|10 |[DEL_SpliceDelaysByShiftJob_Tests].[test does not modify delay contained in one shift]                               |     91|Success|
|11 |[DEL_SpliceDelaysByShiftJob_Tests].[test handles delay starting on shift boundary]                                   |     83|Success|
|12 |[DEL_SpliceDelaysByShiftJob_Tests].[test ignores delays before DaysBack window]                                      |    109|Success|
|13 |[DEL_SpliceDelaysByShiftJob_Tests].[test ignores delays starting after End parameter]                                |    153|Success|
|14 |[DEL_SpliceDelaysByShiftJob_Tests].[test is idempotent on second run]                                                |    120|Success|
|15 |[DEL_SpliceDelaysByShiftJob_Tests].[test keeps open delay open in current shift]                                     |    119|Success|
|16 |[DEL_SpliceDelaysByShiftJob_Tests].[test marks slice non-micro when longer than MinDelayTime]                        |     87|Success|
|17 |[DEL_SpliceDelaysByShiftJob_Tests].[test NULL AssetId processes only Caster EAF LMF]                                 |    100|Success|
|18 |[DEL_SpliceDelaysByShiftJob_Tests].[test preserves OriginalDelayId when re-splicing]                                 |     97|Success|
|19 |[DEL_SpliceDelaysByShiftJob_Tests].[test propagates justification and metadata to new slices]                        |    103|Success|
|20 |[DEL_SpliceDelaysByShiftJob_Tests].[test sets OriginalDelayId to self for first splice]                              |     99|Success|
|21 |[DEL_SpliceDelaysByShiftJob_Tests].[test splits delay crossing multiple shift boundaries]                            |    116|Success|
|22 |[DEL_SpliceDelaysByShiftJob_Tests].[test splits delay crossing one shift boundary]                                   |    118|Success|
|23 |[DEL_SpliceDelaysByShiftJob_Tests].[test throws when AssetId does not exist]                                         |     58|Success|
|24 |[DEL_UpsertDelayCategory_Tests].[test insert ignores @IsActive parameter]                                            |    141|Success|
|25 |[DEL_UpsertDelayCategory_Tests].[test insert with name colliding inactive sibling succeeds]                          |     70|Success|
|26 |[DEL_UpsertDelayCategory_Tests].[test insert with same name in different area succeeds]                              |     80|Success|
|27 |[DEL_UpsertDelayCategory_Tests].[test insert writes Name Color and DelayAreaAssetId]                                 |     60|Success|
|28 |[DEL_UpsertDelayCategory_Tests].[test successful insert does not call WriteLog]                                      |     67|Success|
|29 |[DEL_UpsertDelayCategory_Tests].[test successful update calls WriteLog once]                                         |    100|Success|
|30 |[DEL_UpsertDelayCategory_Tests].[test throws 50000 when name collides with active sibling in same area]              |     71|Success|
|31 |[DEL_UpsertDelayCategory_Tests].[test throws 51001 when both DelayAreaAssetId and DelayCategoryId are NULL]          |     50|Success|
|32 |[DEL_UpsertDelayCategory_Tests].[test throws 51002 when DelayAreaAssetId is not a delay area]                        |     50|Success|
|33 |[DEL_UpsertDelayCategory_Tests].[test throws 51002 when update reparents to a non-delay-area asset]                  |     54|Success|
|34 |[DEL_UpsertDelayCategory_Tests].[test throws 51004 when DelayCategoryName is NULL]                                   |     63|Success|
|35 |[DEL_UpsertDelayCategory_Tests].[test throws 51005 when DelayCategoryColor is NULL]                                  |     54|Success|
|36 |[DEL_UpsertDelayCategory_Tests].[test throws 51006 when DelayCategoryId does not exist]                              |     59|Success|
|37 |[DEL_UpsertDelayCategory_Tests].[test update inherits DelayAreaAssetId from existing row when NULL]                  |     66|Success|
|38 |[DEL_UpsertDelayCategory_Tests].[test update reparents category to new DelayAreaAssetId]                             |     58|Success|
|39 |[DEL_UpsertDelayCategory_Tests].[test update toggles IsActive]                                                       |     58|Success|
|40 |[DEL_UpsertDelayCategory_Tests].[test update with same name as self does not throw 50000]                            |     75|Success|
|41 |[DEL_UpsertDelayCategory_Tests].[test update writes new DelayCategoryColor]                                          |    139|Success|
|42 |[DEL_UpsertDelayCategory_Tests].[test update writes new DelayCategoryName]                                           |     66|Success|
|43 |[DEL_UpsertManualDelay_Tests].[test insert open delay leaves End NULL]                                               |    182|Success|
|44 |[DEL_UpsertManualDelay_Tests].[test insert throws 51301 when AssetId is NULL]                                        |     87|Success|
|45 |[DEL_UpsertManualDelay_Tests].[test insert throws 51302 when Start is NULL]                                          |     91|Success|
|46 |[DEL_UpsertManualDelay_Tests].[test insert throws 51303 when an open delay precedes Start]                           |    149|Success|
|47 |[DEL_UpsertManualDelay_Tests].[test insert throws 51304 when End is before Start]                                    |    107|Success|
|48 |[DEL_UpsertManualDelay_Tests].[test insert throws 51305 when range collides with existing delay]                     |     75|Success|
|49 |[DEL_UpsertManualDelay_Tests].[test insert throws 51306 when End is NULL and a later delay exists]                   |     87|Success|
|50 |[DEL_UpsertManualDelay_Tests].[test insert with code stamps JustifiedByUser and JustifiedDatetime]                   |     95|Success|
|51 |[DEL_UpsertManualDelay_Tests].[test insert with End sets IsDelayManual IsMicroDelay and ShiftId]                     |    169|Success|
|52 |[DEL_UpsertManualDelay_Tests].[test insert without code or category leaves Justified fields NULL]                    |     87|Success|
|53 |[DEL_UpsertManualDelay_Tests].[test NULL skips Code and Category existence check]                                    |     99|Success|
|54 |[DEL_UpsertManualDelay_Tests].[test sentinel -1 skips Code and Category existence check]                             |    112|Success|
|55 |[DEL_UpsertManualDelay_Tests].[test throws 51309 when DelayCategoryId does not exist]                                |     96|Success|
|56 |[DEL_UpsertManualDelay_Tests].[test throws 51309 when DelayCodeId does not exist]                                    |     79|Success|
|57 |[DEL_UpsertManualDelay_Tests].[test throws 51310 when no shift exists for Start]                                     |     86|Success|
|58 |[DEL_UpsertManualDelay_Tests].[test update changing code re-stamps Justified fields]                                 |     99|Success|
|59 |[DEL_UpsertManualDelay_Tests].[test update inherits current Start when @Start is NULL]                               |    162|Success|
|60 |[DEL_UpsertManualDelay_Tests].[test update throws 51307 when DelayId does not exist]                                 |     75|Success|
|61 |[DEL_UpsertManualDelay_Tests].[test update throws 51308 when delay is not manual]                                    |     82|Success|
|62 |[DEL_UpsertManualDelay_Tests].[test update throws 51311 when an open delay precedes Start]                           |     87|Success|
|63 |[DEL_UpsertManualDelay_Tests].[test update throws 51312 when inherited End is before new Start]                      |    145|Success|
|64 |[DEL_UpsertManualDelay_Tests].[test update with non-NULL Comments overwrites]                                        |    212|Success|
|65 |[DEL_UpsertManualDelay_Tests].[test update with NULL Comments keeps existing]                                        |    129|Success|
|66 |[DEL_UpsertManualDelay_Tests].[test update with NULL wipes code]                                                     |    136|Success|
|67 |[DEL_UpsertManualDelay_Tests].[test update with same code does not re-stamp Justified fields]                        |    191|Success|
|68 |[DEL_UpsertManualDelay_Tests].[test update with sentinel -1 keeps current code]                                      |    128|Success|
|69 |[DEL_UpsertManualDelay_Tests].[test update with sentinel -1 on code does not re-stamp Justified fields]              |    183|Success|
|70 |[DEL_UpsertManualDelay_Tests].[test update writes new Start End and recomputes ShiftId]                              |    196|Success|
|71 |[EQP_UpsertBatch_Tests].[test 1 INSERT: new ReferenceId+PartId creates a row]                                        |     37|Success|
|72 |[EQP_UpsertBatch_Tests].[test 10 LOG: writes audit on insert but not on a no-op re-run]                              |     54|Success|
|73 |[EQP_UpsertBatch_Tests].[test 2 INSERT: omitted BatchId resolves existing key instead of inserting]                  |     29|Success|
|74 |[EQP_UpsertBatch_Tests].[test 3 INSERT: null Timestamp skips the duplicate guard and inserts]                        |     55|Success|
|75 |[EQP_UpsertBatch_Tests].[test 4 INSERT: omitted ReferenceId is backfilled with a non-null value]                     |     52|Success|
|76 |[EQP_UpsertBatch_Tests].[test 5 UPDATE: identical re-run is a no-op]                                                 |     41|Success|
|77 |[EQP_UpsertBatch_Tests].[test 6 UPDATE: changed Timestamp updates the existing row]                                  |     51|Success|
|78 |[EQP_UpsertBatch_Tests].[test 7 UPDATE: explicit BatchId with different ReferenceId overwrites it]                   |     49|Success|
|79 |[EQP_UpsertBatch_Tests].[test 8 VALIDATE: same Timestamp+PartId on a different batch raises]                         |     28|Success|
|80 |[EQP_UpsertBatch_Tests].[test 9 VALIDATE: returns the persisted BatchId on insert and no-op]                         |     55|Success|
|81 |[EQP_UpsertBatchMetrics_Tests].[test 1 INSERT: new BatchId+MetricTypeId creates a row]                               |     47|Success|
|82 |[EQP_UpsertBatchMetrics_Tests].[test 2 INSERT: float Value is stored precisely]                                      |     38|Success|
|83 |[EQP_UpsertBatchMetrics_Tests].[test 3 INSERT: null Value inserts a null]                                            |     47|Success|
|84 |[EQP_UpsertBatchMetrics_Tests].[test 4 UPDATE: existing row has its Value overwritten]                               |     46|Success|
|85 |[EQP_UpsertBatchMetrics_Tests].[test 5 UPDATE: replace touches only the matching MetricTypeId]                       |     41|Success|
|86 |[EQP_UpsertBatchMetrics_Tests].[test 6 VALIDATE: failed write logs E and re-raises]                                  |     37|Success|
|87 |[EQP_UpsertTask_Tests].[test 1 INSERT: CREATE writes catParts row]                                                   |    124|Success|
|88 |[EQP_UpsertTask_Tests].[test 10 UPDATE: CORRECTION removal updates existing task in place]                           |    103|Success|
|89 |[EQP_UpsertTask_Tests].[test 11 UPDATE: CORRECTION removal preserves ParentPartId and PositionId]                    |    130|Success|
|90 |[EQP_UpsertTask_Tests].[test 12 UPDATE: CORRECTION install updates existing task in place]                           |    182|Success|
|91 |[EQP_UpsertTask_Tests].[test 13 UPDATE: CORRECTION install with NULL parent preserves existing]                      |     99|Success|
|92 |[EQP_UpsertTask_Tests].[test 14 UPDATE: CORRECTION install overwrites parent and position]                           |    100|Success|
|93 |[EQP_UpsertTask_Tests].[test 15 VALIDATE: CREATE requires PartTypeId]                                                |     87|Success|
|94 |[EQP_UpsertTask_Tests].[test 16 VALIDATE: CREATE requires PartName]                                                  |    129|Success|
|95 |[EQP_UpsertTask_Tests].[test 17 VALIDATE: CREATE requires ParentPartId]                                              |     66|Success|
|96 |[EQP_UpsertTask_Tests].[test 18 VALIDATE: REMOVE fresh floor is last install timestamp]                              |     85|Success|
|97 |[EQP_UpsertTask_Tests].[test 19 VALIDATE: CORRECTION removal floor is previous timestamp]                            |     95|Success|
|98 |[EQP_UpsertTask_Tests].[test 2 INSERT: CREATE invokes MovePart with returned PartId]                                 |     79|Success|
|99 |[EQP_UpsertTask_Tests].[test 20 VALIDATE: INSTALL part floor blocks earlier than last task]                          |     79|Success|
|100|[EQP_UpsertTask_Tests].[test 21 VALIDATE: INSTALL location floor blocks slot overlap]                                |    111|Success|
|101|[EQP_UpsertTask_Tests].[test 22 VALIDATE: NULL timestamp is coerced to GETUTCDATE]                                   |    188|Success|
|102|[EQP_UpsertTask_Tests].[test 23 LOG: CREATE success writes informational log]                                        |    108|Success|
|103|[EQP_UpsertTask_Tests].[test 25 LOG: REMOVE fresh success writes informational log]                                  |    187|Success|
|104|[EQP_UpsertTask_Tests].[test 26 LOG: CORRECTION removal success writes informational log]                            |    185|Success|
|105|[EQP_UpsertTask_Tests].[test 27 LOG: INSTALL fresh success writes informational log]                                 |    125|Success|
|106|[EQP_UpsertTask_Tests].[test 28 LOG: CORRECTION install success writes informational log]                            |    118|Success|
|107|[EQP_UpsertTask_Tests].[test 29 INSERT: CREATE backdated triggers cache rebuild]                                     |    196|Success|
|108|[EQP_UpsertTask_Tests].[test 3 INSERT: CREATE returns new PartId]                                                    |    178|Success|
|109|[EQP_UpsertTask_Tests].[test 30 INSERT: REMOVE backdated deletes batches and batch metrics]                          |    103|Success|
|110|[EQP_UpsertTask_Tests].[test 31 UPDATE: CORRECTION removal backdated deletes window batches]                         |     95|Success|
|111|[EQP_UpsertTask_Tests].[test 32 INSERT: INSTALL backdated triggers cache rebuild]                                    |    118|Success|
|112|[EQP_UpsertTask_Tests].[test 4 INSERT: INSTALL from default array invokes MovePart]                                  |    175|Success|
|113|[EQP_UpsertTask_Tests].[test 5 INSERT: INSTALL with no history invokes MovePart]                                     |     83|Success|
|114|[EQP_UpsertTask_Tests].[test 6 INSERT: INSTALL future timestamp does not rebuild cache]                              |    104|Success|
|115|[EQP_UpsertTask_Tests].[test 7 INSERT: REMOVE invokes MovePart with MoveToDefaultArray]                              |     71|Success|
|116|[EQP_UpsertTask_Tests].[test 8 INSERT: REMOVE with no history invokes MovePart with MoveToDefaultArray]              |    108|Success|
|117|[EQP_UpsertTask_Tests].[test 9 INSERT: REMOVE future timestamp does not delete batches]                              |    124|Success|
|118|[EQP_UpsertPart_Tests].[test 10 VALIDATE NULL PartTypeId throws]                                                     |    123|Failure|
|119|[EQP_UpsertPart_Tests].[test 22 VALIDATE on non-existent PartId throws]                                              |     29|Failure|
|120|[EQP_UpsertPart_Tests].[test 24 VALIDATE NULL User throws]                                                           |     34|Failure|
|121|[EQP_UpsertPart_Tests].[test 25 VALIDATE empty User throws]                                                          |     33|Failure|
|122|[EQP_UpsertPart_Tests].[test 7 VALIDATE empty PartName throws]                                                       |     33|Failure|
|123|[EQP_UpsertPart_Tests].[test 8 VALIDATE NULL PartName throws]                                                        |     21|Failure|
|124|[EQP_UpsertPart_Tests].[test 9 VALIDATE PartTypeId = -1 throws]                                                      |     54|Failure|
|125|[EQP_UpsertPartType_Tests].[test 12 VALIDATE on non-existent PartTypeId throws]                                      |     71|Failure|
|126|[EQP_UpsertPartType_Tests].[test 13 VALIDATE InheritedFrom equal to PartTypeId throws]                               |     33|Failure|
|127|[EQP_UpsertPartType_Tests].[test 15 VALIDATE NULL User throws]                                                       |     29|Failure|
|128|[EQP_UpsertPartType_Tests].[test 16 VALIDATE empty User throws]                                                      |     33|Failure|
|129|[EQP_UpsertPartType_Tests].[test 4 VALIDATE empty PartTypeName throws]                                               |     33|Failure|
|130|[EQP_UpsertPartType_Tests].[test 5 VALIDATE NULL PartTypeName throws]                                                |     29|Failure|
|131|[EQP_UpsertPartTypeTree_Tests].[test 13 VALIDATE NULL User throws]                                                   |     20|Failure|
|132|[EQP_UpsertPartTypeTree_Tests].[test 14 VALIDATE empty User throws]                                                  |     29|Failure|
|133|[EQP_UpsertPartTypeTree_Tests].[test 5 VALIDATE NULL ParentPartTypeId throws]                                        |     29|Failure|
|134|[EQP_UpsertPartTypeTree_Tests].[test 6 VALIDATE NULL PartTypeId throws]                                              |     29|Failure|
|135|[EQP_UpsertPartTypeTree_Tests].[test 7 VALIDATE NULL PositionId throws]                                              |     21|Failure|
|136|[EQP_UpsertPartTypeTree_Tests].[test 8 VALIDATE self-referencing edge throws]                                        |     25|Failure|
|137|[EQP_UpsertTask_Tests].[test 33 VALIDATE: INSTALL fresh requires ParentPartId]                                       |    104|Failure|
|138|[EQP_UpsertPart_Tests].[test 1 INSERT writes PartTypeId and PartName]                                                |     32|Error  |
|139|[EQP_UpsertPart_Tests].[test 11 UPDATE overwrites PartTypeId and PartName of the targeted row]                       |     34|Error  |
|140|[EQP_UpsertPart_Tests].[test 12 UPDATE returns the targeted PartId]                                                  |     24|Error  |
|141|[EQP_UpsertPart_Tests].[test 13 UPDATE preserves IsActive IsDefaultArray and AuxPartId]                              |     37|Error  |
|142|[EQP_UpsertPart_Tests].[test 14 UPDATE only affects the targeted row]                                                |     53|Error  |
|143|[EQP_UpsertPart_Tests].[test 15 UPDATE with PartTypeId = -1 preserves current]                                       |     29|Error  |
|144|[EQP_UpsertPart_Tests].[test 16 UPDATE with empty PartName preserves current]                                        |     42|Error  |
|145|[EQP_UpsertPart_Tests].[test 17 UPDATE with explicit IsActive flips the value]                                       |     38|Error  |
|146|[EQP_UpsertPart_Tests].[test 18 UPDATE with explicit IsDefaultArray flips the value]                                 |     37|Error  |
|147|[EQP_UpsertPart_Tests].[test 19 UPDATE with explicit AuxPartId writes the new value]                                 |     34|Error  |
|148|[EQP_UpsertPart_Tests].[test 2 INSERT returns the new identity value]                                                |     33|Error  |
|149|[EQP_UpsertPart_Tests].[test 20 UPDATE with AuxPartId = -1 preserves current]                                        |     46|Error  |
|150|[EQP_UpsertPart_Tests].[test 21 UPDATE with explicit NULL AuxPartId clears the value]                                |     29|Error  |
|151|[EQP_UpsertPart_Tests].[test 23 UPDATE with no changes still returns the PartId]                                     |     38|Error  |
|152|[EQP_UpsertPart_Tests].[test 26 LOG insert writes an informational audit log row]                                    |     34|Error  |
|153|[EQP_UpsertPart_Tests].[test 27 LOG update with changes writes an informational audit log row with the delta]        |     37|Error  |
|154|[EQP_UpsertPart_Tests].[test 28 LOG update with no changes writes no audit log row]                                  |     33|Error  |
|155|[EQP_UpsertPart_Tests].[test 29 LOG User parameter is forwarded to the audit log]                                    |     29|Error  |
|156|[EQP_UpsertPart_Tests].[test 3 INSERT leaves IsActive IsDefaultArray and AuxPartId at table defaults]                |     66|Error  |
|157|[EQP_UpsertPart_Tests].[test 30 LOG custom LogMessage replaces the auto-generated insert message]                    |     37|Error  |
|158|[EQP_UpsertPart_Tests].[test 31 LOG custom LogMessage replaces the auto-generated update message]                    |     37|Error  |
|159|[EQP_UpsertPart_Tests].[test 32 LOG custom LogMessage is ignored on no-change update]                                |     66|Error  |
|160|[EQP_UpsertPart_Tests].[test 4 INSERT with explicit IsDefaultArray writes the value]                                 |     42|Error  |
|161|[EQP_UpsertPart_Tests].[test 5 INSERT with explicit AuxPartId writes the value]                                      |     33|Error  |
|162|[EQP_UpsertPart_Tests].[test 6 INSERT allows duplicate PartName values]                                              |     33|Error  |
|163|[EQP_UpsertPartType_Tests].[test 1 INSERT writes PartTypeName IsArray IsReplaceable and InheritedFrom]               |     29|Error  |
|164|[EQP_UpsertPartType_Tests].[test 10 UPDATE with IsArray IsReplaceable and SortOrder omitted preserves current]       |     25|Error  |
|165|[EQP_UpsertPartType_Tests].[test 11 UPDATE with explicit SortOrder writes the new value]                             |     38|Error  |
|166|[EQP_UpsertPartType_Tests].[test 14 UPDATE with no changes still returns the PartTypeId]                             |     33|Error  |
|167|[EQP_UpsertPartType_Tests].[test 17 LOG insert writes an informational audit log row]                                |     33|Error  |
|168|[EQP_UpsertPartType_Tests].[test 18 LOG update with changes writes an informational audit log row with the delta]    |     58|Error  |
|169|[EQP_UpsertPartType_Tests].[test 19 LOG update with no changes writes no audit log row]                              |     45|Error  |
|170|[EQP_UpsertPartType_Tests].[test 2 INSERT returns the new identity value]                                            |     29|Error  |
|171|[EQP_UpsertPartType_Tests].[test 20 LOG User parameter is forwarded to the audit log]                                |     29|Error  |
|172|[EQP_UpsertPartType_Tests].[test 21 LOG custom LogMessage replaces the auto-generated insert message]                |     24|Error  |
|173|[EQP_UpsertPartType_Tests].[test 22 LOG custom LogMessage replaces the auto-generated update message]                |     29|Error  |
|174|[EQP_UpsertPartType_Tests].[test 23 LOG custom LogMessage is ignored on no-change update]                            |     34|Error  |
|175|[EQP_UpsertPartType_Tests].[test 3 INSERT with optional params omitted honours table defaults]                       |     47|Error  |
|176|[EQP_UpsertPartType_Tests].[test 6 UPDATE overwrites all five columns of the existing row]                           |     29|Error  |
|177|[EQP_UpsertPartType_Tests].[test 7 UPDATE returns the targeted PartTypeId]                                           |     34|Error  |
|178|[EQP_UpsertPartType_Tests].[test 8 UPDATE with empty PartTypeName preserves current]                                 |     29|Error  |
|179|[EQP_UpsertPartType_Tests].[test 9 UPDATE with InheritedFrom = -1 preserves current]                                 |     33|Error  |
|180|[EQP_UpsertPartTypeTree_Tests].[test 1 INSERT writes ParentPartTypeId PartTypeId PositionId and PositionName]        |     21|Error  |
|181|[EQP_UpsertPartTypeTree_Tests].[test 10 UPDATE returns zero]                                                         |     25|Error  |
|182|[EQP_UpsertPartTypeTree_Tests].[test 11 UPDATE with empty PositionName preserves current]                            |     29|Error  |
|183|[EQP_UpsertPartTypeTree_Tests].[test 12 UPDATE with explicit NULL PositionName clears the value]                     |     21|Error  |
|184|[EQP_UpsertPartTypeTree_Tests].[test 15 LOG insert writes an informational audit log row]                            |     33|Error  |
|185|[EQP_UpsertPartTypeTree_Tests].[test 16 LOG update with changes writes an informational audit log row with the delta]|     25|Error  |
|186|[EQP_UpsertPartTypeTree_Tests].[test 17 LOG update with no changes writes no audit log row]                          |     38|Error  |
|187|[EQP_UpsertPartTypeTree_Tests].[test 18 LOG User parameter is forwarded to the audit log]                            |    116|Error  |
|188|[EQP_UpsertPartTypeTree_Tests].[test 19 LOG custom LogMessage replaces the auto-generated insert message]            |     33|Error  |
|189|[EQP_UpsertPartTypeTree_Tests].[test 2 INSERT returns zero]                                                          |     24|Error  |
|190|[EQP_UpsertPartTypeTree_Tests].[test 20 LOG custom LogMessage replaces the auto-generated update message]            |     33|Error  |
|191|[EQP_UpsertPartTypeTree_Tests].[test 21 LOG custom LogMessage is ignored on no-change update]                        |     25|Error  |
|192|[EQP_UpsertPartTypeTree_Tests].[test 3 INSERT with omitted PositionName writes NULL]                                 |     29|Error  |
|193|[EQP_UpsertPartTypeTree_Tests].[test 4 INSERT allows the same child type at multiple positions of the same parent]   |     29|Error  |
|194|[EQP_UpsertPartTypeTree_Tests].[test 9 UPDATE overwrites PositionName when edge already exists]                      |     73|Error  |
|195|[EQP_UpsertTask_Tests].[test 24 LOG: error path writes error log and re-raises]                                      |    198|Error  |
----------------------------------------------------------------------------------------------
Msg 50000, Level 16, State 10, Server 3a9ed6e32c34, Line 1
Test Case Summary: 195 test case(s) executed, 117 succeeded, 0 skipped, 20 failed, 58 errored.
----------------------------------------------------------------------------------------------