@@ -10,68 +10,85 @@ namespace Bunit
1010 /// Helpful extensions for working with <see cref="ComponentParameter"/> and collections of these.
1111 /// </summary>
1212 public static class ComponentParamenterExtensions
13- {
14- /// <summary>
15- /// Creates a <see cref="RenderFragment"/> that will render a component of <typeparamref name="TComponent"/> type,
16- /// with the provided <paramref name="parameters"/>. If one or more of the <paramref name="parameters"/> include
17- /// a cascading values, the <typeparamref name="TComponent"/> will be wrapped in <see cref="Microsoft.AspNetCore.Components.CascadingValue{TValue}"/>
18- /// components.
19- /// </summary>
20- /// <typeparam name="TComponent">Type of component to render in the render fragment</typeparam>
21- /// <param name="parameters">Parameters to pass to the component</param>
22- /// <returns>The <see cref="RenderFragment"/>.</returns>
23- public static RenderFragment ToComponentRenderFragment < TComponent > ( this IReadOnlyList < ComponentParameter > parameters ) where TComponent : class , IComponent
24- {
25- var cascadingParams = new Queue < ComponentParameter > ( parameters . Where ( x => x . IsCascadingValue ) ) ;
13+ {
14+ /// <summary>
15+ /// Converts a collection of <see cref="ComponentParameter"/> into a <see cref="ParameterValue"/>.
16+ /// </summary>
17+ /// <param name="parameters">Collection to convert.</param>
18+ /// <returns>The <see cref="ParameterValue"/>.</returns>
19+ public static ParameterView ToParameterView ( this IEnumerable < ComponentParameter > parameters )
20+ {
21+ if ( parameters . Any ( ) )
22+ {
23+ var p = parameters . Where ( x => ! x . IsCascadingValue ) . ToDictionary ( x => x . Name , x => x . Value ) ;
24+ return ParameterView . FromDictionary ( p ) ;
25+ }
26+ else
27+ return ParameterView . Empty ;
28+ }
2629
27- if ( cascadingParams . Count > 0 )
28- return CreateCascadingValueRenderFragment ( cascadingParams , parameters ) ;
29- else
30- return CreateComponentRenderFragment ( parameters ) ;
30+ /// <summary>
31+ /// Creates a <see cref="RenderFragment"/> that will render a component of <typeparamref name="TComponent"/> type,
32+ /// with the provided <paramref name="parameters"/>. If one or more of the <paramref name="parameters"/> include
33+ /// a cascading values, the <typeparamref name="TComponent"/> will be wrapped in <see cref="Microsoft.AspNetCore.Components.CascadingValue{TValue}"/>
34+ /// components.
35+ /// </summary>
36+ /// <typeparam name="TComponent">Type of component to render in the render fragment</typeparam>
37+ /// <param name="parameters">Parameters to pass to the component</param>
38+ /// <returns>The <see cref="RenderFragment"/>.</returns>
39+ public static RenderFragment ToComponentRenderFragment < TComponent > ( this IReadOnlyList < ComponentParameter > parameters ) where TComponent : class , IComponent
40+ {
41+ var cascadingParams = new Queue < ComponentParameter > ( parameters . Where ( x => x . IsCascadingValue ) ) ;
3142
32- static RenderFragment CreateCascadingValueRenderFragment ( Queue < ComponentParameter > cascadingParams , IReadOnlyList < ComponentParameter > parameters )
33- {
34- var cp = cascadingParams . Dequeue ( ) ;
35- var cascadingValueType = GetCascadingValueType ( cp ) ;
36- return builder =>
37- {
38- builder . OpenComponent ( 0 , cascadingValueType ) ;
39- if ( cp . Name is { } )
40- builder . AddAttribute ( 1 , nameof ( CascadingValue < object > . Name ) , cp . Name ) ;
43+ if ( cascadingParams . Count > 0 )
44+ return CreateCascadingValueRenderFragment ( cascadingParams , parameters ) ;
45+ else
46+ return CreateComponentRenderFragment ( parameters ) ;
4147
42- builder . AddAttribute ( 2 , nameof ( CascadingValue < object > . Value ) , cp . Value ) ;
43- builder . AddAttribute ( 3 , nameof ( CascadingValue < object > . IsFixed ) , true ) ;
48+ static RenderFragment CreateCascadingValueRenderFragment ( Queue < ComponentParameter > cascadingParams , IReadOnlyList < ComponentParameter > parameters )
49+ {
50+ var cp = cascadingParams . Dequeue ( ) ;
51+ var cascadingValueType = GetCascadingValueType ( cp ) ;
52+ return builder =>
53+ {
54+ builder . OpenComponent ( 0 , cascadingValueType ) ;
55+ if ( cp . Name is { } )
56+ builder . AddAttribute ( 1 , nameof ( CascadingValue < object > . Name ) , cp . Name ) ;
4457
45- if ( cascadingParams . Count > 0 )
46- builder . AddAttribute ( 4 , nameof ( CascadingValue < object > . ChildContent ) , CreateCascadingValueRenderFragment ( cascadingParams , parameters ) ) ;
47- else
48- builder . AddAttribute ( 4 , nameof ( CascadingValue < object > . ChildContent ) , CreateComponentRenderFragment ( parameters ) ) ;
58+ builder . AddAttribute ( 2 , nameof ( CascadingValue < object > . Value ) , cp . Value ) ;
59+ builder . AddAttribute ( 3 , nameof ( CascadingValue < object > . IsFixed ) , true ) ;
4960
50- builder . CloseComponent ( ) ;
51- } ;
52- }
61+ if ( cascadingParams . Count > 0 )
62+ builder . AddAttribute ( 4 , nameof ( CascadingValue < object > . ChildContent ) , CreateCascadingValueRenderFragment ( cascadingParams , parameters ) ) ;
63+ else
64+ builder . AddAttribute ( 4 , nameof ( CascadingValue < object > . ChildContent ) , CreateComponentRenderFragment ( parameters ) ) ;
5365
54- static RenderFragment CreateComponentRenderFragment ( IReadOnlyList < ComponentParameter > parameters )
55- {
56- return builder =>
57- {
58- builder . OpenComponent ( 0 , typeof ( TComponent ) ) ;
66+ builder . CloseComponent ( ) ;
67+ } ;
68+ }
5969
60- foreach ( var parameterValue in parameters . Where ( x => ! x . IsCascadingValue ) )
61- builder . AddAttribute ( 1 , parameterValue . Name , parameterValue . Value ) ;
70+ static RenderFragment CreateComponentRenderFragment ( IReadOnlyList < ComponentParameter > parameters )
71+ {
72+ return builder =>
73+ {
74+ builder . OpenComponent ( 0 , typeof ( TComponent ) ) ;
6275
63- builder . CloseComponent ( ) ;
64- } ;
65- }
66- }
76+ foreach ( var parameterValue in parameters . Where ( x => ! x . IsCascadingValue ) )
77+ builder . AddAttribute ( 1 , parameterValue . Name , parameterValue . Value ) ;
6778
68- private static readonly Type CascadingValueType = typeof ( CascadingValue < > ) ;
79+ builder . CloseComponent ( ) ;
80+ } ;
81+ }
82+ }
6983
70- private static Type GetCascadingValueType ( ComponentParameter parameter )
71- {
72- if ( parameter . Value is null ) throw new InvalidOperationException ( "Cannot get the type of a null object" ) ;
73- var cascadingValueType = parameter . Value . GetType ( ) ;
74- return CascadingValueType . MakeGenericType ( cascadingValueType ) ;
75- }
76- }
84+ private static readonly Type CascadingValueType = typeof ( CascadingValue < > ) ;
85+
86+ private static Type GetCascadingValueType ( ComponentParameter parameter )
87+ {
88+ if ( parameter . Value is null )
89+ throw new InvalidOperationException ( "Cannot get the type of a null object" ) ;
90+ var cascadingValueType = parameter . Value . GetType ( ) ;
91+ return CascadingValueType . MakeGenericType ( cascadingValueType ) ;
92+ }
93+ }
7794}
0 commit comments