@@ -352,145 +352,6 @@ public async Task PersistStateAsync_InvokesAllCallbacksEvenIfACallbackIsRemovedA
352352 Assert . Equal ( 4 , executionSequence . Count ) ;
353353 }
354354
355- [ Fact ]
356- public async Task RestoreStateAsync_WithoutScenario_InvokesAllCallbacks ( )
357- {
358- // Arrange
359- var state = new Dictionary < string , byte [ ] > ( ) ;
360- var store = new TestStore ( state ) ;
361- var persistenceManager = new ComponentStatePersistenceManager (
362- NullLogger < ComponentStatePersistenceManager > . Instance ,
363- CreateServiceProvider ( ) ) ;
364-
365- var callbacksInvoked = new List < string > ( ) ;
366-
367- // Register callbacks with different filters
368- persistenceManager . State . RegisterOnRestoring ( null , ( ) => callbacksInvoked . Add ( "no-filter" ) ) ;
369- persistenceManager . State . RegisterOnRestoring ( new RestoreStateOnPrerenderingAttribute ( ) ,
370- ( ) => callbacksInvoked . Add ( "prerender-filter" ) ) ;
371-
372- // Act
373- await persistenceManager . RestoreStateAsync ( store ) ;
374-
375- // Assert - both callbacks should be invoked when no scenario is specified
376- Assert . Equal ( 2 , callbacksInvoked . Count ) ;
377- Assert . Contains ( "no-filter" , callbacksInvoked ) ;
378- Assert . Contains ( "prerender-filter" , callbacksInvoked ) ;
379- }
380-
381- [ Fact ]
382- public async Task RestoreStateAsync_WithPrerenderingScenario_FiltersCallbacks ( )
383- {
384- // Arrange
385- var state = new Dictionary < string , byte [ ] > ( ) ;
386- var store = new TestStore ( state ) ;
387- var persistenceManager = new ComponentStatePersistenceManager (
388- NullLogger < ComponentStatePersistenceManager > . Instance ,
389- CreateServiceProvider ( ) ) ;
390-
391- var callbacksInvoked = new List < string > ( ) ;
392- var prerenderingScenario = WebPersistenceScenario . Prerendering ;
393-
394- // Restore happens before, the callbacks that get executed later execute right away and don't get
395- // added to the subscription list indefinitely unless recurring.
396- await persistenceManager . RestoreStateAsync ( store , prerenderingScenario ) ;
397-
398- // Act
399- persistenceManager . State . RegisterOnRestoring ( null , ( ) => callbacksInvoked . Add ( "no-filter" ) ) ;
400- persistenceManager . State . RegisterOnRestoring ( new RestoreStateOnPrerenderingAttribute ( enable : true ) ,
401- ( ) => callbacksInvoked . Add ( "prerender-enabled" ) ) ;
402- persistenceManager . State . RegisterOnRestoring ( new RestoreStateOnPrerenderingAttribute ( enable : false ) ,
403- ( ) => callbacksInvoked . Add ( "prerender-disabled" ) ) ;
404-
405- // Assert - no-filter and prerender-enabled should be invoked, prerender-disabled should not
406- Assert . Equal ( 2 , callbacksInvoked . Count ) ;
407- Assert . Contains ( "no-filter" , callbacksInvoked ) ;
408- Assert . Contains ( "prerender-enabled" , callbacksInvoked ) ;
409- Assert . DoesNotContain ( "prerender-disabled" , callbacksInvoked ) ;
410- }
411-
412- [ Fact ]
413- public async Task RestoreStateAsync_WithNonPrerenderingScenario_FiltersCallbacks ( )
414- {
415- // Arrange
416- var state = new Dictionary < string , byte [ ] > ( ) ;
417- var store = new TestStore ( state ) ;
418- var persistenceManager = new ComponentStatePersistenceManager (
419- NullLogger < ComponentStatePersistenceManager > . Instance ,
420- CreateServiceProvider ( ) ) ;
421-
422- var callbacksInvoked = new List < string > ( ) ;
423- var nonPrerenderingScenario = new TestScenario ( isRecurring : false ) ;
424-
425- // Register callbacks with different filters
426- persistenceManager . State . RegisterOnRestoring ( null , ( ) => callbacksInvoked . Add ( "no-filter" ) ) ;
427- persistenceManager . State . RegisterOnRestoring ( new RestoreStateOnPrerenderingAttribute ( ) ,
428- ( ) => callbacksInvoked . Add ( "prerender-filter" ) ) ;
429-
430- // Act
431- await persistenceManager . RestoreStateAsync ( store , nonPrerenderingScenario ) ;
432-
433- // Assert - both callbacks should be invoked because TestScenario doesn't support prerendering filter
434- // but it's not recurring, so the fallback logic applies
435- Assert . Equal ( 2 , callbacksInvoked . Count ) ;
436- Assert . Contains ( "no-filter" , callbacksInvoked ) ;
437- Assert . Contains ( "prerender-filter" , callbacksInvoked ) ;
438- }
439-
440- [ Fact ]
441- public async Task RestoreStateAsync_WithRecurringScenario_SkipsFilteredCallbacks ( )
442- {
443- // Arrange
444- var state = new Dictionary < string , byte [ ] > ( ) ;
445- var store = new TestStore ( state ) ;
446- var persistenceManager = new ComponentStatePersistenceManager (
447- NullLogger < ComponentStatePersistenceManager > . Instance ,
448- CreateServiceProvider ( ) ) ;
449-
450- var callbacksInvoked = new List < string > ( ) ;
451- var recurringScenario = new TestScenario ( isRecurring : true ) ;
452-
453- await persistenceManager . RestoreStateAsync ( store , recurringScenario ) ;
454-
455- // Act
456- persistenceManager . State . RegisterOnRestoring ( null , ( ) => callbacksInvoked . Add ( "no-filter" ) ) ;
457- persistenceManager . State . RegisterOnRestoring ( new RestoreStateOnPrerenderingAttribute ( ) ,
458- ( ) => callbacksInvoked . Add ( "prerender-filter" ) ) ;
459-
460- // Assert - only no-filter callback should be invoked (filtered callbacks skipped for recurring)
461- Assert . Single ( callbacksInvoked ) ;
462- Assert . Contains ( "no-filter" , callbacksInvoked ) ;
463- }
464-
465- [ Fact ]
466- public async Task RestoreStateAsync_CallbackDisposal_RemovesFromInvocation ( )
467- {
468- // Arrange
469- var state = new Dictionary < string , byte [ ] > ( ) ;
470- var store = new TestStore ( state ) ;
471- var persistenceManager = new ComponentStatePersistenceManager (
472- NullLogger < ComponentStatePersistenceManager > . Instance ,
473- CreateServiceProvider ( ) ) ;
474-
475- var filter = new TestScenarioFilter ( ) ;
476-
477- await persistenceManager . RestoreStateAsync ( store , new TestScenario ( isRecurring : true ) ) ;
478-
479- var callbacksInvoked = new List < string > ( ) ;
480-
481- // Register callbacks and keep subscription to dispose
482- var subscription1 = persistenceManager . State . RegisterOnRestoring ( filter , ( ) => callbacksInvoked . Add ( "callback1" ) ) ;
483- var subscription2 = persistenceManager . State . RegisterOnRestoring ( filter , ( ) => callbacksInvoked . Add ( "callback2" ) ) ;
484-
485- // Act - dispose one subscription before restore
486- subscription1 . Dispose ( ) ;
487- await persistenceManager . RestoreStateAsync ( store ) ;
488-
489- // Assert - only non-disposed callback should be invoked
490- Assert . Single ( callbacksInvoked ) ;
491- Assert . Contains ( "callback2" , callbacksInvoked ) ;
492- }
493-
494355 private class TestRenderer : Renderer
495356 {
496357 public TestRenderer ( ) : base ( new ServiceCollection ( ) . BuildServiceProvider ( ) , NullLoggerFactory . Instance )
@@ -570,23 +431,6 @@ private class PersistentService : IPersistentServiceRegistration
570431
571432 public IComponentRenderMode GetRenderModeOrDefault ( ) => null ;
572433 }
573-
574- private class TestScenario ( bool isRecurring ) : IPersistentComponentStateScenario
575- {
576- public bool IsRecurring { get ; } = isRecurring ;
577- }
578-
579- private class TestScenarioFilter : IPersistentStateFilter
580- {
581- public bool SupportsScenario ( IPersistentComponentStateScenario scenario )
582- {
583- return scenario is TestScenario ;
584- }
585- public bool ShouldRestore ( IPersistentComponentStateScenario scenario )
586- {
587- return scenario is TestScenario testScenario && ! testScenario . IsRecurring ;
588- }
589- }
590434}
591435
592436static file class ComponentStatePersistenceManagerExtensions
0 commit comments