@@ -292,58 +292,58 @@ public async ValueTask<IReadOnlyList<Func<TestContext, CancellationToken, Task>>
292292 }
293293
294294 private async Task < IReadOnlyList < Func < TestContext , CancellationToken , Task > > > BuildBeforeTestHooksAsync ( Type type )
295+ {
296+ var hooksByType = new List < ( Type type , List < ( int order , int registrationIndex , Func < TestContext , CancellationToken , Task > hook ) > hooks ) > ( ) ;
297+
298+ // Collect hooks for each type in the hierarchy
299+ var currentType = type ;
300+ while ( currentType != null )
295301 {
296- var hooksByType = new List < ( Type type , List < ( int order , int registrationIndex , Func < TestContext , CancellationToken , Task > hook ) > hooks ) > ( ) ;
302+ var typeHooks = new List < ( int order , int registrationIndex , Func < TestContext , CancellationToken , Task > hook ) > ( ) ;
297303
298- // Collect hooks for each type in the hierarchy
299- var currentType = type ;
300- while ( currentType != null )
304+ if ( Sources . BeforeTestHooks . TryGetValue ( currentType , out var sourceHooks ) )
301305 {
302- var typeHooks = new List < ( int order , int registrationIndex , Func < TestContext , CancellationToken , Task > hook ) > ( ) ;
303-
304- if ( Sources . BeforeTestHooks . TryGetValue ( currentType , out var sourceHooks ) )
306+ foreach ( var hook in sourceHooks )
305307 {
306- foreach ( var hook in sourceHooks )
307- {
308- var hookFunc = await CreateInstanceHookDelegateAsync ( hook ) ;
309- typeHooks . Add ( ( hook . Order , hook . RegistrationIndex , hookFunc ) ) ;
310- }
308+ var hookFunc = await CreateInstanceHookDelegateAsync ( hook ) ;
309+ typeHooks . Add ( ( hook . Order , hook . RegistrationIndex , hookFunc ) ) ;
311310 }
311+ }
312312
313- // Also check the open generic type definition for generic types
314- if ( currentType is { IsGenericType : true , IsGenericTypeDefinition : false } )
313+ // Also check the open generic type definition for generic types
314+ if ( currentType is { IsGenericType : true , IsGenericTypeDefinition : false } )
315+ {
316+ var openGenericType = GetCachedGenericTypeDefinition ( currentType ) ;
317+ if ( Sources . BeforeTestHooks . TryGetValue ( openGenericType , out var openTypeHooks ) )
315318 {
316- var openGenericType = GetCachedGenericTypeDefinition ( currentType ) ;
317- if ( Sources . BeforeTestHooks . TryGetValue ( openGenericType , out var openTypeHooks ) )
319+ foreach ( var hook in openTypeHooks )
318320 {
319- foreach ( var hook in openTypeHooks )
320- {
321- var hookFunc = await CreateInstanceHookDelegateAsync ( hook ) ;
322- typeHooks . Add ( ( hook . Order , hook . RegistrationIndex , hookFunc ) ) ;
323- }
321+ var hookFunc = await CreateInstanceHookDelegateAsync ( hook ) ;
322+ typeHooks . Add ( ( hook . Order , hook . RegistrationIndex , hookFunc ) ) ;
324323 }
325324 }
326-
327- if ( typeHooks . Count > 0 )
328- {
329- hooksByType . Add ( ( currentType , typeHooks ) ) ;
330- }
331-
332- currentType = currentType . BaseType ;
333325 }
334326
335- // For Before hooks: base class hooks run first
336- // Reverse the list since we collected from derived to base
337- hooksByType . Reverse ( ) ;
338-
339- var finalHooks = new List < Func < TestContext , CancellationToken , Task > > ( ) ;
340- foreach ( var ( _, typeHooks ) in hooksByType )
327+ if ( typeHooks . Count > 0 )
341328 {
342- // Within each type level, sort by Order then by RegistrationIndex
343- SortAndAddHooks ( finalHooks , typeHooks ) ;
329+ hooksByType . Add ( ( currentType , typeHooks ) ) ;
344330 }
345331
346- return finalHooks ;
332+ currentType = currentType . BaseType ;
333+ }
334+
335+ // For Before hooks: base class hooks run first
336+ // Reverse the list since we collected from derived to base
337+ hooksByType . Reverse ( ) ;
338+
339+ var finalHooks = new List < Func < TestContext , CancellationToken , Task > > ( ) ;
340+ foreach ( var ( _, typeHooks ) in hooksByType )
341+ {
342+ // Within each type level, sort by Order then by RegistrationIndex
343+ SortAndAddHooks ( finalHooks , typeHooks ) ;
344+ }
345+
346+ return finalHooks ;
347347 }
348348
349349 public async ValueTask < IReadOnlyList < Func < TestContext , CancellationToken , Task > > > CollectAfterTestHooksAsync ( Type testClassType )
@@ -359,57 +359,57 @@ public async ValueTask<IReadOnlyList<Func<TestContext, CancellationToken, Task>>
359359 }
360360
361361 private async Task < IReadOnlyList < Func < TestContext , CancellationToken , Task > > > BuildAfterTestHooksAsync ( Type type )
362+ {
363+ var hooksByType = new List < ( Type type , List < ( int order , int registrationIndex , Func < TestContext , CancellationToken , Task > hook ) > hooks ) > ( ) ;
364+
365+ // Collect hooks for each type in the hierarchy
366+ var currentType = type ;
367+ while ( currentType != null )
362368 {
363- var hooksByType = new List < ( Type type , List < ( int order , int registrationIndex , Func < TestContext , CancellationToken , Task > hook ) > hooks ) > ( ) ;
369+ var typeHooks = new List < ( int order , int registrationIndex , Func < TestContext , CancellationToken , Task > hook ) > ( ) ;
364370
365- // Collect hooks for each type in the hierarchy
366- var currentType = type ;
367- while ( currentType != null )
371+ if ( Sources . AfterTestHooks . TryGetValue ( currentType , out var sourceHooks ) )
368372 {
369- var typeHooks = new List < ( int order , int registrationIndex , Func < TestContext , CancellationToken , Task > hook ) > ( ) ;
370-
371- if ( Sources . AfterTestHooks . TryGetValue ( currentType , out var sourceHooks ) )
373+ foreach ( var hook in sourceHooks )
372374 {
373- foreach ( var hook in sourceHooks )
374- {
375- var hookFunc = await CreateInstanceHookDelegateAsync ( hook ) ;
376- typeHooks . Add ( ( hook . Order , hook . RegistrationIndex , hookFunc ) ) ;
377- }
375+ var hookFunc = await CreateInstanceHookDelegateAsync ( hook ) ;
376+ typeHooks . Add ( ( hook . Order , hook . RegistrationIndex , hookFunc ) ) ;
378377 }
378+ }
379379
380- // Also check the open generic type definition for generic types
381- if ( currentType is { IsGenericType : true , IsGenericTypeDefinition : false } )
380+ // Also check the open generic type definition for generic types
381+ if ( currentType is { IsGenericType : true , IsGenericTypeDefinition : false } )
382+ {
383+ var openGenericType = GetCachedGenericTypeDefinition ( currentType ) ;
384+ if ( Sources . AfterTestHooks . TryGetValue ( openGenericType , out var openTypeHooks ) )
382385 {
383- var openGenericType = GetCachedGenericTypeDefinition ( currentType ) ;
384- if ( Sources . AfterTestHooks . TryGetValue ( openGenericType , out var openTypeHooks ) )
386+ foreach ( var hook in openTypeHooks )
385387 {
386- foreach ( var hook in openTypeHooks )
387- {
388- var hookFunc = await CreateInstanceHookDelegateAsync ( hook ) ;
389- typeHooks . Add ( ( hook . Order , hook . RegistrationIndex , hookFunc ) ) ;
390- }
388+ var hookFunc = await CreateInstanceHookDelegateAsync ( hook ) ;
389+ typeHooks . Add ( ( hook . Order , hook . RegistrationIndex , hookFunc ) ) ;
391390 }
392391 }
393-
394- if ( typeHooks . Count > 0 )
395- {
396- hooksByType . Add ( ( currentType , typeHooks ) ) ;
397- }
398-
399- currentType = currentType . BaseType ;
400392 }
401393
402- // For After hooks: derived class hooks run first
403- // No need to reverse since we collected from derived to base
404-
405- var finalHooks = new List < Func < TestContext , CancellationToken , Task > > ( ) ;
406- foreach ( var ( _, typeHooks ) in hooksByType )
394+ if ( typeHooks . Count > 0 )
407395 {
408- // Within each type level, sort by Order then by RegistrationIndex
409- SortAndAddHooks ( finalHooks , typeHooks ) ;
396+ hooksByType . Add ( ( currentType , typeHooks ) ) ;
410397 }
411398
412- return finalHooks ;
399+ currentType = currentType . BaseType ;
400+ }
401+
402+ // For After hooks: derived class hooks run first
403+ // No need to reverse since we collected from derived to base
404+
405+ var finalHooks = new List < Func < TestContext , CancellationToken , Task > > ( ) ;
406+ foreach ( var ( _, typeHooks ) in hooksByType )
407+ {
408+ // Within each type level, sort by Order then by RegistrationIndex
409+ SortAndAddHooks ( finalHooks , typeHooks ) ;
410+ }
411+
412+ return finalHooks ;
413413 }
414414
415415 public ValueTask < IReadOnlyList < Func < TestContext , CancellationToken , Task > > > CollectBeforeEveryTestHooksAsync ( Type testClassType )
@@ -834,5 +834,4 @@ private async Task<Func<TestDiscoveryContext, CancellationToken, Task>> CreateTe
834834 cancellationToken ) ;
835835 } ;
836836 }
837-
838837}
0 commit comments