123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- #nullable enable
- using System.Reflection;
- using System.Text.Json.Serialization;
- using System.Text.Json.Serialization.Metadata;
- namespace Terminal.Gui.ConfigurationTests;
- public class SerializableConfigurationPropertyTests
- {
- /// <summary>
- /// If this test fails, you need to add a new property to <see cref="SourceGenerationContext"/> to support serialization of the new property type.
- /// </summary>
- [Fact]
- public void Test_SerializableConfigurationProperty_Types_Added_To_JsonSerializerContext ()
- {
- // The assembly containing the types to inspect
- var assembly = Assembly.GetAssembly (typeof (SourceGenerationContext));
- // Get all types from the assembly
- var types = assembly!.GetTypes ();
- // Find all properties with the SerializableConfigurationProperty attribute
- var properties = new List<PropertyInfo> ();
- foreach (var type in types)
- {
- properties.AddRange (type.GetProperties ().Where (p =>
- p.GetCustomAttributes (typeof (SerializableConfigurationProperty), false).Any ()));
- }
- // Get the types of the properties
- var propertyTypes = properties.Select (p => p.PropertyType).Distinct ();
- // Get the types registered in the JsonSerializerContext derived class
- var contextType = typeof (SourceGenerationContext);
- var contextTypes = GetRegisteredTypes (contextType);
- // Ensure all property types are included in the JsonSerializerContext derived class
- IEnumerable<Type> collection = contextTypes as Type [] ?? contextTypes.ToArray ();
- foreach (var type in propertyTypes)
- {
- Assert.Contains (type, collection);
- }
- // Ensure no property has the generic JsonStringEnumConverter<>
- EnsureNoSpecifiedConverters (properties, new [] { typeof (JsonStringEnumConverter<>) });
- // Ensure no property has the type RuneJsonConverter
- EnsureNoSpecifiedConverters (properties, new [] { typeof (RuneJsonConverter) });
- // Ensure no property has the type KeyJsonConverter
- EnsureNoSpecifiedConverters (properties, new [] { typeof (KeyJsonConverter) });
- // Find all classes with the JsonConverter attribute of type ScopeJsonConverter<>
- var classesWithScopeJsonConverter = types.Where (t =>
- t.GetCustomAttributes (typeof (JsonConverterAttribute), false)
- .Any (attr => ((JsonConverterAttribute)attr).ConverterType!.IsGenericType &&
- ((JsonConverterAttribute)attr).ConverterType!.GetGenericTypeDefinition () == typeof (ScopeJsonConverter<>)));
- // Ensure all these classes are included in the JsonSerializerContext derived class
- foreach (var type in classesWithScopeJsonConverter)
- {
- Assert.Contains (type, collection);
- }
- }
- private static IEnumerable<Type> GetRegisteredTypes (Type contextType)
- {
- // Use reflection to find which types are registered in the JsonSerializerContext
- var registeredTypes = new List<Type> ();
- var properties = contextType.GetProperties (BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance);
- foreach (var property in properties)
- {
- if (property.PropertyType.IsGenericType &&
- property.PropertyType.GetGenericTypeDefinition () == typeof (JsonTypeInfo<>))
- {
- registeredTypes.Add (property.PropertyType.GetGenericArguments () [0]);
- }
- }
- return registeredTypes.Distinct ();
- }
- private static void EnsureNoSpecifiedConverters (List<PropertyInfo> properties, IEnumerable<Type> converterTypes)
- {
- // Ensure no property has any of the specified converter types
- foreach (var property in properties)
- {
- var jsonConverterAttributes = property.GetCustomAttributes (typeof (JsonConverterAttribute), false)
- .Cast<JsonConverterAttribute> ();
- foreach (var attribute in jsonConverterAttributes)
- {
- foreach (var converterType in converterTypes)
- {
- if (attribute.ConverterType!.IsGenericType &&
- attribute.ConverterType.GetGenericTypeDefinition () == converterType)
- {
- Assert.Fail ($"Property '{property.Name}' should not use the converter '{converterType.Name}'.");
- }
- if (!attribute.ConverterType!.IsGenericType &&
- attribute.ConverterType == converterType)
- {
- Assert.Fail ($"Property '{property.Name}' should not use the converter '{converterType.Name}'.");
- }
- }
- }
- }
- }
- }
|