diff --git a/src/Controls/src/Core.Design/FontSizeDesignTypeConverter.cs b/src/Controls/src/Core.Design/FontSizeDesignTypeConverter.cs index 3ae93210452b..3af2067a52ea 100644 --- a/src/Controls/src/Core.Design/FontSizeDesignTypeConverter.cs +++ b/src/Controls/src/Core.Design/FontSizeDesignTypeConverter.cs @@ -19,6 +19,16 @@ public FontSizeDesignTypeConverter() protected override string[] KnownValues => new[] { "Default", "Micro", "Small", "Medium", "Large", "Body", "Header", "Title", "Subtitle", "Caption" }; + /// + public override bool GetStandardValuesSupported(ITypeDescriptorContext context) + => false; + + /// + // Standard values have been marked obsolete since .NET 9, so we don’t return them + // to prevent the IDE’s auto-complete from suggesting them. + public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) + => new StandardValuesCollection(Array.Empty()); + /// public override bool IsValid(ITypeDescriptorContext context, object value) { diff --git a/src/Controls/tests/Core.Design.UnitTests/Controls.Core.Design.UnitTests.csproj b/src/Controls/tests/Core.Design.UnitTests/Controls.Core.Design.UnitTests.csproj index 0ccc6d1f39ac..eea378f61455 100644 --- a/src/Controls/tests/Core.Design.UnitTests/Controls.Core.Design.UnitTests.csproj +++ b/src/Controls/tests/Core.Design.UnitTests/Controls.Core.Design.UnitTests.csproj @@ -19,6 +19,7 @@ + diff --git a/src/Controls/tests/Core.Design.UnitTests/FontSizeDesignTypeConverterTests.cs b/src/Controls/tests/Core.Design.UnitTests/FontSizeDesignTypeConverterTests.cs new file mode 100644 index 000000000000..89b40750decd --- /dev/null +++ b/src/Controls/tests/Core.Design.UnitTests/FontSizeDesignTypeConverterTests.cs @@ -0,0 +1,74 @@ +using Microsoft.Maui.Controls.Design; +using Xunit; + +namespace Microsoft.Maui.Controls.Core.UnitTests +{ + public class FontSizeDesignTypeConverterTests + { + [Fact] + public void FontSizeDesignTypeConverter_StandardValuesNotSupported() + { + FontSizeDesignTypeConverter converter = new FontSizeDesignTypeConverter(); + Assert.True(converter.CanConvertFrom(typeof(string))); + + // Standard values should not be supported to prevent IDE autocomplete + // from suggesting obsolete named font size values + bool actual = converter.GetStandardValuesSupported(); + Assert.False(actual); + } + + [Fact] + public void FontSizeDesignTypeConverter_StandardValuesEmpty() + { + FontSizeDesignTypeConverter converter = new FontSizeDesignTypeConverter(); + + // GetStandardValues should return an empty collection + var values = converter.GetStandardValues(); + Assert.Empty(values); + } + + [Theory] + [InlineData("Default")] + [InlineData("Micro")] + [InlineData("Small")] + [InlineData("Medium")] + [InlineData("Large")] + [InlineData("Body")] + [InlineData("Header")] + [InlineData("Title")] + [InlineData("Subtitle")] + [InlineData("Caption")] + public void FontSizeDesignTypeConverter_NamedValuesStillValid(string value) + { + // Named values are obsolete but should still be valid for backward compatibility + FontSizeDesignTypeConverter converter = new FontSizeDesignTypeConverter(); + bool actual = converter.IsValid(value); + Assert.True(actual); + } + + [Theory] + [InlineData("12")] + [InlineData("0")] + [InlineData("100")] + public void FontSizeDesignTypeConverter_NumericValuesValid(string value) + { + FontSizeDesignTypeConverter converter = new FontSizeDesignTypeConverter(); + bool actual = converter.IsValid(value); + Assert.True(actual); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + [InlineData(" ")] + [InlineData("foo")] + [InlineData("extra large")] + [InlineData("12px")] + public void FontSizeDesignTypeConverter_InvalidValues(string value) + { + FontSizeDesignTypeConverter converter = new FontSizeDesignTypeConverter(); + bool actual = converter.IsValid(value); + Assert.False(actual); + } + } +}