@@ -435,5 +435,51 @@ public void Should_Handle_Provider_Initialization_Failures_Concurrently()
435
435
issues . ShouldContain ( x => x . MessageText == "Success1" ) ;
436
436
issues . ShouldContain ( x => x . MessageText == "Success2" ) ;
437
437
}
438
+
439
+ [ Fact ]
440
+ public void Should_Demonstrate_Parallel_Processing_Benefits_With_Simulated_Delays ( )
441
+ {
442
+ // Given - Create providers that simulate processing delays
443
+ const int providerCount = 5 ;
444
+ const int delayPerProviderMs = 50 ; // Simulate 50ms delay per provider
445
+ var fixture = new IssuesFixture ( ) ;
446
+ fixture . IssueProviders . Clear ( ) ;
447
+
448
+ for ( var i = 0 ; i < providerCount ; i ++ )
449
+ {
450
+ var issue = IssueBuilder
451
+ . NewIssue ( $ "SlowIssue{ i } ", $ "SlowProviderType{ i } ", $ "SlowProviderName{ i } ")
452
+ . InFile ( $@ "src\SlowFile{ i } .cs", i + 1 )
453
+ . OfRule ( $ "SlowRule{ i } ")
454
+ . WithPriority ( IssuePriority . Warning )
455
+ . Create ( ) ;
456
+ fixture . IssueProviders . Add ( new FakeSlowIssueProvider ( fixture . Log , [ issue ] , delayPerProviderMs ) ) ;
457
+ }
458
+
459
+ // When
460
+ var stopwatch = System . Diagnostics . Stopwatch . StartNew ( ) ;
461
+ var issues = fixture . ReadIssues ( ) . ToList ( ) ;
462
+ stopwatch . Stop ( ) ;
463
+
464
+ // Then
465
+ issues . Count . ShouldBe ( providerCount ) ;
466
+
467
+ // With parallel processing, total time should be significantly less than
468
+ // sum of all delays (providerCount * delayPerProviderMs)
469
+ var expectedSequentialTime = providerCount * delayPerProviderMs ;
470
+ var actualTime = stopwatch . ElapsedMilliseconds ;
471
+
472
+ // Allow for some overhead but expect significant improvement
473
+ var maxExpectedParallelTime = expectedSequentialTime * 0.4 ; // Should be much faster than 40% of sequential time
474
+
475
+ System . Console . WriteLine ( $ "Sequential time would be ~{ expectedSequentialTime } ms, parallel time was { actualTime } ms") ;
476
+
477
+ // This assertion may be flaky in CI environments, so we'll use a generous threshold
478
+ actualTime . ShouldBeLessThan ( expectedSequentialTime ) ;
479
+
480
+ // Verify all issues have correct properties set
481
+ // The Run property should be set to the same value from settings (even if null)
482
+ issues . ShouldAllBe ( x => x . Run == fixture . Settings . Run ) ;
483
+ }
438
484
}
439
485
}
0 commit comments