2
0

JsonDefaultStringEnumConverterTests.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. using System.Text.Json;
  2. using Jellyfin.Data.Enums;
  3. using Jellyfin.Extensions.Json.Converters;
  4. using Xunit;
  5. namespace Jellyfin.Extensions.Tests.Json.Converters;
  6. public class JsonDefaultStringEnumConverterTests
  7. {
  8. private readonly JsonSerializerOptions _jsonOptions = new() { Converters = { new JsonDefaultStringEnumConverterFactory() } };
  9. /// <summary>
  10. /// Test to ensure that `null` and empty string are deserialized to the default value.
  11. /// </summary>
  12. /// <param name="input">The input string.</param>
  13. /// <param name="output">The expected enum value.</param>
  14. [Theory]
  15. [InlineData("\"\"", MediaStreamProtocol.http)]
  16. [InlineData("\"Http\"", MediaStreamProtocol.http)]
  17. [InlineData("\"Hls\"", MediaStreamProtocol.hls)]
  18. public void Deserialize_Enum_Direct(string input, MediaStreamProtocol output)
  19. {
  20. var value = JsonSerializer.Deserialize<MediaStreamProtocol>(input, _jsonOptions);
  21. Assert.Equal(output, value);
  22. }
  23. /// <summary>
  24. /// Test to ensure that `null` and empty string are deserialized to the default value.
  25. /// </summary>
  26. /// <param name="input">The input string.</param>
  27. /// <param name="output">The expected enum value.</param>
  28. [Theory]
  29. [InlineData(null, MediaStreamProtocol.http)]
  30. [InlineData("\"\"", MediaStreamProtocol.http)]
  31. [InlineData("\"Http\"", MediaStreamProtocol.http)]
  32. [InlineData("\"Hls\"", MediaStreamProtocol.hls)]
  33. public void Deserialize_Enum(string? input, MediaStreamProtocol output)
  34. {
  35. input ??= "null";
  36. var json = $"{{ \"EnumValue\": {input} }}";
  37. var value = JsonSerializer.Deserialize<TestClass>(json, _jsonOptions);
  38. Assert.NotNull(value);
  39. Assert.Equal(output, value.EnumValue);
  40. }
  41. /// <summary>
  42. /// Test to ensure that empty string is deserialized to the default value,
  43. /// and `null` is deserialized to `null`.
  44. /// </summary>
  45. /// <param name="input">The input string.</param>
  46. /// <param name="output">The expected enum value.</param>
  47. [Theory]
  48. [InlineData(null, null)]
  49. [InlineData("\"\"", MediaStreamProtocol.http)]
  50. [InlineData("\"Http\"", MediaStreamProtocol.http)]
  51. [InlineData("\"Hls\"", MediaStreamProtocol.hls)]
  52. public void Deserialize_Enum_Nullable(string? input, MediaStreamProtocol? output)
  53. {
  54. input ??= "null";
  55. var json = $"{{ \"EnumValue\": {input} }}";
  56. var value = JsonSerializer.Deserialize<NullTestClass>(json, _jsonOptions);
  57. Assert.NotNull(value);
  58. Assert.Equal(output, value.EnumValue);
  59. }
  60. /// <summary>
  61. /// Ensures that the roundtrip serialization & deserialization is successful.
  62. /// </summary>
  63. /// <param name="input">Input enum.</param>
  64. /// <param name="output">Output enum.</param>
  65. [Theory]
  66. [InlineData(MediaStreamProtocol.http, MediaStreamProtocol.http)]
  67. [InlineData(MediaStreamProtocol.hls, MediaStreamProtocol.hls)]
  68. public void Enum_RoundTrip(MediaStreamProtocol input, MediaStreamProtocol output)
  69. {
  70. var inputObj = new TestClass { EnumValue = input };
  71. var outputObj = JsonSerializer.Deserialize<TestClass>(JsonSerializer.Serialize(inputObj, _jsonOptions), _jsonOptions);
  72. Assert.NotNull(outputObj);
  73. Assert.Equal(output, outputObj.EnumValue);
  74. }
  75. /// <summary>
  76. /// Ensures that the roundtrip serialization & deserialization is successful, including null.
  77. /// </summary>
  78. /// <param name="input">Input enum.</param>
  79. /// <param name="output">Output enum.</param>
  80. [Theory]
  81. [InlineData(MediaStreamProtocol.http, MediaStreamProtocol.http)]
  82. [InlineData(MediaStreamProtocol.hls, MediaStreamProtocol.hls)]
  83. [InlineData(null, null)]
  84. public void Enum_RoundTrip_Nullable(MediaStreamProtocol? input, MediaStreamProtocol? output)
  85. {
  86. var inputObj = new NullTestClass { EnumValue = input };
  87. var outputObj = JsonSerializer.Deserialize<NullTestClass>(JsonSerializer.Serialize(inputObj, _jsonOptions), _jsonOptions);
  88. Assert.NotNull(outputObj);
  89. Assert.Equal(output, outputObj.EnumValue);
  90. }
  91. private sealed class TestClass
  92. {
  93. public MediaStreamProtocol EnumValue { get; set; }
  94. }
  95. private sealed class NullTestClass
  96. {
  97. public MediaStreamProtocol? EnumValue { get; set; }
  98. }
  99. }