|
1120 | 1120 | Assert.Null(component.OptionSelectedComparer); |
1121 | 1121 | } |
1122 | 1122 |
|
| 1123 | + [Fact] |
| 1124 | + public void FluentAutocomplete_SelectedItemExpression_DefaultIsNotNull() |
| 1125 | + { |
| 1126 | + string? selectedItem = "Two"; |
| 1127 | + |
| 1128 | + // Arrange - Render without supplying SelectedItemExpression (manual one-way binding scenario) |
| 1129 | + var cut = Render(@<FluentAutocomplete TOption="string" |
| 1130 | + TValue="string" |
| 1131 | + Multiple="false" |
| 1132 | + Items="@Digits" |
| 1133 | + SelectedItem="@selectedItem" |
| 1134 | + SelectedItemChanged="@((string v) => selectedItem = v)" />); |
| 1135 | + |
| 1136 | + // Assert - The constructor sets a default expression so consumers using manual |
| 1137 | + // one-way binding (SelectedItem + SelectedItemChanged only) still get a non-null expression. |
| 1138 | + var instance = cut.FindComponent<FluentAutocomplete<string, string>>().Instance; |
| 1139 | + Assert.NotNull(instance.SelectedItemExpression); |
| 1140 | + Assert.Equal("Two", instance.SelectedItemExpression!.Compile().Invoke()); |
| 1141 | + } |
| 1142 | + |
| 1143 | + [Fact] |
| 1144 | + public void FluentAutocomplete_SelectedItemExpression_ManualOneWayBinding() |
| 1145 | + { |
| 1146 | + // This test compiles ONLY because SelectedItemExpression exists as a [Parameter]. |
| 1147 | + // Razor's @bind-SelectedItem:get/:set syntax emits SelectedItem, SelectedItemChanged |
| 1148 | + // AND SelectedItemExpression on the component. |
| 1149 | + string? selectedItem = "One"; |
| 1150 | + |
| 1151 | + // Arrange |
| 1152 | + var cut = Render(@<FluentAutocomplete TOption="string" |
| 1153 | + TValue="string" |
| 1154 | + Multiple="false" |
| 1155 | + Items="@Digits" |
| 1156 | + @bind-SelectedItem:get="selectedItem" |
| 1157 | + @bind-SelectedItem:set="@((string v) => { selectedItem = v; return Task.CompletedTask; })" />); |
| 1158 | + |
| 1159 | + // Assert - The component's SelectedItemExpression is supplied by Razor and reflects the bound field |
| 1160 | + var instance = cut.FindComponent<FluentAutocomplete<string, string>>().Instance; |
| 1161 | + Assert.NotNull(instance.SelectedItemExpression); |
| 1162 | + Assert.Equal("One", instance.SelectedItemExpression!.Compile().Invoke()); |
| 1163 | + |
| 1164 | + // The badge displays the initial selection |
| 1165 | + var badge = cut.Find("span.fluent-badge[alone]"); |
| 1166 | + Assert.Equal("One", badge.GetAttribute("title")); |
| 1167 | + } |
| 1168 | + |
| 1169 | + [Fact] |
| 1170 | + public void FluentAutocomplete_SelectedItemExpression_ExplicitlyProvided() |
| 1171 | + { |
| 1172 | + string? selectedItem = "Three"; |
| 1173 | + System.Linq.Expressions.Expression<Func<string?>> expression = () => selectedItem; |
| 1174 | + |
| 1175 | + // Arrange - Explicitly provide SelectedItemExpression |
| 1176 | + var cut = Render(@<FluentAutocomplete TOption="string" |
| 1177 | + TValue="string" |
| 1178 | + Multiple="false" |
| 1179 | + Items="@Digits" |
| 1180 | + SelectedItem="@selectedItem" |
| 1181 | + SelectedItemChanged="@((string v) => selectedItem = v)" |
| 1182 | + SelectedItemExpression="@expression" />); |
| 1183 | + |
| 1184 | + // Assert - The supplied expression overrides the default set in the constructor |
| 1185 | + var instance = cut.FindComponent<FluentAutocomplete<string, string>>().Instance; |
| 1186 | + Assert.Same(expression, instance.SelectedItemExpression); |
| 1187 | + } |
| 1188 | + |
1123 | 1189 | public class Person : IEqualityComparer<Person> |
1124 | 1190 | { |
1125 | 1191 | public int Id { get; set; } |
|
0 commit comments