Skip to content

Commit c625ea6

Browse files
committed
Add tests for JsonWriter
1 parent e8d1ea2 commit c625ea6

3 files changed

Lines changed: 221 additions & 0 deletions

File tree

Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
// Copyright (c) Tunnel Vision Laboratories, LLC. All Rights Reserved.
2+
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
3+
4+
namespace StyleCop.Analyzers.Test.LightJson.Serialization
5+
{
6+
using System;
7+
using global::LightJson;
8+
using global::LightJson.Serialization;
9+
using Xunit;
10+
11+
public class JsonWriterTests
12+
{
13+
[Fact]
14+
public void TestConstructor()
15+
{
16+
var writer = new JsonWriter();
17+
var writerNotPretty = new JsonWriter(pretty: false);
18+
var writerPretty = new JsonWriter(pretty: true);
19+
20+
Assert.True(string.IsNullOrEmpty(writer.IndentString));
21+
Assert.True(string.IsNullOrEmpty(writer.SpacingString));
22+
Assert.True(string.IsNullOrEmpty(writer.NewLineString));
23+
Assert.False(writer.SortObjects);
24+
25+
Assert.Equal(writer.IndentString, writerNotPretty.IndentString);
26+
Assert.Equal(writer.SpacingString, writerNotPretty.SpacingString);
27+
Assert.Equal(writer.NewLineString, writerNotPretty.NewLineString);
28+
Assert.Equal(writer.SortObjects, writerNotPretty.SortObjects);
29+
30+
Assert.Equal("\t", writerPretty.IndentString);
31+
Assert.Equal(" ", writerPretty.SpacingString);
32+
Assert.Equal("\n", writerPretty.NewLineString);
33+
Assert.False(writerPretty.SortObjects);
34+
}
35+
36+
[Fact]
37+
public void TestSimpleSerialization()
38+
{
39+
var writer = new JsonWriter();
40+
Assert.Equal("null", writer.Serialize(JsonValue.Null));
41+
Assert.Equal("true", writer.Serialize(true));
42+
Assert.Equal("1.5", writer.Serialize(1.5));
43+
Assert.Equal("1", writer.Serialize(1));
44+
Assert.Equal("\"text\"", writer.Serialize("text"));
45+
Assert.Equal("{}", writer.Serialize(new JsonObject()));
46+
Assert.Equal("[]", writer.Serialize(new JsonArray()));
47+
}
48+
49+
[Fact]
50+
public void TestCircularReference()
51+
{
52+
var obj = new JsonObject();
53+
obj["x"] = obj;
54+
55+
var writer = new JsonWriter();
56+
var ex = Assert.ThrowsAny<JsonSerializationException>(() => writer.Serialize(obj));
57+
Assert.Equal(JsonSerializationException.ErrorType.CircularReference, ex.Type);
58+
}
59+
60+
[Fact]
61+
public void TestEscapeSequences()
62+
{
63+
var writer = new JsonWriter();
64+
Assert.Equal("\"\\\"\"", writer.Serialize("\""));
65+
Assert.Equal("\"\\\\\"", writer.Serialize("\\"));
66+
Assert.Equal("\"\\/\"", writer.Serialize("/"));
67+
Assert.Equal("\"\\b\"", writer.Serialize("\b"));
68+
Assert.Equal("\"\\f\"", writer.Serialize("\f"));
69+
Assert.Equal("\"\\n\"", writer.Serialize("\n"));
70+
Assert.Equal("\"\\r\"", writer.Serialize("\r"));
71+
Assert.Equal("\"\\t\"", writer.Serialize("\t"));
72+
73+
// The result is not converted to an escape sequence
74+
Assert.Equal("\"\u0123\u4567\u89AB\uCDEF\"", writer.Serialize("\u0123\u4567\u89AB\uCDEF"));
75+
}
76+
77+
[Fact]
78+
public void TestWriteObject()
79+
{
80+
var obj = new JsonObject
81+
{
82+
["a"] = "valueA",
83+
["b"] = new JsonObject
84+
{
85+
["x"] = 0,
86+
["y"] = JsonValue.Null,
87+
["z"] = new JsonObject(),
88+
},
89+
["c"] = 3,
90+
};
91+
92+
var writer = new JsonWriter { SortObjects = true };
93+
Assert.Equal("{\"a\":\"valueA\",\"b\":{\"x\":0,\"y\":null,\"z\":{}},\"c\":3}", writer.Serialize(obj));
94+
}
95+
96+
[Theory]
97+
[InlineData("\t", " ", "\n")]
98+
[InlineData(" ", "", "\r\n")]
99+
public void TestWriteObjectPretty(string indent, string space, string newline)
100+
{
101+
var obj = new JsonObject
102+
{
103+
["a"] = "valueA",
104+
["b"] = new JsonObject
105+
{
106+
["x"] = 0,
107+
["y"] = JsonValue.Null,
108+
["z"] = new JsonObject(),
109+
},
110+
["c"] = 3,
111+
};
112+
113+
var writer = new JsonWriter
114+
{
115+
IndentString = indent,
116+
SpacingString = space,
117+
NewLineString = newline,
118+
SortObjects = true,
119+
};
120+
121+
var expected =
122+
$"{{{newline}"
123+
+ $"{indent}\"a\":{space}\"valueA\",{newline}"
124+
+ $"{indent}\"b\":{space}{{{newline}"
125+
+ $"{indent}{indent}\"x\":{space}0,{newline}"
126+
+ $"{indent}{indent}\"y\":{space}null,{newline}"
127+
+ $"{indent}{indent}\"z\":{space}{{{newline}"
128+
+ $"{indent}{indent}}}{newline}"
129+
+ $"{indent}}},{newline}"
130+
+ $"{indent}\"c\":{space}3{newline}"
131+
+ $"}}";
132+
Assert.Equal(expected, writer.Serialize(obj));
133+
}
134+
135+
[Fact]
136+
public void TestWriteArray()
137+
{
138+
var obj = new JsonArray
139+
{
140+
"valueA",
141+
new JsonArray
142+
{
143+
0,
144+
JsonValue.Null,
145+
new JsonArray(),
146+
},
147+
3,
148+
};
149+
150+
var writer = new JsonWriter { SortObjects = true };
151+
Assert.Equal("[\"valueA\",[0,null,[]],3]", writer.Serialize(obj));
152+
}
153+
154+
[Theory]
155+
[InlineData("\t", "\n")]
156+
[InlineData(" ", "\r\n")]
157+
public void TestWriteArrayPretty(string indent, string newline)
158+
{
159+
var obj = new JsonArray
160+
{
161+
"valueA",
162+
new JsonArray
163+
{
164+
0,
165+
JsonValue.Null,
166+
new JsonArray(),
167+
},
168+
3,
169+
};
170+
171+
var writer = new JsonWriter
172+
{
173+
IndentString = indent,
174+
NewLineString = newline,
175+
SortObjects = true,
176+
};
177+
178+
var expected =
179+
$"[{newline}"
180+
+ $"{indent}\"valueA\",{newline}"
181+
+ $"{indent}[{newline}"
182+
+ $"{indent}{indent}0,{newline}"
183+
+ $"{indent}{indent}null,{newline}"
184+
+ $"{indent}{indent}[{newline}"
185+
+ $"{indent}{indent}]{newline}"
186+
+ $"{indent}],{newline}"
187+
+ $"{indent}3{newline}"
188+
+ $"]";
189+
Assert.Equal(expected, writer.Serialize(obj));
190+
}
191+
192+
[Fact]
193+
public void TestDispose()
194+
{
195+
var writer = new JsonWriter();
196+
writer.Dispose();
197+
writer.Dispose(); // Disposing multiple times is allowed
198+
199+
writer = new JsonWriter();
200+
writer.Serialize(1);
201+
writer.Dispose();
202+
writer.Dispose();
203+
}
204+
205+
[Fact]
206+
public void TestUnsortedEnumerator()
207+
{
208+
// Use an object with only one possible ordering for this test
209+
var obj = new JsonObject { ["x"] = 3 };
210+
var writer = new JsonWriter { SortObjects = false };
211+
Assert.Equal("{\"x\":3}", writer.Serialize(obj));
212+
}
213+
}
214+
}

StyleCop.Analyzers/StyleCop.Analyzers.Test/StyleCop.Analyzers.Test.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@
239239
<Compile Include="LightJson\JsonObjectTests.cs" />
240240
<Compile Include="LightJson\JsonValueTests.cs" />
241241
<Compile Include="LightJson\Serialization\JsonReaderTests.cs" />
242+
<Compile Include="LightJson\Serialization\JsonWriterTests.cs" />
242243
<Compile Include="LightJson\Serialization\TextScannerTests.cs" />
243244
<Compile Include="Lightup\AccessorDeclarationSyntaxExtensionsTests.cs" />
244245
<Compile Include="Lightup\AutoWrapSeparatedSyntaxListTests.cs" />

StyleCop.Analyzers/StyleCop.Analyzers/LightJson/Serialization/JsonWriter.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,12 @@ private void RemoveRenderingCollection(IEnumerable<JsonValue> value)
255255

256256
private void Render(JsonValue value)
257257
{
258+
if (this.isNewLine)
259+
{
260+
this.isNewLine = false;
261+
this.WriteIndentation();
262+
}
263+
258264
switch (value.Type)
259265
{
260266
case JsonValueType.Null:

0 commit comments

Comments
 (0)