You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

OptionalConverterTests.cs 4.5 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. using System.Text.Json;
  2. using System.Text.Json.Serialization;
  3. using Xunit;
  4. using Discord.Serialization;
  5. namespace Discord.Tests.Unit.Serialization
  6. {
  7. public class OptionalConverterTests
  8. {
  9. private readonly JsonSerializerOptions _jsonOptions;
  10. public OptionalConverterTests()
  11. {
  12. _jsonOptions = new JsonSerializerOptions();
  13. _jsonOptions.Converters.Add(new OptionalConverter());
  14. }
  15. public class SampleOptionalClass
  16. {
  17. [JsonPropertyName("optional_number")]
  18. public Optional<int> OptionalNumber { get; set; }
  19. [JsonPropertyName("required_number")]
  20. public int RequiredNumber { get; set; }
  21. public override bool Equals(object obj)
  22. => (obj is SampleOptionalClass other) && (other.OptionalNumber == OptionalNumber && other.RequiredNumber == RequiredNumber);
  23. public override int GetHashCode()
  24. => OptionalNumber.GetHashCode() ^ RequiredNumber.GetHashCode();
  25. }
  26. private string expectedOptionalUnset = "{\"optional_number\":null,\"required_number\":10}";
  27. private SampleOptionalClass withOptionalUnset = new SampleOptionalClass
  28. {
  29. OptionalNumber = Optional<int>.Unspecified,
  30. RequiredNumber = 10,
  31. };
  32. private string expectedOptionalSet = "{\"optional_number\":11,\"required_number\":10}";
  33. private SampleOptionalClass withOptionalSet = new SampleOptionalClass
  34. {
  35. OptionalNumber = new Optional<int>(11),
  36. RequiredNumber = 10,
  37. };
  38. [Fact]
  39. public void OptionalConverter_Can_Write()
  40. {
  41. // todo: is STJ deterministic in writing order? want to make sure this test doesn't fail because of cosmic rays
  42. var unsetString = JsonSerializer.Serialize(withOptionalUnset, _jsonOptions);
  43. Assert.Equal(expectedOptionalUnset, unsetString);
  44. var setString = JsonSerializer.Serialize(withOptionalSet, _jsonOptions);
  45. Assert.Equal(expectedOptionalSet, setString);
  46. }
  47. [Fact]
  48. public void OptionalConverter_Can_Read()
  49. {
  50. var unset = JsonSerializer.Deserialize<SampleOptionalClass>(expectedOptionalUnset, _jsonOptions);
  51. Assert.Equal(withOptionalUnset, unset);
  52. var set = JsonSerializer.Deserialize<SampleOptionalClass>(expectedOptionalSet, _jsonOptions);
  53. Assert.Equal(withOptionalSet, set);
  54. }
  55. public class NestedPoco
  56. {
  57. [JsonPropertyName("name")]
  58. public string Name { get; set; }
  59. [JsonPropertyName("age")]
  60. public int Age { get; set; }
  61. public override bool Equals(object obj)
  62. => (obj is NestedPoco other) && (Name == other.Name && Age == other.Age);
  63. public override int GetHashCode()
  64. => Name.GetHashCode() ^ Age.GetHashCode();
  65. }
  66. public class NestedSampleClass
  67. {
  68. [JsonPropertyName("nested")]
  69. public Optional<NestedPoco> Nested { get; set; }
  70. }
  71. private string expectedNestedWithUnset = "{\"nested\":null}";
  72. private NestedSampleClass nestedWithUnset = new NestedSampleClass
  73. {
  74. Nested = Optional<NestedPoco>.Unspecified
  75. };
  76. private string expectedNestedWithSet = "{\"nested\":{\"name\":\"Ashley\",\"age\":23}}";
  77. private NestedSampleClass nestedWithSet = new NestedSampleClass
  78. {
  79. Nested = new Optional<NestedPoco>(new NestedPoco
  80. {
  81. Name = "Ashley",
  82. Age = 23
  83. }),
  84. };
  85. [Fact]
  86. public void OptionalConverter_Can_Write_Nested_Poco()
  87. {
  88. var unset = JsonSerializer.Serialize(nestedWithUnset, _jsonOptions);
  89. Assert.Equal(expectedNestedWithUnset, unset);
  90. var set = JsonSerializer.Serialize(nestedWithSet, _jsonOptions);
  91. Assert.Equal(expectedNestedWithSet, set);
  92. }
  93. [Fact]
  94. public void OptionalConverter_Can_Read_Nested_Poco()
  95. {
  96. var unset = JsonSerializer.Deserialize<NestedSampleClass>(expectedNestedWithUnset, _jsonOptions);
  97. Assert.Equal(nestedWithUnset.Nested, unset.Nested);
  98. var set = JsonSerializer.Deserialize<NestedSampleClass>(expectedNestedWithSet, _jsonOptions);
  99. Assert.Equal(nestedWithSet.Nested, set.Nested);
  100. }
  101. }
  102. }