JsonSerializerTests.cs 6.8 KB

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