@@ -16,7 +16,7 @@ public void FindCascadingParameters_IfHasNoParameters_ReturnsEmpty()
16
16
var componentState = CreateComponentState ( new ComponentWithNoParams ( ) ) ;
17
17
18
18
// Act
19
- var result = CascadingParameterState . FindCascadingParameters ( componentState ) ;
19
+ var result = CascadingParameterState . FindCascadingParameters ( componentState , out _ ) ;
20
20
21
21
// Assert
22
22
Assert . Empty ( result ) ;
@@ -29,7 +29,7 @@ public void FindCascadingParameters_IfHasNoCascadingParameters_ReturnsEmpty()
29
29
var componentState = CreateComponentState ( new ComponentWithNoCascadingParams ( ) ) ;
30
30
31
31
// Act
32
- var result = CascadingParameterState . FindCascadingParameters ( componentState ) ;
32
+ var result = CascadingParameterState . FindCascadingParameters ( componentState , out _ ) ;
33
33
34
34
// Assert
35
35
Assert . Empty ( result ) ;
@@ -42,7 +42,7 @@ public void FindCascadingParameters_IfHasNoAncestors_ReturnsEmpty()
42
42
var componentState = CreateComponentState ( new ComponentWithCascadingParams ( ) ) ;
43
43
44
44
// Act
45
- var result = CascadingParameterState . FindCascadingParameters ( componentState ) ;
45
+ var result = CascadingParameterState . FindCascadingParameters ( componentState , out _ ) ;
46
46
47
47
// Assert
48
48
Assert . Empty ( result ) ;
@@ -59,7 +59,7 @@ public void FindCascadingParameters_IfHasNoMatchesInAncestors_ReturnsEmpty()
59
59
new ComponentWithCascadingParams ( ) ) ;
60
60
61
61
// Act
62
- var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) ) ;
62
+ var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) , out _ ) ;
63
63
64
64
// Assert
65
65
Assert . Empty ( result ) ;
@@ -76,7 +76,7 @@ public void FindCascadingParameters_IfHasPartialMatchesInAncestors_ReturnsMatche
76
76
new ComponentWithCascadingParams ( ) ) ;
77
77
78
78
// Act
79
- var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) ) ;
79
+ var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) , out _ ) ;
80
80
81
81
// Assert
82
82
Assert . Collection ( result , match =>
@@ -98,7 +98,7 @@ public void FindCascadingParameters_IfHasMultipleMatchesInAncestors_ReturnsMatch
98
98
new ComponentWithCascadingParams ( ) ) ;
99
99
100
100
// Act
101
- var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) ) ;
101
+ var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) , out _ ) ;
102
102
103
103
// Assert
104
104
Assert . Collection ( result . OrderBy ( x => x . ParameterInfo . PropertyName ) ,
@@ -124,7 +124,7 @@ public void FindCascadingParameters_InheritedParameters_ReturnsMatches()
124
124
new ComponentWithInheritedCascadingParams ( ) ) ;
125
125
126
126
// Act
127
- var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) ) ;
127
+ var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) , out _ ) ;
128
128
129
129
// Assert
130
130
Assert . Collection ( result . OrderBy ( x => x . ParameterInfo . PropertyName ) ,
@@ -149,7 +149,7 @@ public void FindCascadingParameters_ComponentRequestsBaseType_ReturnsMatches()
149
149
new ComponentWithGenericCascadingParam < CascadingValueTypeBaseClass > ( ) ) ;
150
150
151
151
// Act
152
- var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) ) ;
152
+ var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) , out _ ) ;
153
153
154
154
// Assert
155
155
Assert . Collection ( result , match =>
@@ -168,7 +168,7 @@ public void FindCascadingParameters_ComponentRequestsImplementedInterface_Return
168
168
new ComponentWithGenericCascadingParam < ICascadingValueTypeDerivedClassInterface > ( ) ) ;
169
169
170
170
// Act
171
- var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) ) ;
171
+ var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) , out _ ) ;
172
172
173
173
// Assert
174
174
Assert . Collection ( result , match =>
@@ -187,7 +187,7 @@ public void FindCascadingParameters_ComponentRequestsDerivedType_ReturnsEmpty()
187
187
new ComponentWithGenericCascadingParam < CascadingValueTypeDerivedClass > ( ) ) ;
188
188
189
189
// Act
190
- var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) ) ;
190
+ var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) , out _ ) ;
191
191
192
192
// Assert
193
193
Assert . Empty ( result ) ;
@@ -202,7 +202,7 @@ public void FindCascadingParameters_TypeAssignmentIsValidForNullValue_ReturnsMat
202
202
new ComponentWithGenericCascadingParam < CascadingValueTypeBaseClass > ( ) ) ;
203
203
204
204
// Act
205
- var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) ) ;
205
+ var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) , out _ ) ;
206
206
207
207
// Assert
208
208
Assert . Collection ( result , match =>
@@ -221,7 +221,7 @@ public void FindCascadingParameters_TypeAssignmentIsInvalidForNullValue_ReturnsE
221
221
new ComponentWithGenericCascadingParam < ValueType1 > ( ) ) ;
222
222
223
223
// Act
224
- var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) ) ;
224
+ var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) , out _ ) ;
225
225
226
226
// Assert
227
227
Assert . Empty ( result ) ;
@@ -236,7 +236,7 @@ public void FindCascadingParameters_SupplierSpecifiesNameButConsumerDoesNot_Retu
236
236
new ComponentWithCascadingParams ( ) ) ;
237
237
238
238
// Act
239
- var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) ) ;
239
+ var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) , out _ ) ;
240
240
241
241
// Assert
242
242
Assert . Empty ( result ) ;
@@ -251,7 +251,7 @@ public void FindCascadingParameters_ConsumerSpecifiesNameButSupplierDoesNot_Retu
251
251
new ComponentWithNamedCascadingParam ( ) ) ;
252
252
253
253
// Act
254
- var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) ) ;
254
+ var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) , out _ ) ;
255
255
256
256
// Assert
257
257
Assert . Empty ( result ) ;
@@ -266,7 +266,7 @@ public void FindCascadingParameters_MismatchingNameButMatchingType_ReturnsEmpty(
266
266
new ComponentWithNamedCascadingParam ( ) ) ;
267
267
268
268
// Act
269
- var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) ) ;
269
+ var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) , out _ ) ;
270
270
271
271
// Assert
272
272
Assert . Empty ( result ) ;
@@ -281,7 +281,7 @@ public void FindCascadingParameters_MatchingNameButMismatchingType_ReturnsEmpty(
281
281
new ComponentWithNamedCascadingParam ( ) ) ;
282
282
283
283
// Act
284
- var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) ) ;
284
+ var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) , out _ ) ;
285
285
286
286
// Assert
287
287
Assert . Empty ( result ) ;
@@ -296,7 +296,7 @@ public void FindCascadingParameters_MatchingNameAndType_ReturnsMatches()
296
296
new ComponentWithNamedCascadingParam ( ) ) ;
297
297
298
298
// Act
299
- var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) ) ;
299
+ var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) , out _ ) ;
300
300
301
301
// Assert
302
302
Assert . Collection ( result , match =>
@@ -318,7 +318,7 @@ public void FindCascadingParameters_MultipleMatchingAncestors_ReturnsClosestMatc
318
318
new ComponentWithCascadingParams ( ) ) ;
319
319
320
320
// Act
321
- var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) ) ;
321
+ var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) , out _ ) ;
322
322
323
323
// Assert
324
324
Assert . Collection ( result . OrderBy ( x => x . ParameterInfo . PropertyName ) ,
@@ -344,7 +344,7 @@ public void FindCascadingParameters_CanOverrideNonNullValueWithNull()
344
344
new ComponentWithCascadingParams ( ) ) ;
345
345
346
346
// Act
347
- var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) ) ;
347
+ var result = CascadingParameterState . FindCascadingParameters ( states . Last ( ) , out _ ) ;
348
348
349
349
// Assert
350
350
Assert . Collection ( result . OrderBy ( x => x . ParameterInfo . PropertyName ) ,
@@ -356,7 +356,49 @@ public void FindCascadingParameters_CanOverrideNonNullValueWithNull()
356
356
} ) ;
357
357
}
358
358
359
-
359
+ [ Fact ]
360
+ public void FindCascadingParameters_WithoutSingleDelivery ( )
361
+ {
362
+ // Even though ComponentWithCascadingParams itself declares a [SupplyParameterAsSingleDelivery],
363
+ // none of the suppliers match it, so we'll get hasSingleDeliveryParameters = false
364
+
365
+ // Arrange
366
+ var states = CreateAncestry (
367
+ CreateCascadingValueComponent ( new ValueType1 ( ) ) ,
368
+ new ComponentWithCascadingParams ( ) ) ;
369
+
370
+ // Act
371
+ _ = CascadingParameterState . FindCascadingParameters ( states . Last ( ) , out var hasSingleDeliveryParameters ) ;
372
+
373
+ // Assert
374
+ Assert . False ( hasSingleDeliveryParameters ) ;
375
+ }
376
+
377
+ [ Fact ]
378
+ public void FindCascadingParameters_WithSingleDelivery ( )
379
+ {
380
+ // Arrange
381
+ var states = CreateAncestry (
382
+ CreateCascadingValueComponent ( new ValueType1 ( ) ) ,
383
+ new SupplyParameterWithSingleDeliveryComponent ( isFixed : true ) ,
384
+ new ComponentWithCascadingParams ( ) ) ;
385
+
386
+ // Act
387
+ _ = CascadingParameterState . FindCascadingParameters ( states . Last ( ) , out var hasSingleDeliveryParameters ) ;
388
+
389
+ // Assert
390
+ Assert . True ( hasSingleDeliveryParameters ) ;
391
+ }
392
+
393
+ [ Fact ]
394
+ public void FindCascadingParameters_DisallowsSingleDeliveryWhenIsFixedIsFalse ( )
395
+ {
396
+ var ex = Assert . Throws < InvalidOperationException > ( ( ) => CreateAncestry (
397
+ new SupplyParameterWithSingleDeliveryComponent ( isFixed : false ) ,
398
+ new ComponentWithCascadingParams ( ) ) ) ;
399
+
400
+ Assert . StartsWith ( $ "'{ typeof ( SupplyParameterWithSingleDeliveryAttribute ) } ' is flagged with SingleDelivery", ex . Message ) ;
401
+ }
360
402
361
403
static ComponentState [ ] CreateAncestry ( params IComponent [ ] components )
362
404
{
@@ -412,6 +454,8 @@ class ComponentWithCascadingParams : TestComponentBase
412
454
[ Parameter ] public bool RegularParam { get ; set ; }
413
455
[ CascadingParameter ] internal ValueType1 CascadingParam1 { get ; set ; }
414
456
[ CascadingParameter ] internal ValueType2 CascadingParam2 { get ; set ; }
457
+
458
+ [ SupplyParameterWithSingleDelivery ] internal ValueType3 SingleDeliveryCascadingParam { get ; set ; }
415
459
}
416
460
417
461
class ComponentWithInheritedCascadingParams : ComponentWithCascadingParams
@@ -430,6 +474,30 @@ class ComponentWithNamedCascadingParam : TestComponentBase
430
474
internal ValueType1 SomeLocalName { get ; set ; }
431
475
}
432
476
477
+ class SupplyParameterWithSingleDeliveryAttribute : CascadingParameterAttributeBase
478
+ {
479
+ public override string Name { get ; set ; }
480
+
481
+ internal override bool SingleDelivery => true ;
482
+ }
483
+
484
+ class SupplyParameterWithSingleDeliveryComponent ( bool isFixed ) : ComponentBase , ICascadingValueSupplier
485
+ {
486
+ public bool IsFixed => isFixed ;
487
+
488
+ public bool CanSupplyValue ( in CascadingParameterInfo parameterInfo )
489
+ => parameterInfo . Attribute is SupplyParameterWithSingleDeliveryAttribute ;
490
+
491
+ public object GetCurrentValue ( in CascadingParameterInfo parameterInfo )
492
+ => throw new NotImplementedException ( ) ;
493
+
494
+ public void Subscribe ( ComponentState subscriber , in CascadingParameterInfo parameterInfo )
495
+ => throw new NotImplementedException ( ) ;
496
+
497
+ public void Unsubscribe ( ComponentState subscriber , in CascadingParameterInfo parameterInfo )
498
+ => throw new NotImplementedException ( ) ;
499
+ }
500
+
433
501
class TestComponentBase : IComponent
434
502
{
435
503
public void Attach ( RenderHandle renderHandle )
0 commit comments