PASSED
tSQLt SQL E2E
Generated at 2026-10-07T19:28:57.543Z. Raw output: run-tsqlt-output.txt. Structured data: results.json.
Total
518
Passed
518
Failed
0
Skipped
0
Errored
0
Modules
23
Module Summary
| Module | Total | Passed | Failed | Skipped | Errored |
|---|---|---|---|---|---|
| DIM_Dimensions_Tests | 8 | 8 | 0 | 0 | 0 |
| DIM_ProfileInspections_Tests | 14 | 14 | 0 | 0 | 0 |
| DIM_ProfileSpecs_Tests | 45 | 45 | 0 | 0 | 0 |
| LAB_EvaluateMechanicalResult_Tests | 13 | 13 | 0 | 0 | 0 |
| LAB_TensileRequirements_Tests | 16 | 16 | 0 | 0 | 0 |
| M2_CarrierInstancesPasses_Tests | 31 | 31 | 0 | 0 | 0 |
| M2_CarrierProtection_Tests | 48 | 48 | 0 | 0 | 0 |
| M2_DeleteEvent_Tests | 4 | 4 | 0 | 0 | 0 |
| M2_DetectRollsetDisruption_Tests | 28 | 28 | 0 | 0 | 0 |
| M2_DisruptionTracking_Tests | 16 | 16 | 0 | 0 | 0 |
| M2_DraftEvents_Tests | 70 | 70 | 0 | 0 | 0 |
| M2_EdgerRollPass_Tests | 15 | 15 | 0 | 0 | 0 |
| M2_EventErrorHandling_Tests | 9 | 9 | 0 | 0 | 0 |
| M2_EventIntegration_Tests | 35 | 35 | 0 | 0 | 0 |
| M2_GetCampaignsByEventId_Tests | 3 | 3 | 0 | 0 | 0 |
| M2_GetProductionMonth_Tests | 6 | 6 | 0 | 0 | 0 |
| M2_NonProductiveOverlap_Tests | 10 | 10 | 0 | 0 | 0 |
| M2_PassCampaigns_Tests | 14 | 14 | 0 | 0 | 0 |
| M2_ResolveEventCollisions_Tests | 48 | 48 | 0 | 0 | 0 |
| M2_ScheduleCompaction_Tests | 22 | 22 | 0 | 0 | 0 |
| M2_SwapRollsetsRolls_Tests | 16 | 16 | 0 | 0 | 0 |
| M2_SyncCampaignsToProductionEvents_Tests | 39 | 39 | 0 | 0 | 0 |
| M2_TrackPassCampaignsJob_Tests | 8 | 8 | 0 | 0 | 0 |
Test Results
| # | Module | Test | Duration (ms) | Result |
|---|---|---|---|---|
| 1 | DIM_Dimensions_Tests | test DeleteDimension amends a scheduled revision keeping its date and deactivates the original | 53 | Success |
| 2 | DIM_Dimensions_Tests | test DeleteDimension amends the revision in force from now on without the dimension | 52 | Success |
| 3 | DIM_Dimensions_Tests | test DeleteDimension leaves older published revisions untouched | 69 | Success |
| 4 | DIM_Dimensions_Tests | test DeleteDimension numbers a second retirement after the previous amendment | 57 | Success |
| 5 | DIM_Dimensions_Tests | test DeleteDimension removes the dimension from drafts without numbering them | 52 | Success |
| 6 | DIM_Dimensions_Tests | test PublishSpecsWithoutDimensions rejects leaving a revision without bands | 45 | Success |
| 7 | DIM_Dimensions_Tests | test UpsertDimension reactivates a retired dimension when its code is created again | 53 | Success |
| 8 | DIM_Dimensions_Tests | test UpsertDimension rejects a code used by an active dimension | 48 | Success |
| 9 | DIM_ProfileInspections_Tests | test GetProfileInspections grades each reading against the band of its revision | 94 | Success |
| 10 | DIM_ProfileInspections_Tests | test GetProfileInspections uses the revision the sample was judged against | 52 | Success |
| 11 | DIM_ProfileInspections_Tests | test UpsertProfileInspection does not judge against a scheduled revision | 73 | Success |
| 12 | DIM_ProfileInspections_Tests | test UpsertProfileInspection ignores a campaign that starts after the sample | 105 | Success |
| 13 | DIM_ProfileInspections_Tests | test UpsertProfileInspection judges against a scheduled revision as soon as its date passes | 65 | Success |
| 14 | DIM_ProfileInspections_Tests | test UpsertProfileInspection pins again when an edit moves SampledAt | 77 | Success |
| 15 | DIM_ProfileInspections_Tests | test UpsertProfileInspection pins the revision in force when the sample was taken | 118 | Success |
| 16 | DIM_ProfileInspections_Tests | test UpsertProfileInspection rejects a dimension the revision does not measure | 56 | Success |
| 17 | DIM_ProfileInspections_Tests | test UpsertProfileInspection rejects a heat id that does not exist | 57 | Success |
| 18 | DIM_ProfileInspections_Tests | test UpsertProfileInspection rejects a heat name of neither year | 57 | Success |
| 19 | DIM_ProfileInspections_Tests | test UpsertProfileInspection resolves a heat with no campaign from the previous year | 85 | Success |
| 20 | DIM_ProfileInspections_Tests | test UpsertProfileInspection stores a heat rolled on another section without its campaign | 121 | Success |
| 21 | DIM_ProfileInspections_Tests | test UpsertProfileInspection takes the campaign of a heat sent by id | 89 | Success |
| 22 | DIM_ProfileInspections_Tests | test UpsertProfileInspection takes the heat and campaign from the campaign that was running | 106 | Success |
| 23 | DIM_ProfileSpecs_Tests | test CK_DIM_ProfileSpecDimensions_Band accepts null limits | 61 | Success |
| 24 | DIM_ProfileSpecs_Tests | test ConfirmProfileSpec accepts an explicit Rev only above the last one | 85 | Success |
| 25 | DIM_ProfileSpecs_Tests | test ConfirmProfileSpec accepts the same date as a previous revision without inspections | 122 | Success |
| 26 | DIM_ProfileSpecs_Tests | test ConfirmProfileSpec numbers the revision after the last confirmed one | 78 | Success |
| 27 | DIM_ProfileSpecs_Tests | test ConfirmProfileSpec rejects a date before a previous revision without inspections | 53 | Success |
| 28 | DIM_ProfileSpecs_Tests | test ConfirmProfileSpec rejects a date equal to the last inspection of the previous revision | 138 | Success |
| 29 | DIM_ProfileSpecs_Tests | test ConfirmProfileSpec rejects a revision already confirmed | 69 | Success |
| 30 | DIM_ProfileSpecs_Tests | test ConfirmProfileSpec with a future EffectiveDate leaves the revision scheduled | 82 | Success |
| 31 | DIM_ProfileSpecs_Tests | test ConfirmProfileSpec without EffectiveDate publishes the revision now | 49 | Success |
| 32 | DIM_ProfileSpecs_Tests | test CorrectProfileSpec changes Rev and EffectiveDate of a revision without inspections | 89 | Success |
| 33 | DIM_ProfileSpecs_Tests | test CorrectProfileSpec changes the bands of a revision with inspections in place | 82 | Success |
| 34 | DIM_ProfileSpecs_Tests | test CorrectProfileSpec keeps Rev and EffectiveDate when they are not sent | 77 | Success |
| 35 | DIM_ProfileSpecs_Tests | test CorrectProfileSpec rejects a Rev not above the revision it replaces | 69 | Success |
| 36 | DIM_ProfileSpecs_Tests | test CorrectProfileSpec rejects a revision that is not the last one | 65 | Success |
| 37 | DIM_ProfileSpecs_Tests | test CorrectProfileSpec rejects a user without the permission | 32 | Success |
| 38 | DIM_ProfileSpecs_Tests | test CorrectProfileSpec rejects an EffectiveDate before the revision it replaces | 52 | Success |
| 39 | DIM_ProfileSpecs_Tests | test CorrectProfileSpec rejects changing the effective date of a revision with inspections | 49 | Success |
| 40 | DIM_ProfileSpecs_Tests | test CorrectProfileSpec rejects removing a dimension measured by an inspection | 73 | Success |
| 41 | DIM_ProfileSpecs_Tests | test CorrectProfileSpec removes a dimension that no inspection measured | 134 | Success |
| 42 | DIM_ProfileSpecs_Tests | test DeleteProfileSpec amends the revision back in force when it has a retired dimension | 53 | Success |
| 43 | DIM_ProfileSpecs_Tests | test DeleteProfileSpec brings the previous revision back in force | 40 | Success |
| 44 | DIM_ProfileSpecs_Tests | test DeleteProfileSpec deletes a published Rev with all its sub-revisions | 45 | Success |
| 45 | DIM_ProfileSpecs_Tests | test DeleteProfileSpec rejects a Rev while one of its sub-revisions has active inspections | 117 | Success |
| 46 | DIM_ProfileSpecs_Tests | test GetProfileSpec returns a scheduled revision by id as S and SCHEDULED | 57 | Success |
| 47 | DIM_ProfileSpecs_Tests | test UnscheduleProfileSpec rejects a published revision that is not the last one | 49 | Success |
| 48 | DIM_ProfileSpecs_Tests | test UnscheduleProfileSpec rejects a revision while the section has a draft | 49 | Success |
| 49 | DIM_ProfileSpecs_Tests | test UnscheduleProfileSpec rejects a revision with sub-revisions | 49 | Success |
| 50 | DIM_ProfileSpecs_Tests | test UnscheduleProfileSpec rejects the revision in force when it has inspections | 40 | Success |
| 51 | DIM_ProfileSpecs_Tests | test UnscheduleProfileSpec rejects the revision in force without the permission | 61 | Success |
| 52 | DIM_ProfileSpecs_Tests | test UnscheduleProfileSpec sends a scheduled revision back to draft with its bands | 73 | Success |
| 53 | DIM_ProfileSpecs_Tests | test UnscheduleProfileSpec sends a scheduled revision back to draft without the permission | 61 | Success |
| 54 | DIM_ProfileSpecs_Tests | test UnscheduleProfileSpec sends the revision in force back to draft and Confirm reuses its number | 114 | Success |
| 55 | DIM_ProfileSpecs_Tests | test UpsertProfileSpec accepts a band with null limits | 49 | Success |
| 56 | DIM_ProfileSpecs_Tests | test UpsertProfileSpec creates a draft without Rev or EffectiveDate | 69 | Success |
| 57 | DIM_ProfileSpecs_Tests | test UpsertProfileSpec opens a draft when a published revision is edited | 81 | Success |
| 58 | DIM_ProfileSpecs_Tests | test UpsertProfileSpec rejects a band out of order | 28 | Success |
| 59 | DIM_ProfileSpecs_Tests | test UpsertProfileSpec rejects a new draft when the section already has one | 73 | Success |
| 60 | DIM_ProfileSpecs_Tests | test UpsertProfileSpec rejects a new draft while a revision is scheduled | 57 | Success |
| 61 | DIM_ProfileSpecs_Tests | test UpsertProfileSpec rejects an unknown or retired dimension code | 45 | Success |
| 62 | DIM_ProfileSpecs_Tests | test UpsertProfileSpec rejects editing a scheduled revision | 37 | Success |
| 63 | DIM_ProfileSpecs_Tests | test UpsertProfileSpec with null id creates a draft without changing the published revision | 57 | Success |
| 64 | DIM_ProfileSpecs_Tests | test UpsertProfileSpec writes a first drawing onto the published revision | 85 | Success |
| 65 | DIM_ProfileSpecs_Tests | test vProfileSpecs shows a confirmed revision whose EffectiveDate has passed as P | 25 | Success |
| 66 | DIM_ProfileSpecs_Tests | test vProfileSpecs shows a confirmed revision with a future EffectiveDate as S | 24 | Success |
| 67 | DIM_ProfileSpecs_Tests | test vProfileSpecs shows a draft as D | 33 | Success |
| 68 | LAB_EvaluateMechanicalResult_Tests | test Elongation is never converted | 4 | Success |
| 69 | LAB_EvaluateMechanicalResult_Tests | test ksi limits are not converted | 0 | Success |
| 70 | LAB_EvaluateMechanicalResult_Tests | test missing Yield fails when a min is required | 4 | Success |
| 71 | LAB_EvaluateMechanicalResult_Tests | test Passed is NULL when there is nothing to check | 0 | Success |
| 72 | LAB_EvaluateMechanicalResult_Tests | test RA missing with section but no grade limit does not fail | 4 | Success |
| 73 | LAB_EvaluateMechanicalResult_Tests | test RA missing with section demanding it fails | 4 | Success |
| 74 | LAB_EvaluateMechanicalResult_Tests | test RA missing without section does not fail | 4 | Success |
| 75 | LAB_EvaluateMechanicalResult_Tests | test RA present below min is judged regardless of section | 0 | Success |
| 76 | LAB_EvaluateMechanicalResult_Tests | test RA present in range with section and grade passes | 0 | Success |
| 77 | LAB_EvaluateMechanicalResult_Tests | test Tensile max in N per mm2 fails above converted max | 0 | Success |
| 78 | LAB_EvaluateMechanicalResult_Tests | test Yield in N per mm2 fails below converted min | 0 | Success |
| 79 | LAB_EvaluateMechanicalResult_Tests | test Yield in N per mm2 passes after conversion | 0 | Success |
| 80 | LAB_EvaluateMechanicalResult_Tests | test Yield in PSI fails below converted min | 0 | Success |
| 81 | LAB_TensileRequirements_Tests | test ConfirmTensileRequirementVersion throws error when EffectiveDate is NULL | 57 | Success |
| 82 | LAB_TensileRequirements_Tests | test CorrectHeatGrades updates GradeId when swv-mes has different grade | 77 | Success |
| 83 | LAB_TensileRequirements_Tests | test Disposition fails if any retest sample fails | 53 | Success |
| 84 | LAB_TensileRequirements_Tests | test Disposition ignores a grade missing from the version in force | 73 | Success |
| 85 | LAB_TensileRequirements_Tests | test Disposition returns P when all samples pass | 57 | Success |
| 86 | LAB_TensileRequirements_Tests | test Disposition returns U when any sample fails | 49 | Success |
| 87 | LAB_TensileRequirements_Tests | test Disposition returns U when one of multiple samples fails | 98 | Success |
| 88 | LAB_TensileRequirements_Tests | test Disposition uses corrected grade after grade correction | 93 | Success |
| 89 | LAB_TensileRequirements_Tests | test Disposition uses latest run only - retest supersedes | 53 | Success |
| 90 | LAB_TensileRequirements_Tests | test Disposition uses version effective at reception time | 69 | Success |
| 91 | LAB_TensileRequirements_Tests | test UpsertTensileRequirements creates a draft that confirm numbers | 85 | Success |
| 92 | LAB_TensileRequirements_Tests | test UpsertTensileRequirements throws error when Rows is invalid JSON | 29 | Success |
| 93 | LAB_TensileRequirements_Tests | test UpsertTensileRequirements throws error when the version is confirmed | 40 | Success |
| 94 | LAB_TensileRequirements_Tests | test YieldPassed returns 0 when value above max | 77 | Success |
| 95 | LAB_TensileRequirements_Tests | test YieldPassed returns 0 when value below min | 48 | Success |
| 96 | LAB_TensileRequirements_Tests | test YieldPassed returns 1 when value in range | 49 | Success |
| 97 | M2_CarrierInstancesPasses_Tests | test DeleteCarrierInstancePass deletes non-last record | 118 | Success |
| 98 | M2_CarrierInstancesPasses_Tests | test DeleteCarrierInstancePass fails for last record | 69 | Success |
| 99 | M2_CarrierInstancesPasses_Tests | test DeleteCarrierInstancePass fails when already deleted | 73 | Success |
| 100 | M2_CarrierInstancesPasses_Tests | test DeleteCarrierInstancePass fails with non-existent id | 77 | Success |
| 101 | M2_CarrierInstancesPasses_Tests | test DeleteCarrierInstancePass fails without id | 40 | Success |
| 102 | M2_CarrierInstancesPasses_Tests | test DeleteCarrierInstancePass removes PassCampaign | 77 | Success |
| 103 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes adjusts first record StartedAt | 89 | Success |
| 104 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes adjusts only f<...>tedAt to InstalledAt and last EndedAt to UninstalledAt when window changes | 102 | Success |
| 105 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes adjusts only first StartedAt to InstalledAt when window shifts keeping same duration | 81 | Success |
| 106 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes chains EndedAt for multiple records | 73 | Success |
| 107 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes does not scale single pass | 69 | Success |
| 108 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes does not scale when window unchanged | 73 | Success |
| 109 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes fails with non-existent CarrierInstance | 41 | Success |
| 110 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes fails without CarrierInstanceId | 61 | Success |
| 111 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes fails without EdgerRollPartId | 44 | Success |
| 112 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes recalculates only the specified EdgerRoll leaving other rolls unchanged | 73 | Success |
| 113 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes returns 0 when no records | 65 | Success |
| 114 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes scales passes proportionally when window expands | 106 | Success |
| 115 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes sets EndedAt to UninstalledAt for single record | 90 | Success |
| 116 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes sets NULL EndedAt when not uninstalled | 65 | Success |
| 117 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass creates first record with InstalledAt | 158 | Success |
| 118 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass creates with explicit StartedAt | 105 | Success |
| 119 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass fails changing to same active pass | 101 | Success |
| 120 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass fails when EdgerRoll not in Rollset | 49 | Success |
| 121 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass fails with non-existent CarrierInstance | 48 | Success |
| 122 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass fails with non-existent pass | 73 | Success |
| 123 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass fails with StartedAt after UninstalledAt | 60 | Success |
| 124 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass fails with StartedAt before InstalledAt | 53 | Success |
| 125 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass fails without CarrierInstanceId | 64 | Success |
| 126 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass fails without EdgerRollPartId | 49 | Success |
| 127 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass replaces record with same StartedAt | 106 | Success |
| 128 | M2_CarrierProtection_Tests | test DeleteArbor deactivates UniversalRoll Part | 73 | Success |
| 129 | M2_CarrierProtection_Tests | test DeleteArbor fails when carrier status is U | 179 | Success |
| 130 | M2_CarrierProtection_Tests | test DeleteArbor in rollset deactivates UR and rollset | 105 | Success |
| 131 | M2_CarrierProtection_Tests | test DeleteArbor succeeds when arbor not in any universal roll | 98 | Success |
| 132 | M2_CarrierProtection_Tests | test DeleteArbor succeeds when carrier status is X | 114 | Success |
| 133 | M2_CarrierProtection_Tests | test DeleteArbor succeeds when rollset has no carrier | 130 | Success |
| 134 | M2_CarrierProtection_Tests | test DeleteArbor succeeds when universal roll not in rollset | 109 | Success |
| 135 | M2_CarrierProtection_Tests | test DeleteDonut fails when carrier status is C | 93 | Success |
| 136 | M2_CarrierProtection_Tests | test DeleteDonut fails when carrier status is S | 109 | Success |
| 137 | M2_CarrierProtection_Tests | test DeleteDonut in rollset updates UR and deactivates rollset | 98 | Success |
| 138 | M2_CarrierProtection_Tests | test DeleteDonut keeps UniversalRoll active | 94 | Success |
| 139 | M2_CarrierProtection_Tests | test DeleteDonut multiple donuts succeeds when none in active carrier | 81 | Success |
| 140 | M2_CarrierProtection_Tests | test DeleteDonut sets UniversalRoll DonutPartId to NULL | 69 | Success |
| 141 | M2_CarrierProtection_Tests | test DeleteDonut succeeds when carrier status is F | 81 | Success |
| 142 | M2_CarrierProtection_Tests | test DeleteDonut succeeds when donut not in any universal roll | 94 | Success |
| 143 | M2_CarrierProtection_Tests | test DeleteDonut succeeds when rollset has no carrier | 98 | Success |
| 144 | M2_CarrierProtection_Tests | test DeleteDonut succeeds when universal roll not in rollset | 101 | Success |
| 145 | M2_CarrierProtection_Tests | test DeleteRoll deactivates rollset when carrier status is E | 73 | Success |
| 146 | M2_CarrierProtection_Tests | test DeleteRoll deactivates rollset when no carrier instance | 97 | Success |
| 147 | M2_CarrierProtection_Tests | test DeleteRoll edger deactivates rollset when carrier status is F | 98 | Success |
| 148 | M2_CarrierProtection_Tests | test DeleteRoll edger deactivates rollset when no carrier | 98 | Success |
| 149 | M2_CarrierProtection_Tests | test DeleteRoll edger fails when carrier status is A | 85 | Success |
| 150 | M2_CarrierProtection_Tests | test DeleteRoll edger fails when carrier status is I | 109 | Success |
| 151 | M2_CarrierProtection_Tests | test DeleteRoll edger succeeds when not in any rollset | 69 | Success |
| 152 | M2_CarrierProtection_Tests | test DeleteRoll error message contains carrier name | 114 | Success |
| 153 | M2_CarrierProtection_Tests | test DeleteRoll error message contains CarrierInstanceId | 97 | Success |
| 154 | M2_CarrierProtection_Tests | test DeleteRoll error message contains roll name | 98 | Success |
| 155 | M2_CarrierProtection_Tests | test DeleteRoll fails when carrier status is A | 61 | Success |
| 156 | M2_CarrierProtection_Tests | test DeleteRoll fails when carrier status is I | 82 | Success |
| 157 | M2_CarrierProtection_Tests | test DeleteRoll multiple rolls fails if any in active carrier | 77 | Success |
| 158 | M2_CarrierProtection_Tests | test DeleteRoll roll stays active when blocked | 89 | Success |
| 159 | M2_CarrierProtection_Tests | test DeleteRoll succeeds when roll not in any rollset | 69 | Success |
| 160 | M2_CarrierProtection_Tests | test UpsertRollset change rolls fails when in active carrier | 174 | Success |
| 161 | M2_CarrierProtection_Tests | test UpsertRollset deactivate fails when in active carrier | 69 | Success |
| 162 | M2_CarrierProtection_Tests | test UpsertRollset implicit deactivation fails when other in active carrier | 81 | Success |
| 163 | M2_CarrierProtection_Tests | test UpsertRollset implicit deactivation succeeds when no carrier | 203 | Success |
| 164 | M2_CarrierProtection_Tests | test UpsertRollset use roll from active carrier fails | 89 | Success |
| 165 | M2_CarrierProtection_Tests | test UpsertUniversalRoll change arbor fails when in active carrier | 138 | Success |
| 166 | M2_CarrierProtection_Tests | test UpsertUniversalRoll change arbor succeeds when carrier status E | 187 | Success |
| 167 | M2_CarrierProtection_Tests | test UpsertUniversalRoll change arbor succeeds when no rollset | 167 | Success |
| 168 | M2_CarrierProtection_Tests | test UpsertUniversalRoll change donut fails when in active carrier | 65 | Success |
| 169 | M2_CarrierProtection_Tests | test UpsertUniversalRoll change donut in rollset deactivates rollset | 191 | Success |
| 170 | M2_CarrierProtection_Tests | test UpsertUniversalRoll change donut succeeds when carrier status F | 174 | Success |
| 171 | M2_CarrierProtection_Tests | test UpsertUniversalRoll change donut succeeds when no rollset | 191 | Success |
| 172 | M2_CarrierProtection_Tests | test UpsertUniversalRoll remove arbor fails when in active carrier | 73 | Success |
| 173 | M2_CarrierProtection_Tests | test UpsertUniversalRoll remove arbor succeeds when no rollset | 186 | Success |
| 174 | M2_CarrierProtection_Tests | test UpsertUniversalRoll remove donut fails when in active carrier | 247 | Success |
| 175 | M2_CarrierProtection_Tests | test UpsertUniversalRoll remove donut succeeds when no rollset | 178 | Success |
| 176 | M2_DeleteEvent_Tests | test Delete: matched delete leaves no Production overlap | 24 | Success |
| 177 | M2_DeleteEvent_Tests | test Delete: matched Production event keeps its End | 21 | Success |
| 178 | M2_DeleteEvent_Tests | test Delete: unmatched Production event is recomputed | 28 | Success |
| 179 | M2_DeleteEvent_Tests | test Draft: matched Production event keeps its End | 41 | Success |
| 180 | M2_DetectRollsetDisruption_Tests | test Broken rollset alert includes roll names | 85 | Success |
| 181 | M2_DetectRollsetDisruption_Tests | test Broken rollset alert uses past tense | 69 | Success |
| 182 | M2_DetectRollsetDisruption_Tests | test Default diameter tolerance is zero | 61 | Success |
| 183 | M2_DetectRollsetDisruption_Tests | test Diameter mismatch alert created when exceeds tolerance | 97 | Success |
| 184 | M2_DetectRollsetDisruption_Tests | test Diameter mismatch alert has no mm unit | 98 | Success |
| 185 | M2_DetectRollsetDisruption_Tests | test Diameter tolerance from catSettings | 69 | Success |
| 186 | M2_DetectRollsetDisruption_Tests | test Disruption created when affected rollsets exist | 85 | Success |
| 187 | M2_DetectRollsetDisruption_Tests | test Handles missing diameter data gracefully | 53 | Success |
| 188 | M2_DetectRollsetDisruption_Tests | test Multiple affected rollsets create multiple alerts | 90 | Success |
| 189 | M2_DetectRollsetDisruption_Tests | test Multiple alert types created in single disruption | 114 | Success |
| 190 | M2_DetectRollsetDisruption_Tests | test No diameter alert when within tolerance | 106 | Success |
| 191 | M2_DetectRollsetDisruption_Tests | test No disruption created when no conflicts exist | 94 | Success |
| 192 | M2_DetectRollsetDisruption_Tests | test No orphans stored for Swap action | 85 | Success |
| 193 | M2_DetectRollsetDisruption_Tests | test No position swap alert for Any position roll | 57 | Success |
| 194 | M2_DetectRollsetDisruption_Tests | test No position swap alert when position matches | 52 | Success |
| 195 | M2_DetectRollsetDisruption_Tests | test Orphaned rolls identified when breaking rollset | 126 | Success |
| 196 | M2_DetectRollsetDisruption_Tests | test Orphans linked to correct RollsetBrokenAlert | 69 | Success |
| 197 | M2_DetectRollsetDisruption_Tests | test Orphans stored for Create action | 77 | Success |
| 198 | M2_DetectRollsetDisruption_Tests | test Orphans stored for Mix action | 73 | Success |
| 199 | M2_DetectRollsetDisruption_Tests | test Position swap alert created for Bottom to Top | 78 | Success |
| 200 | M2_DetectRollsetDisruption_Tests | test Position swap alert created for Top to Bottom | 110 | Success |
| 201 | M2_DetectRollsetDisruption_Tests | test Position swap alert uses past tense | 102 | Success |
| 202 | M2_DetectRollsetDisruption_Tests | test PrevRollsetId adds rollset to affected list | 138 | Success |
| 203 | M2_DetectRollsetDisruption_Tests | test PrevRollsetId creates orphans from previous rollset | 86 | Success |
| 204 | M2_DetectRollsetDisruption_Tests | test RollsetBrokenAlerts populated for affected rollsets | 89 | Success |
| 205 | M2_DetectRollsetDisruption_Tests | test RollshopAlert always created even without alerts | 53 | Success |
| 206 | M2_DetectRollsetDisruption_Tests | test RollshopAlert default StatusCode is P | 69 | Success |
| 207 | M2_DetectRollsetDisruption_Tests | test RollshopAlert has CreatedBy populated | 65 | Success |
| 208 | M2_DisruptionTracking_Tests | test AcknowledgeNotification: Error when already acknowledged | 114 | Success |
| 209 | M2_DisruptionTracking_Tests | test AcknowledgeNotification: Status changes from P to A | 65 | Success |
| 210 | M2_DisruptionTracking_Tests | test Detection: Diameter mismatch alert created when difference exceeds tolerance | 183 | Success |
| 211 | M2_DisruptionTracking_Tests | test Detection: Multiple affected rollsets identified | 158 | Success |
| 212 | M2_DisruptionTracking_Tests | test Detection: Multiple orphaned rolls identified | 162 | Success |
| 213 | M2_DisruptionTracking_Tests | test Detection: No diameter alert when within tolerance | 143 | Success |
| 214 | M2_DisruptionTracking_Tests | test Detection: Position swap alert created for Bottom to Top | 166 | Success |
| 215 | M2_DisruptionTracking_Tests | test Detection: Position swap alert created for Top to Bottom | 166 | Success |
| 216 | M2_DisruptionTracking_Tests | test Detection: Single affected rollset identified | 187 | Success |
| 217 | M2_DisruptionTracking_Tests | test Detection: Single orphaned roll identified | 187 | Success |
| 218 | M2_DisruptionTracking_Tests | test ErrorHandling: Rollset created even if detection fails | 130 | Success |
| 219 | M2_DisruptionTracking_Tests | test Integration: Multiple alert types in one disruption | 171 | Success |
| 220 | M2_DisruptionTracking_Tests | test UpsertRollset: ActionTypeCode C recorded correctly | 163 | Success |
| 221 | M2_DisruptionTracking_Tests | test UpsertRollset: ActionTypeCode M recorded correctly | 134 | Success |
| 222 | M2_DisruptionTracking_Tests | test UpsertRollset: ActionTypeCode S recorded correctly | 134 | Success |
| 223 | M2_DisruptionTracking_Tests | test UpsertRollset: Default ActionTypeCode is C | 163 | Success |
| 224 | M2_DraftEvents_Tests | test ConfirmEvents: Deletes Main events not in active Draft | 69 | Success |
| 225 | M2_DraftEvents_Tests | test ConfirmEvents: Error when ConfirmUntilEventId not found | 29 | Success |
| 226 | M2_DraftEvents_Tests | test ConfirmEvents: Inserts new Draft events to Main | 69 | Success |
| 227 | M2_DraftEvents_Tests | test ConfirmEvents: Partial confirmation with ConfirmUntilEventId | 81 | Success |
| 228 | M2_DraftEvents_Tests | test ConfirmEvents: Publishes Draft to Main | 53 | Success |
| 229 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Both: Deletes from both tables | 36 | Success |
| 230 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Both: Error when not found in Draft | 28 | Success |
| 231 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Both: Error when not found in Main | 24 | Success |
| 232 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Both: IsMatched in Draft prevents deletion | 28 | Success |
| 233 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Both: IsMatched in Main prevents deletion | 36 | Success |
| 234 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Default: Defaults to Main | 236 | Success |
| 235 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Draft: Dilated event handling in Draft | 45 | Success |
| 236 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Draft: Error when not found in Draft | 21 | Success |
| 237 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Draft: IsMatched prevents deletion | 28 | Success |
| 238 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Draft: Only deletes from Draft table | 40 | Success |
| 239 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Invalid: Throws error for invalid mode | 53 | Success |
| 240 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Main: Dilated event handling | 61 | Success |
| 241 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Main: Error when not found in Main | 36 | Success |
| 242 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Main: IsMatched prevents deletion | 52 | Success |
| 243 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Main: Only deletes from Main table | 53 | Success |
| 244 | M2_DraftEvents_Tests | test DeleteEvent: Both mode syncs delete to Draft | 77 | Success |
| 245 | M2_DraftEvents_Tests | test DeleteEvent: Draft mode does not affect Main | 33 | Success |
| 246 | M2_DraftEvents_Tests | test DeleteEvent: Error when EventId not found in Draft | 21 | Success |
| 247 | M2_DraftEvents_Tests | test DeleteEvent: Error when EventId not found in Main | 29 | Success |
| 248 | M2_DraftEvents_Tests | test DeleteEvent: Error when IsMatched = 1 in Draft mode | 28 | Success |
| 249 | M2_DraftEvents_Tests | test DeleteEvent: Error when IsMatched = 1 | 29 | Success |
| 250 | M2_DraftEvents_Tests | test Edge: ConfirmEvents when already in sync | 77 | Success |
| 251 | M2_DraftEvents_Tests | test Edge: Multiple Production events sync correctly | 89 | Success |
| 252 | M2_DraftEvents_Tests | test Edge: ResetDraft with empty Main clears Draft | 49 | Success |
| 253 | M2_DraftEvents_Tests | test Isolation: Draft and Main can differ | 53 | Success |
| 254 | M2_DraftEvents_Tests | test Isolation: Draft changes do not affect Main | 73 | Success |
| 255 | M2_DraftEvents_Tests | test MergeToDraft: All production fields sync correctly | 77 | Success |
| 256 | M2_DraftEvents_Tests | test MergeToDraft: DELETE soft-deletes in Draft | 41 | Success |
| 257 | M2_DraftEvents_Tests | test MergeToDraft: Error when EventId not found | 21 | Success |
| 258 | M2_DraftEvents_Tests | test MergeToDraft: Fixed event copies Start/End exactly | 49 | Success |
| 259 | M2_DraftEvents_Tests | test MergeToDraft: New Fixed event creates in Draft with cascade | 65 | Success |
| 260 | M2_DraftEvents_Tests | test MergeToDraft: Reactivates inactive Draft event on Main update | 162 | Success |
| 261 | M2_DraftEvents_Tests | test ResetDraft: Deletes Draft-only events | 49 | Success |
| 262 | M2_DraftEvents_Tests | test ResetDraft: Inserts Main-only events to Draft | 65 | Success |
| 263 | M2_DraftEvents_Tests | test ResetDraft: Restores Draft from Main | 77 | Success |
| 264 | M2_DraftEvents_Tests | test Sync Scenario: Different ScheduledRollingHours in Main and Draft | 110 | Success |
| 265 | M2_DraftEvents_Tests | test Sync Scenario: Different Start times preserved until confirmed | 65 | Success |
| 266 | M2_DraftEvents_Tests | test Sync Scenario: Different StatusCode in Main and Draft | 90 | Success |
| 267 | M2_DraftEvents_Tests | test Sync Scenario: Event active in Main but inactive in Draft | 102 | Success |
| 268 | M2_DraftEvents_Tests | test Sync Scenario: Event exists only in Draft | 82 | Success |
| 269 | M2_DraftEvents_Tests | test Sync Scenario: Event exists only in Main | 154 | Success |
| 270 | M2_DraftEvents_Tests | test Sync Scenario: IsMatched in Main but not in Draft | 49 | Success |
| 271 | M2_DraftEvents_Tests | test Sync Scenario: MergeToDraft preserves Draft Start | 126 | Success |
| 272 | M2_DraftEvents_Tests | test SyncCampaigns: Creates event in both Main and Draft | 126 | Success |
| 273 | M2_DraftEvents_Tests | test SyncDelete: Delete Both then resync recreates both | 118 | Success |
| 274 | M2_DraftEvents_Tests | test SyncDelete: Delete Draft preserves Main state | 228 | Success |
| 275 | M2_DraftEvents_Tests | test SyncDelete: Delete Draft then resync restores Draft via MergeToDraft | 158 | Success |
| 276 | M2_DraftEvents_Tests | test SyncDelete: Delete Main preserves Draft state independently | 118 | Success |
| 277 | M2_DraftEvents_Tests | test SyncDelete: Delete Main then resync recreates Main | 134 | Success |
| 278 | M2_DraftEvents_Tests | test SyncDelete: IsMatched prevents delete in all modes | 101 | Success |
| 279 | M2_DraftEvents_Tests | test UpsertDraftEvent: Create Downtime in Draft | 32 | Success |
| 280 | M2_DraftEvents_Tests | test UpsertDraftEvent: Create Holiday only in Draft | 49 | Success |
| 281 | M2_DraftEvents_Tests | test UpsertDraftEvent: Create Maintenance in Draft | 41 | Success |
| 282 | M2_DraftEvents_Tests | test UpsertDraftEvent: Error when Start is NULL | 57 | Success |
| 283 | M2_DraftEvents_Tests | test UpsertDraftProductionEvent: Error when SectionId missing | 21 | Success |
| 284 | M2_DraftEvents_Tests | test UpsertDraftProductionEvent: IsMatched allows non-date changes | 40 | Success |
| 285 | M2_DraftEvents_Tests | test UpsertDraftProductionEvent: IsMatched prevents date changes | 32 | Success |
| 286 | M2_DraftEvents_Tests | test UpsertDraftProductionEvent: New event only in Draft not Main | 101 | Success |
| 287 | M2_DraftEvents_Tests | test UpsertDraftProductionEvent: Update only affects Draft not Main | 114 | Success |
| 288 | M2_DraftEvents_Tests | test UpsertProductionEvent: Anchor logic positions Draft event correctly | 126 | Success |
| 289 | M2_DraftEvents_Tests | test UpsertProductionEvent: IsMatched syncs to Draft | 93 | Success |
| 290 | M2_DraftEvents_Tests | test UpsertProductionEvent: New event creates in both Main and Draft | 97 | Success |
| 291 | M2_DraftEvents_Tests | test UpsertProductionEvent: No anchor uses Main Start for Draft | 114 | Success |
| 292 | M2_DraftEvents_Tests | test UpsertProductionEvent: ScheduledRollingHours change recalculates Draft End | 118 | Success |
| 293 | M2_DraftEvents_Tests | test UpsertProductionEvent: Update syncs fields to Draft but not Start | 105 | Success |
| 294 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass adds first pass with defaults | 21 | Success |
| 295 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass adds pass as not diagonal by default | 20 | Success |
| 296 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass adds sequential passes up to 4 | 25 | Success |
| 297 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass clears the diagonal on all the passes | 28 | Success |
| 298 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass fails with inactive PartId | 37 | Success |
| 299 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass fails with invalid PassNumber | 20 | Success |
| 300 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass fails with invalid PassStatusCode | 33 | Success |
| 301 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass fails with non-EdgerRoll Part | 16 | Success |
| 302 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass fails with non-existent PartId | 12 | Success |
| 303 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass keeps IsDiagonal when not provided | 24 | Success |
| 304 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass marks all the passes as diagonal | 20 | Success |
| 305 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass returns PassNumber on update | 24 | Success |
| 306 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass updates IsDiagonal on a single pass | 25 | Success |
| 307 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass updates status to Damaged | 20 | Success |
| 308 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass updates status to Used | 45 | Success |
| 309 | M2_EventErrorHandling_Tests | test Cascade: Max cascade iterations throws descriptive error | 25 | Success |
| 310 | M2_EventErrorHandling_Tests | test Cascade: Max Fixed resolution iterations throws descriptive error | 32 | Success |
| 311 | M2_EventErrorHandling_Tests | test Compaction: Max iterations throws descriptive error | 28 | Success |
| 312 | M2_EventErrorHandling_Tests | test Defaults: PreProcessEvent uses fallback limit | 20 | Success |
| 313 | M2_EventErrorHandling_Tests | test ErrorMessage: Clean extraction removes technical context | 8 | Success |
| 314 | M2_EventErrorHandling_Tests | test PreProcess: Error message contains context information | 40 | Success |
| 315 | M2_EventErrorHandling_Tests | test PreProcess: Max iterations reached throws descriptive error | 45 | Success |
| 316 | M2_EventErrorHandling_Tests | test Transaction: UpsertEvent rollback on PreProcess error | 82 | Success |
| 317 | M2_EventErrorHandling_Tests | test Transaction: UpsertProductionEvent rollback on validation error | 45 | Success |
| 318 | M2_EventIntegration_Tests | test Cascade: Long chain with intercalated Fixed | 179 | Success |
| 319 | M2_EventIntegration_Tests | test Cascade: Stress test 10 consecutive events | 179 | Success |
| 320 | M2_EventIntegration_Tests | test Compact: Blocked by Fixed event | 158 | Success |
| 321 | M2_EventIntegration_Tests | test Compact: Complete gap closure | 163 | Success |
| 322 | M2_EventIntegration_Tests | test Compact: Preserves dilation downstream | 159 | Success |
| 323 | M2_EventIntegration_Tests | test Complex: BaseDuration preserved through complete cycle | 167 | Success |
| 324 | M2_EventIntegration_Tests | test Complex: Complete production schedule with Fixed events | 142 | Success |
| 325 | M2_EventIntegration_Tests | test Complex: Update triggers cascade and compaction | 183 | Success |
| 326 | M2_EventIntegration_Tests | test Create: Production with minimal fields | 118 | Success |
| 327 | M2_EventIntegration_Tests | test EdgeCase: Production spans midnight | 98 | Success |
| 328 | M2_EventIntegration_Tests | test EdgeCase: Very long BaseDuration 24h | 93 | Success |
| 329 | M2_EventIntegration_Tests | test EdgeCase: Very short BaseDuration 5min | 150 | Success |
| 330 | M2_EventIntegration_Tests | test Insert: Fixed between Productions cascades | 191 | Success |
| 331 | M2_EventIntegration_Tests | test PreProcess: Multiple consecutive Fixed events MOVE | 118 | Success |
| 332 | M2_EventIntegration_Tests | test PreProcess: Overlapping Fixed events smart dilation | 162 | Success |
| 333 | M2_EventIntegration_Tests | test PreProcess: Production vs Production MOVE | 146 | Success |
| 334 | M2_EventIntegration_Tests | test STEP4: Shrinking Fixed readjusts dilated Production | 142 | Success |
| 335 | M2_EventIntegration_Tests | test Update: Change Production SectionId | 163 | Success |
| 336 | M2_EventIntegration_Tests | test Update: Moving Fixed triggers cascade | 142 | Success |
| 337 | M2_EventIntegration_Tests | test Update: Multiple modifications preserve BaseDuration | 142 | Success |
| 338 | M2_EventIntegration_Tests | test Update: Multiple Production fields batch | 118 | Success |
| 339 | M2_EventIntegration_Tests | test Update: Start moves into collision zone | 151 | Success |
| 340 | M2_EventIntegration_Tests | test UpsertEvent: Create compatible Downtime and Maintenance | 86 | Success |
| 341 | M2_EventIntegration_Tests | test UpsertEvent: Update Fixed event adjusts affected Production | 138 | Success |
| 342 | M2_EventIntegration_Tests | test UpsertProductionEvent: Auto-moves after Holiday | 142 | Success |
| 343 | M2_EventIntegration_Tests | test UpsertProductionEvent: Create with all fields populated | 138 | Success |
| 344 | M2_EventIntegration_Tests | test UpsertProductionEvent: Dilates around Downtime | 162 | Success |
| 345 | M2_EventIntegration_Tests | test UpsertProductionEvent: Update preserves BaseDuration | 152 | Success |
| 346 | M2_EventIntegration_Tests | test Validation: Downtime vs Downtime overlap is allowed | 53 | Success |
| 347 | M2_EventIntegration_Tests | test Validation: Downtime vs Holiday overlap is allowed | 61 | Success |
| 348 | M2_EventIntegration_Tests | test Validation: End before Start throws error | 33 | Success |
| 349 | M2_EventIntegration_Tests | test Validation: Holiday vs Holiday overlap is allowed | 53 | Success |
| 350 | M2_EventIntegration_Tests | test Validation: Invalid EventTypeCode error | 37 | Success |
| 351 | M2_EventIntegration_Tests | test Validation: Invalid SectionId throws error | 29 | Success |
| 352 | M2_EventIntegration_Tests | test Workflow: StatusCode P to I to C progression | 121 | Success |
| 353 | M2_GetCampaignsByEventId_Tests | test RECONCILE #2258: apportioned detail sums to month and campaign totals | 61 | Success |
| 354 | M2_GetCampaignsByEventId_Tests | test RECONCILE #2258: cobbles excluded from length shares but totals reconcile | 57 | Success |
| 355 | M2_GetCampaignsByEventId_Tests | test Rejected weight is not subtracted from finished tons or yield | 118 | Success |
| 356 | M2_GetProductionMonth_Tests | test ASSET ISOLATION: Mill #1 shifts are ignored by M2 | 8 | Success |
| 357 | M2_GetProductionMonth_Tests | test FALLBACK: scalar falls back to calendar month when no shift | 4 | Success |
| 358 | M2_GetProductionMonth_Tests | test HALF-OPEN: boundary instant belongs to the next shift | 8 | Success |
| 359 | M2_GetProductionMonth_Tests | test ITVF: returns no row when no shift covers the instant | 9 | Success |
| 360 | M2_GetProductionMonth_Tests | test SHIFT-ALIGNED: Feb-calendar instant in a Jan-ProductionDate shift returns January | 8 | Success |
| 361 | M2_GetProductionMonth_Tests | test SHIFT-ALIGNED: Jan-calendar instant in a Feb-ProductionDate shift returns February | 8 | Success |
| 362 | M2_NonProductiveOverlap_Tests | test Dilation: Production dilates by the union of D M H | 12 | Success |
| 363 | M2_NonProductiveOverlap_Tests | test Merge: chained events collapse into one island | 12 | Success |
| 364 | M2_NonProductiveOverlap_Tests | test Merge: contained event adds no extra time | 12 | Success |
| 365 | M2_NonProductiveOverlap_Tests | test Merge: disjoint events are summed | 13 | Success |
| 366 | M2_NonProductiveOverlap_Tests | test Merge: inactive events are ignored | 12 | Success |
| 367 | M2_NonProductiveOverlap_Tests | test Merge: intervals are clipped to the window | 12 | Success |
| 368 | M2_NonProductiveOverlap_Tests | test Merge: partial overlap counts the union once | 12 | Success |
| 369 | M2_NonProductiveOverlap_Tests | test Merge: Production events are excluded | 12 | Success |
| 370 | M2_NonProductiveOverlap_Tests | test Merge: two overlapping Holidays count once | 37 | Success |
| 371 | M2_NonProductiveOverlap_Tests | test ScheduledEnd: stretches by the union of D M H | 12 | Success |
| 372 | M2_PassCampaigns_Tests | test GetPassCampaignData fails with invalid time range | 73 | Success |
| 373 | M2_PassCampaigns_Tests | test GetPassCampaignData fails without EdgerRollPartId | 85 | Success |
| 374 | M2_PassCampaigns_Tests | test GetPassCampaignData filters by PassNumber | 61 | Success |
| 375 | M2_PassCampaigns_Tests | test GetPassCampaignData returns calculated totals | 56 | Success |
| 376 | M2_PassCampaigns_Tests | test GetPassCampaignData returns data for EdgerRoll | 53 | Success |
| 377 | M2_PassCampaigns_Tests | test UpdatePassCampaignOffsets fails with deleted pass | 49 | Success |
| 378 | M2_PassCampaigns_Tests | test UpdatePassCampaignOffsets fails with non-existent id | 40 | Success |
| 379 | M2_PassCampaigns_Tests | test UpdatePassCampaignOffsets fails without any offset | 60 | Success |
| 380 | M2_PassCampaigns_Tests | test UpdatePassCampaignOffsets fails without id | 41 | Success |
| 381 | M2_PassCampaigns_Tests | test UpdatePassCampaignOffsets returns correct id | 65 | Success |
| 382 | M2_PassCampaigns_Tests | test UpdatePassCampaignOffsets updates multiple offsets | 74 | Success |
| 383 | M2_PassCampaigns_Tests | test UpdatePassCampaignOffsets updates OffsetBillets | 73 | Success |
| 384 | M2_PassCampaigns_Tests | test UpdatePassCampaignOffsets updates OffsetLength | 114 | Success |
| 385 | M2_PassCampaigns_Tests | test UpdatePassCampaignOffsets updates OffsetWeight | 69 | Success |
| 386 | M2_ResolveEventCollisions_Tests | test Cascade: Five event cascade chain | 32 | Success |
| 387 | M2_ResolveEventCollisions_Tests | test Cascade: Last event collides with Fixed | 25 | Success |
| 388 | M2_ResolveEventCollisions_Tests | test Cascade: Middle event already dilated | 29 | Success |
| 389 | M2_ResolveEventCollisions_Tests | test Cascade: Moving Production pushes subsequent Production events | 37 | Success |
| 390 | M2_ResolveEventCollisions_Tests | test Cascade: Production cascade blocked by Fixed wall | 24 | Success |
| 391 | M2_ResolveEventCollisions_Tests | test Cascade: Production pushes another Production around Fixed event | 37 | Success |
| 392 | M2_ResolveEventCollisions_Tests | test Cascade: Productions with large gaps between them | 28 | Success |
| 393 | M2_ResolveEventCollisions_Tests | test Complex: Production DILATE then CASCADE another dilated Production | 41 | Success |
| 394 | M2_ResolveEventCollisions_Tests | test Complex: Production DILATE through overlapping Downtime and Maintenance | 21 | Success |
| 395 | M2_ResolveEventCollisions_Tests | test Edge: Event with minimum duration one minute | 12 | Success |
| 396 | M2_ResolveEventCollisions_Tests | test Edge: Event with very long duration spans days | 8 | Success |
| 397 | M2_ResolveEventCollisions_Tests | test Edge: Multiple events same start different durations | 12 | Success |
| 398 | M2_ResolveEventCollisions_Tests | test Edge: Production ending exactly at Fixed start has no collision | 12 | Success |
| 399 | M2_ResolveEventCollisions_Tests | test Edge: Production one second after Fixed has no collision | 12 | Success |
| 400 | M2_ResolveEventCollisions_Tests | test Edge: Production one second before Fixed has no collision | 13 | Success |
| 401 | M2_ResolveEventCollisions_Tests | test Edge: Production with no collisions remains unchanged | 12 | Success |
| 402 | M2_ResolveEventCollisions_Tests | test Fixed: every D M H overlap combination is allowed | 12 | Success |
| 403 | M2_ResolveEventCollisions_Tests | test O1: Multiple Other events can overlap | 8 | Success |
| 404 | M2_ResolveEventCollisions_Tests | test O1: Other does not collide with Holiday | 8 | Success |
| 405 | M2_ResolveEventCollisions_Tests | test O1: Other does not collide with Production | 8 | Success |
| 406 | M2_ResolveEventCollisions_Tests | test O1: Production not affected by Other event | 16 | Success |
| 407 | M2_ResolveEventCollisions_Tests | test P1: Multiple Productions overlapping simultaneously | 16 | Success |
| 408 | M2_ResolveEventCollisions_Tests | test P1: Production completely contained moves after | 13 | Success |
| 409 | M2_ResolveEventCollisions_Tests | test P1: Production containing existing moves after | 36 | Success |
| 410 | M2_ResolveEventCollisions_Tests | test P1: Production moves after existing Production when S < NS | 32 | Success |
| 411 | M2_ResolveEventCollisions_Tests | test P1: Production with same start time moves after existing | 12 | Success |
| 412 | M2_ResolveEventCollisions_Tests | test P2: Production completely inside Fixed MOVES after | 21 | Success |
| 413 | M2_ResolveEventCollisions_Tests | test P2: Production DILATE around Fixed when NS < S | 29 | Success |
| 414 | M2_ResolveEventCollisions_Tests | test P2: Production DILATE through contiguous Fixed events | 33 | Success |
| 415 | M2_ResolveEventCollisions_Tests | test P2: Production DILATE through Fixed events with variable gaps | 12 | Success |
| 416 | M2_ResolveEventCollisions_Tests | test P2: Production DILATE through four consecutive Fixed events | 12 | Success |
| 417 | M2_ResolveEventCollisions_Tests | test P2: Production DILATE through mixed Fixed event types | 12 | Success |
| 418 | M2_ResolveEventCollisions_Tests | test P2: Production DILATE through multiple Holidays | 12 | Success |
| 419 | M2_ResolveEventCollisions_Tests | test P2: Production DILATE through overlapping Fixed events without double counting | 12 | Success |
| 420 | M2_ResolveEventCollisions_Tests | test P2: Production DILATE through three Fixed events with gaps | 12 | Success |
| 421 | M2_ResolveEventCollisions_Tests | test P2: Production DILATE with Fixed ending at exact original P_End | 33 | Success |
| 422 | M2_ResolveEventCollisions_Tests | test P2: Production MOVE after Fixed when S <= NS | 48 | Success |
| 423 | M2_ResolveEventCollisions_Tests | test P2: Production MOVE then DILATE in sequence | 36 | Success |
| 424 | M2_ResolveEventCollisions_Tests | test P2: Production starting at Fixed end has no collision | 12 | Success |
| 425 | M2_ResolveEventCollisions_Tests | test P2: Production with Fixed starting at exact P_Start MOVES | 29 | Success |
| 426 | M2_ResolveEventCollisions_Tests | test P2: Short Production DILATE through long Fixed event | 12 | Success |
| 427 | M2_ResolveEventCollisions_Tests | test Stress: High density Fixed events 12 in 2 hours | 13 | Success |
| 428 | M2_ResolveEventCollisions_Tests | test Stress: Multi-day Production through multiple Fixed events | 53 | Success |
| 429 | M2_ResolveEventCollisions_Tests | test Update: Event excludes itself from collision detection | 40 | Success |
| 430 | M2_ResolveEventCollisions_Tests | test Update: Event in middle of dilated chain | 12 | Success |
| 431 | M2_ResolveEventCollisions_Tests | test Update: Fixed event moved away from collision | 8 | Success |
| 432 | M2_ResolveEventCollisions_Tests | test Update: Production BaseDuration increased significantly | 13 | Success |
| 433 | M2_ResolveEventCollisions_Tests | test Update: Production BaseDuration reduced significantly | 12 | Success |
| 434 | M2_ScheduleCompaction_Tests | test Basic: 2-event compaction moves P2 backward | 20 | Success |
| 435 | M2_ScheduleCompaction_Tests | test Basic: 3-event compaction cascades through all events | 37 | Success |
| 436 | M2_ScheduleCompaction_Tests | test Basic: Partial gap elimination completes gracefully | 24 | Success |
| 437 | M2_ScheduleCompaction_Tests | test Edge: Final event encounters Fixed during compaction | 25 | Success |
| 438 | M2_ScheduleCompaction_Tests | test Edge: Gap fully eliminated creates contiguous events | 24 | Success |
| 439 | M2_ScheduleCompaction_Tests | test Edge: No compaction when event not shortened | 17 | Success |
| 440 | M2_ScheduleCompaction_Tests | test Edge: No subsequent events completes immediately | 29 | Success |
| 441 | M2_ScheduleCompaction_Tests | test Fixed: Compaction DILATE around Fixed event | 41 | Success |
| 442 | M2_ScheduleCompaction_Tests | test Fixed: Compaction MOVE after Fixed event | 25 | Success |
| 443 | M2_ScheduleCompaction_Tests | test Fixed: Compaction MOVE then DILATE sequence | 20 | Success |
| 444 | M2_ScheduleCompaction_Tests | test Fixed: Compaction stops when Fixed blocks entire remaining gap | 93 | Success |
| 445 | M2_ScheduleCompaction_Tests | test Fixed: Compaction through mixed Fixed event types | 52 | Success |
| 446 | M2_ScheduleCompaction_Tests | test Fixed: Compaction through multiple consecutive Fixed events | 24 | Success |
| 447 | M2_ScheduleCompaction_Tests | test Fixed: Compaction through overlapping Fixed events without double counting | 25 | Success |
| 448 | M2_ScheduleCompaction_Tests | test Fixed: Fixed event at exact gap boundary causes MOVE | 20 | Success |
| 449 | M2_ScheduleCompaction_Tests | test Gap: Middle event shortening compacts subsequent events | 32 | Success |
| 450 | M2_ScheduleCompaction_Tests | test Gap: Variable gaps between events compact correctly | 33 | Success |
| 451 | M2_ScheduleCompaction_Tests | test Gap: Very large gap 5 hours compacts correctly | 33 | Success |
| 452 | M2_ScheduleCompaction_Tests | test Gap: Very small gap 3 minutes compacts correctly | 40 | Success |
| 453 | M2_ScheduleCompaction_Tests | test Integration: CompactSchedule disabled skips compaction | 41 | Success |
| 454 | M2_ScheduleCompaction_Tests | test Integration: UpsertEvent skips compaction with blocking events | 57 | Success |
| 455 | M2_ScheduleCompaction_Tests | test Integration: UpsertEvent triggers compaction on shortening | 44 | Success |
| 456 | M2_SwapRollsetsRolls_Tests | test Error: BottomRollId1 is required | 49 | Success |
| 457 | M2_SwapRollsetsRolls_Tests | test Error: BottomRollId2 does not exist in Rolls table | 33 | Success |
| 458 | M2_SwapRollsetsRolls_Tests | test Error: BottomRollId2 required when RollsetId2 provided | 29 | Success |
| 459 | M2_SwapRollsetsRolls_Tests | test Error: Cannot swap rollsets in different sections | 52 | Success |
| 460 | M2_SwapRollsetsRolls_Tests | test Error: Cannot swap rollsets in different stands | 44 | Success |
| 461 | M2_SwapRollsetsRolls_Tests | test Error: Rollset1 must have both rolls assigned | 36 | Success |
| 462 | M2_SwapRollsetsRolls_Tests | test Error: RollsetId1 and RollsetId2 must be different | 53 | Success |
| 463 | M2_SwapRollsetsRolls_Tests | test Error: RollsetId1 does not exist | 57 | Success |
| 464 | M2_SwapRollsetsRolls_Tests | test Error: RollsetId1 is required | 28 | Success |
| 465 | M2_SwapRollsetsRolls_Tests | test Error: RollsetId2 does not exist | 45 | Success |
| 466 | M2_SwapRollsetsRolls_Tests | test Error: TopRollId1 does not exist in Rolls table | 32 | Success |
| 467 | M2_SwapRollsetsRolls_Tests | test Error: TopRollId1 is required | 33 | Success |
| 468 | M2_SwapRollsetsRolls_Tests | test Error: TopRollId2 required when RollsetId2 provided | 49 | Success |
| 469 | M2_SwapRollsetsRolls_Tests | test Success: Create new rollset with specified rolls | 207 | Success |
| 470 | M2_SwapRollsetsRolls_Tests | test Success: Swap rolls between two rollsets | 158 | Success |
| 471 | M2_SwapRollsetsRolls_Tests | test Success: Use any valid rolls | 109 | Success |
| 472 | M2_SyncCampaignsToProductionEvents_Tests | test CASCADE: Chain stops at matched barrier | 155 | Success |
| 473 | M2_SyncCampaignsToProductionEvents_Tests | test CASCADE: Matched events are immovable barriers | 93 | Success |
| 474 | M2_SyncCampaignsToProductionEvents_Tests | test CASCADE: Updating IsMatched prevents future cascade | 122 | Success |
| 475 | M2_SyncCampaignsToProductionEvents_Tests | test COMPLEX: Multiple section changes create multiple events | 97 | Success |
| 476 | M2_SyncCampaignsToProductionEvents_Tests | test COMPLEX: ResolveEventCascade called for each group | 93 | Success |
| 477 | M2_SyncCampaignsToProductionEvents_Tests | test COMPLEX: StatusCode K preserved when updating | 85 | Success |
| 478 | M2_SyncCampaignsToProductionEvents_Tests | test EDGE CASE: Date filters work correctly | 114 | Success |
| 479 | M2_SyncCampaignsToProductionEvents_Tests | test EDGE CASE: Empty campaigns table produces no events | 114 | Success |
| 480 | M2_SyncCampaignsToProductionEvents_Tests | test EDGE CASE: No campaigns returns gracefully | 48 | Success |
| 481 | M2_SyncCampaignsToProductionEvents_Tests | test FIXED: Dilates unmatched but not matched | 49 | Success |
| 482 | M2_SyncCampaignsToProductionEvents_Tests | test FIXED: Does not dilate matched events | 53 | Success |
| 483 | M2_SyncCampaignsToProductionEvents_Tests | test GROUPING: Consecutive campaigns same section create single event | 93 | Success |
| 484 | M2_SyncCampaignsToProductionEvents_Tests | test GROUPING: Section change creates separate events | 113 | Success |
| 485 | M2_SyncCampaignsToProductionEvents_Tests | test GROUPING: Single campaign creates single event | 122 | Success |
| 486 | M2_SyncCampaignsToProductionEvents_Tests | test ISMATCHED: Last group updates status P to I when matched | 93 | Success |
| 487 | M2_SyncCampaignsToProductionEvents_Tests | test ISMATCHED: Matched event updated with IsMatched = 1 | 85 | Success |
| 488 | M2_SyncCampaignsToProductionEvents_Tests | test ISMATCHED: New event created with IsMatched = 1 | 90 | Success |
| 489 | M2_SyncCampaignsToProductionEvents_Tests | test ISMATCHED: Prevents duplicate events on resync | 155 | Success |
| 490 | M2_SyncCampaignsToProductionEvents_Tests | test ISMATCHED: Unmatched future event matched in next run | 85 | Success |
| 491 | M2_SyncCampaignsToProductionEvents_Tests | test LINKING: All campaigns in group linked to same event | 77 | Success |
| 492 | M2_SyncCampaignsToProductionEvents_Tests | test LINKING: EventId preserved for already-linked campaigns | 90 | Success |
| 493 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: Closest match selected when multiple exist | 85 | Success |
| 494 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: Event expands with campaigns | 90 | Success |
| 495 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: Event times adjust to campaigns | 74 | Success |
| 496 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: Exact temporal overlap matches event | 81 | Success |
| 497 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: Fallback respects section | 93 | Success |
| 498 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: Fallback to next unmatched same section | 70 | Success |
| 499 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: Inactive events not matched | 114 | Success |
| 500 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: New event created when no match found | 130 | Success |
| 501 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: Proximity window 48h enforced | 134 | Success |
| 502 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: Proximity window matches close event | 114 | Success |
| 503 | M2_SyncCampaignsToProductionEvents_Tests | test SMART START: First sync detects production run start | 105 | Success |
| 504 | M2_SyncCampaignsToProductionEvents_Tests | test SMART START: Mixed matched and unmatched timeline | 105 | Success |
| 505 | M2_SyncCampaignsToProductionEvents_Tests | test SMART START: Second sync continues from last matched event | 98 | Success |
| 506 | M2_SyncCampaignsToProductionEvents_Tests | test SPLIT #2258: cross-month event gets one PEA row per production month | 97 | Success |
| 507 | M2_SyncCampaignsToProductionEvents_Tests | test SPLIT #2258: resync does not duplicate PEA EventMonth rows | 89 | Success |
| 508 | M2_SyncCampaignsToProductionEvents_Tests | test TIMESTAMPS: Continuity maintained between groups | 89 | Success |
| 509 | M2_SyncCampaignsToProductionEvents_Tests | test TIMESTAMPS: FirstBilletTimestamp is first campaign start | 106 | Success |
| 510 | M2_SyncCampaignsToProductionEvents_Tests | test TIMESTAMPS: TrackedEnd is last campaign end | 93 | Success |
| 511 | M2_TrackPassCampaignsJob_Tests | test TrackPassCampaignsJob calculates cumulative start values | 102 | Success |
| 512 | M2_TrackPassCampaignsJob_Tests | test TrackPassCampaignsJob calculates metrics from billets | 65 | Success |
| 513 | M2_TrackPassCampaignsJob_Tests | test TrackPassCampaignsJob creates new campaign | 82 | Success |
| 514 | M2_TrackPassCampaignsJob_Tests | test TrackPassCampaignsJob only counts billets in time range | 73 | Success |
| 515 | M2_TrackPassCampaignsJob_Tests | test TrackPassCampaignsJob preserves offset values | 98 | Success |
| 516 | M2_TrackPassCampaignsJob_Tests | test TrackPassCampaignsJob skips deleted carriers | 126 | Success |
| 517 | M2_TrackPassCampaignsJob_Tests | test TrackPassCampaignsJob skips inactive passes | 61 | Success |
| 518 | M2_TrackPassCampaignsJob_Tests | test TrackPassCampaignsJob updates existing campaign | 105 | Success |
Raw Output Tail
|443|[M2_ScheduleCompaction_Tests].[test Fixed: Compaction MOVE then DILATE sequence] | 20|Success| |444|[M2_ScheduleCompaction_Tests].[test Fixed: Compaction stops when Fixed blocks entire remaining gap] | 93|Success| |445|[M2_ScheduleCompaction_Tests].[test Fixed: Compaction through mixed Fixed event types] | 52|Success| |446|[M2_ScheduleCompaction_Tests].[test Fixed: Compaction through multiple consecutive Fixed events] | 24|Success| |447|[M2_ScheduleCompaction_Tests].[test Fixed: Compaction through overlapping Fixed events without double counting] | 25|Success| |448|[M2_ScheduleCompaction_Tests].[test Fixed: Fixed event at exact gap boundary causes MOVE] | 20|Success| |449|[M2_ScheduleCompaction_Tests].[test Gap: Middle event shortening compacts subsequent events] | 32|Success| |450|[M2_ScheduleCompaction_Tests].[test Gap: Variable gaps between events compact correctly] | 33|Success| |451|[M2_ScheduleCompaction_Tests].[test Gap: Very large gap 5 hours compacts correctly] | 33|Success| |452|[M2_ScheduleCompaction_Tests].[test Gap: Very small gap 3 minutes compacts correctly] | 40|Success| |453|[M2_ScheduleCompaction_Tests].[test Integration: CompactSchedule disabled skips compaction] | 41|Success| |454|[M2_ScheduleCompaction_Tests].[test Integration: UpsertEvent skips compaction with blocking events] | 57|Success| |455|[M2_ScheduleCompaction_Tests].[test Integration: UpsertEvent triggers compaction on shortening] | 44|Success| |456|[M2_SwapRollsetsRolls_Tests].[test Error: BottomRollId1 is required] | 49|Success| |457|[M2_SwapRollsetsRolls_Tests].[test Error: BottomRollId2 does not exist in Rolls table] | 33|Success| |458|[M2_SwapRollsetsRolls_Tests].[test Error: BottomRollId2 required when RollsetId2 provided] | 29|Success| |459|[M2_SwapRollsetsRolls_Tests].[test Error: Cannot swap rollsets in different sections] | 52|Success| |460|[M2_SwapRollsetsRolls_Tests].[test Error: Cannot swap rollsets in different stands] | 44|Success| |461|[M2_SwapRollsetsRolls_Tests].[test Error: Rollset1 must have both rolls assigned] | 36|Success| |462|[M2_SwapRollsetsRolls_Tests].[test Error: RollsetId1 and RollsetId2 must be different] | 53|Success| |463|[M2_SwapRollsetsRolls_Tests].[test Error: RollsetId1 does not exist] | 57|Success| |464|[M2_SwapRollsetsRolls_Tests].[test Error: RollsetId1 is required] | 28|Success| |465|[M2_SwapRollsetsRolls_Tests].[test Error: RollsetId2 does not exist] | 45|Success| |466|[M2_SwapRollsetsRolls_Tests].[test Error: TopRollId1 does not exist in Rolls table] | 32|Success| |467|[M2_SwapRollsetsRolls_Tests].[test Error: TopRollId1 is required] | 33|Success| |468|[M2_SwapRollsetsRolls_Tests].[test Error: TopRollId2 required when RollsetId2 provided] | 49|Success| |469|[M2_SwapRollsetsRolls_Tests].[test Success: Create new rollset with specified rolls] | 207|Success| |470|[M2_SwapRollsetsRolls_Tests].[test Success: Swap rolls between two rollsets] | 158|Success| |471|[M2_SwapRollsetsRolls_Tests].[test Success: Use any valid rolls] | 109|Success| |472|[M2_SyncCampaignsToProductionEvents_Tests].[test CASCADE: Chain stops at matched barrier] | 155|Success| |473|[M2_SyncCampaignsToProductionEvents_Tests].[test CASCADE: Matched events are immovable barriers] | 93|Success| |474|[M2_SyncCampaignsToProductionEvents_Tests].[test CASCADE: Updating IsMatched prevents future cascade] | 122|Success| |475|[M2_SyncCampaignsToProductionEvents_Tests].[test COMPLEX: Multiple section changes create multiple events] | 97|Success| |476|[M2_SyncCampaignsToProductionEvents_Tests].[test COMPLEX: ResolveEventCascade called for each group] | 93|Success| |477|[M2_SyncCampaignsToProductionEvents_Tests].[test COMPLEX: StatusCode K preserved when updating] | 85|Success| |478|[M2_SyncCampaignsToProductionEvents_Tests].[test EDGE CASE: Date filters work correctly] | 114|Success| |479|[M2_SyncCampaignsToProductionEvents_Tests].[test EDGE CASE: Empty campaigns table produces no events] | 114|Success| |480|[M2_SyncCampaignsToProductionEvents_Tests].[test EDGE CASE: No campaigns returns gracefully] | 48|Success| |481|[M2_SyncCampaignsToProductionEvents_Tests].[test FIXED: Dilates unmatched but not matched] | 49|Success| |482|[M2_SyncCampaignsToProductionEvents_Tests].[test FIXED: Does not dilate matched events] | 53|Success| |483|[M2_SyncCampaignsToProductionEvents_Tests].[test GROUPING: Consecutive campaigns same section create single event] | 93|Success| |484|[M2_SyncCampaignsToProductionEvents_Tests].[test GROUPING: Section change creates separate events] | 113|Success| |485|[M2_SyncCampaignsToProductionEvents_Tests].[test GROUPING: Single campaign creates single event] | 122|Success| |486|[M2_SyncCampaignsToProductionEvents_Tests].[test ISMATCHED: Last group updates status P to I when matched] | 93|Success| |487|[M2_SyncCampaignsToProductionEvents_Tests].[test ISMATCHED: Matched event updated with IsMatched = 1] | 85|Success| |488|[M2_SyncCampaignsToProductionEvents_Tests].[test ISMATCHED: New event created with IsMatched = 1] | 90|Success| |489|[M2_SyncCampaignsToProductionEvents_Tests].[test ISMATCHED: Prevents duplicate events on resync] | 155|Success| |490|[M2_SyncCampaignsToProductionEvents_Tests].[test ISMATCHED: Unmatched future event matched in next run] | 85|Success| |491|[M2_SyncCampaignsToProductionEvents_Tests].[test LINKING: All campaigns in group linked to same event] | 77|Success| |492|[M2_SyncCampaignsToProductionEvents_Tests].[test LINKING: EventId preserved for already-linked campaigns] | 90|Success| |493|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: Closest match selected when multiple exist] | 85|Success| |494|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: Event expands with campaigns] | 90|Success| |495|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: Event times adjust to campaigns] | 74|Success| |496|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: Exact temporal overlap matches event] | 81|Success| |497|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: Fallback respects section] | 93|Success| |498|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: Fallback to next unmatched same section] | 70|Success| |499|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: Inactive events not matched] | 114|Success| |500|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: New event created when no match found] | 130|Success| |501|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: Proximity window 48h enforced] | 134|Success| |502|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: Proximity window matches close event] | 114|Success| |503|[M2_SyncCampaignsToProductionEvents_Tests].[test SMART START: First sync detects production run start] | 105|Success| |504|[M2_SyncCampaignsToProductionEvents_Tests].[test SMART START: Mixed matched and unmatched timeline] | 105|Success| |505|[M2_SyncCampaignsToProductionEvents_Tests].[test SMART START: Second sync continues from last matched event] | 98|Success| |506|[M2_SyncCampaignsToProductionEvents_Tests].[test SPLIT #2258: cross-month event gets one PEA row per production month] | 97|Success| |507|[M2_SyncCampaignsToProductionEvents_Tests].[test SPLIT #2258: resync does not duplicate PEA EventMonth rows] | 89|Success| |508|[M2_SyncCampaignsToProductionEvents_Tests].[test TIMESTAMPS: Continuity maintained between groups] | 89|Success| |509|[M2_SyncCampaignsToProductionEvents_Tests].[test TIMESTAMPS: FirstBilletTimestamp is first campaign start] | 106|Success| |510|[M2_SyncCampaignsToProductionEvents_Tests].[test TIMESTAMPS: TrackedEnd is last campaign end] | 93|Success| |511|[M2_TrackPassCampaignsJob_Tests].[test TrackPassCampaignsJob calculates cumulative start values] | 102|Success| |512|[M2_TrackPassCampaignsJob_Tests].[test TrackPassCampaignsJob calculates metrics from billets] | 65|Success| |513|[M2_TrackPassCampaignsJob_Tests].[test TrackPassCampaignsJob creates new campaign] | 82|Success| |514|[M2_TrackPassCampaignsJob_Tests].[test TrackPassCampaignsJob only counts billets in time range] | 73|Success| |515|[M2_TrackPassCampaignsJob_Tests].[test TrackPassCampaignsJob preserves offset values] | 98|Success| |516|[M2_TrackPassCampaignsJob_Tests].[test TrackPassCampaignsJob skips deleted carriers] | 126|Success| |517|[M2_TrackPassCampaignsJob_Tests].[test TrackPassCampaignsJob skips inactive passes] | 61|Success| |518|[M2_TrackPassCampaignsJob_Tests].[test TrackPassCampaignsJob updates existing campaign] | 105|Success| -------------------------------------------------------------------------------------------- Test Case Summary: 518 test case(s) executed, 518 succeeded, 0 skipped, 0 failed, 0 errored. --------------------------------------------------------------------------------------------