11using Microsoft . Extensions . Logging ;
2+ using System . Text . Json ;
23
34namespace Bunit . Rendering ;
45
56internal static class TestRendererLoggerExtensions
67{
78 private static readonly Action < ILogger , int , Exception ? > ComponentDisposed
8- = LoggerMessage . Define < int > ( LogLevel . Debug , new EventId ( 11 , "ComponentDisposed" ) , "Component {Id} has been disposed." ) ;
9-
10- private static readonly Action < ILogger , int , Exception ? > ComponentRendered
11- = LoggerMessage . Define < int > ( LogLevel . Debug , new EventId ( 12 , "ComponentRendered" ) , "Component {Id} has been rendered." ) ;
12-
13- private static readonly Action < ILogger , int , int , Exception ? > DisposedChildInRenderTreeFrame
14- = LoggerMessage . Define < int , int > ( LogLevel . Warning , new EventId ( 14 , "DisposedChildInRenderTreeFrame" ) , "A parent components {ParentComponentId} has a disposed component {ComponentId} as its child." ) ;
15-
16- private static readonly Action < ILogger , Exception ? > AsyncInitialRender
17- = LoggerMessage . Define ( LogLevel . Debug , new EventId ( 20 , "AsyncInitialRender" ) , "The initial render task did not complete immediately." ) ;
18-
19- private static readonly Action < ILogger , int , Exception ? > InitialRenderCompleted
20- = LoggerMessage . Define < int > ( LogLevel . Debug , new EventId ( 21 , "InitialRenderCompleted" ) , "The initial render of component {Id} is completed." ) ;
21-
22- private static readonly Action < ILogger , string , string , Exception > UnhandledException
23- = LoggerMessage . Define < string , string > ( LogLevel . Error , new EventId ( 30 , "UnhandledException" ) , "An unhandled exception happened during rendering: {Message}" + Environment . NewLine + "{StackTrace}" ) ;
24-
25- private static readonly Action < ILogger , Exception ? > RenderCycleActiveAfterDispose
26- = LoggerMessage . Define ( LogLevel . Warning , new EventId ( 31 , "RenderCycleActiveAfterDispose" ) , "A component attempted to update the render tree after the renderer was disposed." ) ;
27-
9+ = LoggerMessage . Define < int > (
10+ LogLevel . Debug ,
11+ new EventId ( 11 , "ComponentDisposed" ) ,
12+ "Component {Id} has been disposed." ) ;
2813
2914 internal static void LogComponentDisposed ( this ILogger < TestRenderer > logger , int componentId )
3015 {
@@ -34,6 +19,12 @@ internal static void LogComponentDisposed(this ILogger<TestRenderer> logger, int
3419 }
3520 }
3621
22+ private static readonly Action < ILogger , int , Exception ? > ComponentRendered
23+ = LoggerMessage . Define < int > (
24+ LogLevel . Debug ,
25+ new EventId ( 12 , "ComponentRendered" ) ,
26+ "Component {ComponentId} has been rendered." ) ;
27+
3728 internal static void LogComponentRendered ( this ILogger < TestRenderer > logger , int componentId )
3829 {
3930 if ( logger . IsEnabled ( LogLevel . Debug ) )
@@ -42,6 +33,26 @@ internal static void LogComponentRendered(this ILogger<TestRenderer> logger, int
4233 }
4334 }
4435
36+ private static readonly Action < ILogger , int , int , Exception ? > DisposedChildInRenderTreeFrame
37+ = LoggerMessage . Define < int , int > (
38+ LogLevel . Warning ,
39+ new EventId ( 14 , "DisposedChildInRenderTreeFrame" ) ,
40+ "A parent components {ParentComponentId} has a disposed component {ComponentId} as its child." ) ;
41+
42+ internal static void LogDisposedChildInRenderTreeFrame ( this ILogger < TestRenderer > logger , int parentComponentId , int componentId )
43+ {
44+ if ( logger . IsEnabled ( LogLevel . Warning ) )
45+ {
46+ DisposedChildInRenderTreeFrame ( logger , parentComponentId , componentId , null ) ;
47+ }
48+ }
49+
50+ private static readonly Action < ILogger , Exception ? > AsyncInitialRender
51+ = LoggerMessage . Define (
52+ LogLevel . Debug ,
53+ new EventId ( 20 , "AsyncInitialRender" ) ,
54+ "The initial render task did not complete immediately." ) ;
55+
4556 internal static void LogAsyncInitialRender ( this ILogger < TestRenderer > logger )
4657 {
4758 if ( logger . IsEnabled ( LogLevel . Debug ) )
@@ -50,6 +61,12 @@ internal static void LogAsyncInitialRender(this ILogger<TestRenderer> logger)
5061 }
5162 }
5263
64+ private static readonly Action < ILogger , int , Exception ? > InitialRenderCompleted
65+ = LoggerMessage . Define < int > (
66+ LogLevel . Debug ,
67+ new EventId ( 21 , "InitialRenderCompleted" ) ,
68+ "The initial render of component {ComponentId} is completed." ) ;
69+
5370 internal static void LogInitialRenderCompleted ( this ILogger < TestRenderer > logger , int componentId )
5471 {
5572 if ( logger . IsEnabled ( LogLevel . Debug ) )
@@ -58,6 +75,12 @@ internal static void LogInitialRenderCompleted(this ILogger<TestRenderer> logger
5875 }
5976 }
6077
78+ private static readonly Action < ILogger , string , string , Exception > UnhandledException
79+ = LoggerMessage . Define < string , string > (
80+ LogLevel . Error ,
81+ new EventId ( 30 , "UnhandledException" ) ,
82+ "An unhandled exception happened during rendering: {Message}" + Environment . NewLine + "{StackTrace}" ) ;
83+
6184 internal static void LogUnhandledException ( this ILogger < TestRenderer > logger , Exception exception )
6285 {
6386 if ( logger . IsEnabled ( LogLevel . Error ) )
@@ -66,6 +89,12 @@ internal static void LogUnhandledException(this ILogger<TestRenderer> logger, Ex
6689 }
6790 }
6891
92+ private static readonly Action < ILogger , Exception ? > RenderCycleActiveAfterDispose
93+ = LoggerMessage . Define (
94+ LogLevel . Warning ,
95+ new EventId ( 31 , "RenderCycleActiveAfterDispose" ) ,
96+ "A component attempted to update the render tree after the renderer was disposed." ) ;
97+
6998 internal static void LogRenderCycleActiveAfterDispose ( this ILogger < TestRenderer > logger )
7099 {
71100 if ( logger . IsEnabled ( LogLevel . Warning ) )
@@ -74,11 +103,42 @@ internal static void LogRenderCycleActiveAfterDispose(this ILogger<TestRenderer>
74103 }
75104 }
76105
77- internal static void LogDisposedChildInRenderTreeFrame ( this ILogger < TestRenderer > logger , int parentComponentId , int componentId )
106+ private static readonly Action < ILogger , string , string , ulong , int , Exception ? > DispatchingEventWithFieldValue
107+ = LoggerMessage . Define < string , string , ulong , int > (
108+ LogLevel . Debug ,
109+ new EventId ( 40 , "DispatchingEvent" ) ,
110+ "Dispatching {EventArgs} to {FieldValue} handler (id = {EventHandlerId}) on component {ComponentId}." ) ;
111+
112+ private static readonly Action < ILogger , string , ulong , int , Exception ? > DispatchingEvent
113+ = LoggerMessage . Define < string , ulong , int > (
114+ LogLevel . Debug ,
115+ new EventId ( 40 , "DispatchingEvent" ) ,
116+ "Dispatching {EventArgs} to handler (id = {EventHandlerId}) on component {ComponentId}." ) ;
117+
118+ internal static void LogDispatchingEvent ( this ILogger < TestRenderer > logger , ulong eventHandlerId , EventFieldInfo fieldInfo , EventArgs eventArgs )
78119 {
79- if ( logger . IsEnabled ( LogLevel . Warning ) )
120+ if ( logger . IsEnabled ( LogLevel . Debug ) )
80121 {
81- DisposedChildInRenderTreeFrame ( logger , parentComponentId , componentId , null ) ;
122+ var eventType = eventArgs . GetType ( ) ;
123+ var eventArgsText = eventType . Name ;
124+ if ( eventArgsText != nameof ( EventArgs ) )
125+ {
126+ var eventArgsContent = JsonSerializer . Serialize ( eventArgs , eventType ) ;
127+ eventArgsText = eventArgsContent == "{}"
128+ ? eventArgsText
129+ : $ "{ eventArgsText } = { eventArgsContent } ";
130+ }
131+
132+ if ( fieldInfo . FieldValue is not null )
133+ {
134+ var fieldValueText = JsonSerializer . Serialize ( fieldInfo . FieldValue , fieldInfo . FieldValue . GetType ( ) ) ;
135+ DispatchingEventWithFieldValue ( logger , eventArgsText , fieldValueText , eventHandlerId , fieldInfo . ComponentId , null ) ;
136+ }
137+ else
138+ {
139+ DispatchingEvent ( logger , eventArgsText , eventHandlerId , fieldInfo . ComponentId , null ) ;
140+ }
82141 }
83142 }
143+
84144}
0 commit comments