1
0

SerializationTest.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using Robust.Shared.Reflection;
  4. using Robust.Shared.Serialization.Manager;
  5. using Robust.Shared.Serialization.Manager.Attributes;
  6. using Robust.Shared.Serialization.Markdown.Value;
  7. namespace Content.IntegrationTests.Tests.Serialization;
  8. [TestFixture]
  9. public sealed partial class SerializationTest
  10. {
  11. /// <summary>
  12. /// Check that serializing generic enums works as intended. This should really be in engine, but engine
  13. /// integrations tests block reflection and I am lazy..
  14. /// </summary>
  15. [Test]
  16. public async Task SerializeGenericEnums()
  17. {
  18. await using var pair = await PoolManager.GetServerClient();
  19. var server = pair.Server;
  20. var seriMan = server.ResolveDependency<ISerializationManager>();
  21. var refMan = server.ResolveDependency<IReflectionManager>();
  22. Enum value = TestEnum.Bb;
  23. var node = seriMan.WriteValue(value, notNullableOverride: true);
  24. var valueNode = node as ValueDataNode;
  25. Assert.That(valueNode, Is.Not.Null);
  26. var expected = refMan.GetEnumReference(value);
  27. Assert.That(valueNode!.Value, Is.EqualTo(expected));
  28. var errors = seriMan.ValidateNode<Enum>(valueNode).GetErrors();
  29. Assert.That(errors.Any(), Is.False);
  30. var deserialized = seriMan.Read<Enum>(node, notNullableOverride: true);
  31. Assert.That(deserialized, Is.EqualTo(value));
  32. // Repeat test with enums in a data definitions.
  33. var data = new TestData
  34. {
  35. Value = TestEnum.Cc,
  36. Sequence = [TestEnum.Dd, TestEnum.Aa]
  37. };
  38. node = seriMan.WriteValue(data, notNullableOverride: true);
  39. errors = seriMan.ValidateNode<TestData>(node).GetErrors();
  40. Assert.That(errors.Any(), Is.False);
  41. var deserializedData = seriMan.Read<TestData>(node, notNullableOverride: false);
  42. Assert.That(deserializedData.Value, Is.EqualTo(data.Value));
  43. Assert.That(deserializedData.Sequence.Count, Is.EqualTo(data.Sequence.Count));
  44. Assert.That(deserializedData.Sequence[0], Is.EqualTo(data.Sequence[0]));
  45. Assert.That(deserializedData.Sequence[1], Is.EqualTo(data.Sequence[1]));
  46. // Check that Generic & non-generic serializers are incompativle.
  47. Enum genericValue = TestEnum.Bb;
  48. TestEnum typedValue = TestEnum.Bb;
  49. var genericNode = seriMan.WriteValue(genericValue, notNullableOverride: true);
  50. var typedNode = seriMan.WriteValue(typedValue);
  51. Assert.That(seriMan.ValidateNode<Enum>(genericNode).GetErrors().Any(), Is.False);
  52. Assert.That(seriMan.ValidateNode<TestEnum>(genericNode).GetErrors().Any(), Is.True);
  53. Assert.That(seriMan.ValidateNode<Enum>(typedNode).GetErrors().Any(), Is.True);
  54. Assert.That(seriMan.ValidateNode<TestEnum>(typedNode).GetErrors().Any(), Is.False);
  55. await pair.CleanReturnAsync();
  56. }
  57. private enum TestEnum : byte { Aa, Bb, Cc, Dd }
  58. [DataDefinition]
  59. private sealed partial class TestData
  60. {
  61. [DataField] public Enum Value = default!;
  62. [DataField] public List<Enum> Sequence = default!;
  63. }
  64. }