using System.Collections.Generic; using System.Linq; using Robust.Shared.Reflection; using Robust.Shared.Serialization.Manager; using Robust.Shared.Serialization.Manager.Attributes; using Robust.Shared.Serialization.Markdown.Value; namespace Content.IntegrationTests.Tests.Serialization; [TestFixture] public sealed partial class SerializationTest { /// /// Check that serializing generic enums works as intended. This should really be in engine, but engine /// integrations tests block reflection and I am lazy.. /// [Test] public async Task SerializeGenericEnums() { await using var pairTracker = await PoolManager.GetServerClient(); var server = pairTracker.Pair.Server; var seriMan = server.ResolveDependency(); var refMan = server.ResolveDependency(); Enum value = TestEnum.Bb; var node = seriMan.WriteValue(value, notNullableOverride:true); var valueNode = node as ValueDataNode; Assert.NotNull(valueNode); var expected = refMan.GetEnumReference(value); Assert.That(valueNode!.Value, Is.EqualTo(expected)); var errors = seriMan.ValidateNode(valueNode).GetErrors(); Assert.That(errors.Any(), Is.False); var deserialized = seriMan.Read(node, notNullableOverride:true); Assert.That(deserialized, Is.EqualTo(value)); // Repeat test with enums in a data definitions. var data = new TestData { Value = TestEnum.Cc, Sequence = new() {TestEnum.Dd, TestEnum.Aa} }; node = seriMan.WriteValue(data, notNullableOverride:true); errors = seriMan.ValidateNode(node).GetErrors(); Assert.That(errors.Any(), Is.False); var deserializedData = seriMan.Read(node, notNullableOverride:false); Assert.That(deserializedData.Value, Is.EqualTo(data.Value)); Assert.That(deserializedData.Sequence.Count, Is.EqualTo(data.Sequence.Count)); Assert.That(deserializedData.Sequence[0], Is.EqualTo(data.Sequence[0])); Assert.That(deserializedData.Sequence[1], Is.EqualTo(data.Sequence[1])); // Check that Generic & non-generic serializers are incompativle. Enum genericValue = TestEnum.Bb; TestEnum typedValue = TestEnum.Bb; var genericNode = seriMan.WriteValue(genericValue, notNullableOverride:true); var typedNode = seriMan.WriteValue(typedValue); Assert.That(seriMan.ValidateNode(genericNode).GetErrors().Any(), Is.False); Assert.That(seriMan.ValidateNode(genericNode).GetErrors().Any(), Is.True); Assert.That(seriMan.ValidateNode(typedNode).GetErrors().Any(), Is.True); Assert.That(seriMan.ValidateNode(typedNode).GetErrors().Any(), Is.False); await pairTracker.CleanReturnAsync(); } private enum TestEnum : byte { Aa, Bb, Cc, Dd } [DataDefinition] private sealed partial class TestData { [DataField("value")] public Enum Value = default!; [DataField("sequence")] public List Sequence = default!; } }