JsonSerializerTests.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. using Jint.Native;
  2. using Jint.Native.Json;
  3. namespace Jint.Tests.Runtime;
  4. public class JsonSerializerTests
  5. {
  6. [Fact]
  7. public void CanStringifyBasicTypes()
  8. {
  9. using var engine = new Engine();
  10. var serializer = new JsonSerializer(engine);
  11. Assert.Equal("null", serializer.Serialize(JsValue.Null).ToString());
  12. Assert.Equal("true", serializer.Serialize(JsBoolean.True).ToString());
  13. Assert.Equal("false", serializer.Serialize(JsBoolean.False).ToString());
  14. Assert.Equal("\"\"", serializer.Serialize(new JsString("")).ToString());
  15. Assert.Equal("\"abc\"", serializer.Serialize(new JsString("abc")).ToString());
  16. Assert.Equal("1", serializer.Serialize(new JsNumber(1)).ToString());
  17. Assert.Equal("0.5", serializer.Serialize(new JsNumber(0.5)).ToString());
  18. Assert.Equal("{}", serializer.Serialize(new JsObject(engine)).ToString());
  19. Assert.Equal("[]", serializer.Serialize(new JsArray(engine)).ToString());
  20. Assert.Same(JsValue.Undefined, serializer.Serialize(JsValue.Undefined));
  21. }
  22. [Fact]
  23. public void EmptyObjectHasNoLineBreakWithSpaceDefined()
  24. {
  25. using var engine = new Engine();
  26. var serializer = new JsonSerializer(engine);
  27. Assert.Equal("{}", serializer.Serialize(new JsObject(engine), JsValue.Undefined, new JsString(" ")).ToString());
  28. }
  29. [Fact]
  30. public void EmptyArrayHasNoLineBreakWithSpaceDefined()
  31. {
  32. using var engine = new Engine();
  33. var serializer = new JsonSerializer(engine);
  34. Assert.Equal("[]", serializer.Serialize(new JsArray(engine), JsValue.Undefined, new JsString(" ")).ToString());
  35. }
  36. [Fact]
  37. public void StringCharactersGetEscaped()
  38. {
  39. using var engine = new Engine();
  40. var serializer = new JsonSerializer(engine);
  41. string actual = serializer.Serialize(new JsString("\"\\\t\r\n\f\r\b\ud834")).ToString();
  42. Assert.Equal("\"\\\"\\\\\\t\\r\\n\\f\\r\\b\\ud834\"", actual);
  43. }
  44. [Fact]
  45. public void JsonStringOutputIsIndentedWhenSpacerDefined()
  46. {
  47. using var engine = new Engine();
  48. var serializer = new JsonSerializer(engine);
  49. JsObject instance = new JsObject(engine);
  50. instance["a"] = "b";
  51. instance["b"] = 2;
  52. instance["c"] = new JsArray(engine, new JsValue[] { new JsNumber(4), new JsNumber(5), new JsNumber(6) });
  53. instance["d"] = true;
  54. string actual = serializer.Serialize(instance, JsValue.Undefined, new JsNumber(2)).ToString();
  55. Assert.Equal("{\n \"a\": \"b\",\n \"b\": 2,\n \"c\": [\n 4,\n 5,\n 6\n ],\n \"d\": true\n}", actual);
  56. }
  57. [Fact]
  58. public void JsonStringOutputIsCompactWithoutSpacer()
  59. {
  60. using var engine = new Engine();
  61. var serializer = new JsonSerializer(engine);
  62. JsObject instance = new JsObject(engine);
  63. instance["a"] = "b";
  64. instance["b"] = 2;
  65. instance["c"] = new JsArray(engine, new JsValue[] { new JsNumber(4), new JsNumber(5), new JsNumber(6) });
  66. instance["d"] = true;
  67. string actual = serializer.Serialize(instance, JsValue.Undefined, JsValue.Undefined).ToString();
  68. Assert.Equal("{\"a\":\"b\",\"b\":2,\"c\":[4,5,6],\"d\":true}", actual);
  69. }
  70. [Fact]
  71. public void ArrayWithUndefinedWillBeNull()
  72. {
  73. using var engine = new Engine();
  74. var serializer = new JsonSerializer(engine);
  75. JsArray array = new JsArray(engine, new JsValue[] { JsValue.Undefined, new JsNumber(42) });
  76. string actual = serializer.Serialize(array, JsValue.Undefined, JsValue.Undefined).ToString();
  77. Assert.Equal("[null,42]", actual);
  78. }
  79. [Fact]
  80. public void ObjectPropertyWithUndefinedWillBeSkipped()
  81. {
  82. using var engine = new Engine();
  83. var serializer = new JsonSerializer(engine);
  84. JsObject instance = new JsObject(engine);
  85. instance["a"] = JsValue.Undefined;
  86. instance["b"] = 42;
  87. string actual = serializer.Serialize(instance, JsValue.Undefined, JsValue.Undefined).ToString();
  88. Assert.Equal("{\"b\":42}", actual);
  89. }
  90. [Fact]
  91. public void NonStringObjectKeyWillSerializedAsString()
  92. {
  93. using var engine = new Engine();
  94. var serializer = new JsonSerializer(engine);
  95. JsObject instance = new JsObject(engine);
  96. instance[JsValue.Undefined] = 10;
  97. instance[JsValue.Null] = 21;
  98. instance[new JsNumber(10)] = 42;
  99. string actual = serializer.Serialize(instance, JsValue.Undefined, JsValue.Undefined).ToString();
  100. Assert.Equal("{\"10\":42,\"undefined\":10,\"null\":21}", actual);
  101. }
  102. [Fact]
  103. public void InfinityAndNaNGetsSerializedAsNull()
  104. {
  105. using var engine = new Engine();
  106. var serializer = new JsonSerializer(engine);
  107. JsArray array = new JsArray(engine, new JsValue[] { JsNumber.DoubleNegativeInfinity, JsNumber.DoublePositiveInfinity, JsNumber.DoubleNaN });
  108. string actual = serializer.Serialize(array, JsValue.Undefined, JsValue.Undefined).ToString();
  109. Assert.Equal("[null,null,null]", actual);
  110. }
  111. [Fact]
  112. public void ArrayAsReplacedDictatesPropertiesToSerializer()
  113. {
  114. using var engine = new Engine();
  115. var serializer = new JsonSerializer(engine);
  116. JsObject instance = new JsObject(engine);
  117. instance["a"] = 21;
  118. instance["b"] = 42;
  119. JsValue replacer = new JsArray(engine, new JsValue[] { new JsString("b"), new JsString("z") });
  120. string actual = serializer.Serialize(instance, replacer, JsValue.Undefined).ToString();
  121. Assert.Equal("{\"b\":42}", actual);
  122. }
  123. [Theory]
  124. [InlineData("test123\n456", "\"test123\\n456\"")]
  125. [InlineData("test123456\n", "\"test123456\\n\"")]
  126. [InlineData("\u0002test\u0002", "\"\\u0002test\\u0002\"")]
  127. [InlineData("\u0002tes\tt\u0002", "\"\\u0002tes\\tt\\u0002\"")]
  128. [InlineData("t\u0002est\u0002", "\"t\\u0002est\\u0002\"")]
  129. [InlineData("test😀123456\n", "\"test😀123456\\n\"")]
  130. public void JsonStringEncodingFormatsContentCorrectly(string inputString, string expectedOutput)
  131. {
  132. using var engine = new Engine();
  133. var serializer = new JsonSerializer(engine);
  134. string actual = serializer.Serialize(new JsString(inputString)).ToString();
  135. Assert.Equal(expectedOutput, actual);
  136. }
  137. }