diff --git a/app/Tests/Serialization/JsonOptionsResolverTests.cs b/app/Tests/Serialization/JsonOptionsResolverTests.cs new file mode 100644 index 000000000..5403f894d --- /dev/null +++ b/app/Tests/Serialization/JsonOptionsResolverTests.cs @@ -0,0 +1,49 @@ +using System.Text.Json; +using System.Text.Json.Serialization; + +using AIStudio.TrimSmokeTest; + +namespace AIStudio.Tests.Serialization; + +/// +/// Checks that all options of the app get their contracts from source generation, never from reflection. +/// +/// +/// MWAIS0015 refuses options without a TypeInfoResolver while compiling, but cannot tell what the resolver does. +/// Only contexts throw for a type they do not know. Any other resolver, e.g., a DefaultJsonTypeInfoResolver which +/// a helper adds to the chain, builds the missing contract by reflection instead, and in a published build, the +/// code it needs for that may be gone. +/// +[TestFixture] +public sealed class JsonOptionsResolverTests +{ + private static IEnumerable AllOptions() + { + TestHost.PrepareStaticState(); + return AppJsonOptions.FindAll().Select(options => new TestCaseData(options.Value).SetArgDisplayNames(options.Key)); + } + + [TestCaseSource(nameof(AllOptions))] + public void TheOptionsResolveWithContextsOnly(JsonSerializerOptions options) + { + using (Assert.EnterMultipleScope()) + { + Assert.That(options.TypeInfoResolverChain, Is.Not.Empty); + Assert.That(options.TypeInfoResolverChain, Is.All.InstanceOf()); + } + } + + [Test] + public void FieldsAndPropertiesOfTheAppAreFound() + { + TestHost.PrepareStaticState(); + var names = AppJsonOptions.FindAll().Keys.ToList(); + + using (Assert.EnterMultipleScope()) + { + Assert.That(names, Does.Contain("SettingsManager.JSON_OPTIONS")); + Assert.That(names, Does.Contain("VisualBriefingJson.Canonical")); + Assert.That(names, Has.None.Contains("k__BackingField")); + } + } +} \ No newline at end of file diff --git a/app/Tests/Tests.csproj b/app/Tests/Tests.csproj index 5277865b1..ee96038d5 100644 --- a/app/Tests/Tests.csproj +++ b/app/Tests/Tests.csproj @@ -45,6 +45,13 @@ + + + + +