Skip to content

Commit 6c6f0ef

Browse files
committed
Add tests for LightJson.JsonValue
* Remove unnecessary exception handler in IsInteger * Fix GetHashCode for number and boolean types * Fix failure to parse a number with JsonValue.Parse * Fix Equals handling of unrelated non-null types
1 parent b328def commit 6c6f0ef

5 files changed

Lines changed: 368 additions & 18 deletions

File tree

Lines changed: 334 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,334 @@
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
5+
{
6+
using System;
7+
using global::LightJson;
8+
using global::LightJson.Serialization;
9+
using Xunit;
10+
11+
public class JsonValueTests
12+
{
13+
[Fact]
14+
public void TestJsonValueConstructors()
15+
{
16+
// JsonValue(bool?)
17+
Assert.True(new JsonValue(true).IsBoolean);
18+
Assert.True(new JsonValue(true).AsBoolean);
19+
Assert.True(new JsonValue(false).IsBoolean);
20+
Assert.False(new JsonValue(false).AsBoolean);
21+
Assert.True(new JsonValue(default(bool?)).IsNull);
22+
Assert.False(new JsonValue(default(bool?)).IsBoolean);
23+
Assert.False(new JsonValue(default(bool?)).AsBoolean);
24+
25+
// JsonValue(double?)
26+
Assert.True(new JsonValue(1.0).IsNumber);
27+
Assert.Equal(1.0, new JsonValue(1.0).AsNumber);
28+
Assert.True(new JsonValue(default(double?)).IsNull);
29+
Assert.False(new JsonValue(default(double?)).IsNumber);
30+
Assert.Equal(0.0, new JsonValue(default(double?)).AsNumber);
31+
32+
// JsonValue(string)
33+
Assert.True(new JsonValue(string.Empty).IsString);
34+
Assert.True(new JsonValue("text").IsString);
35+
Assert.Equal("text", new JsonValue("text").AsString);
36+
Assert.True(new JsonValue(default(string)).IsNull);
37+
Assert.False(new JsonValue(default(string)).IsString);
38+
Assert.Null(new JsonValue(default(string)).AsString);
39+
40+
// JsonValue(JsonObject)
41+
Assert.True(new JsonValue(new JsonObject()).IsJsonObject);
42+
Assert.IsType<JsonObject>(new JsonValue(new JsonObject()).AsJsonObject);
43+
Assert.True(new JsonValue(default(JsonObject)).IsNull);
44+
Assert.False(new JsonValue(default(JsonObject)).IsJsonObject);
45+
Assert.Null(new JsonValue(default(JsonObject)).AsJsonObject);
46+
47+
// JsonValue(JsonArray)
48+
Assert.True(new JsonValue(new JsonArray()).IsJsonArray);
49+
Assert.IsType<JsonArray>(new JsonValue(new JsonArray()).AsJsonArray);
50+
Assert.True(new JsonValue(default(JsonArray)).IsNull);
51+
Assert.False(new JsonValue(default(JsonArray)).IsJsonArray);
52+
Assert.Null(new JsonValue(default(JsonArray)).AsJsonArray);
53+
}
54+
55+
[Fact]
56+
public void TestIsInteger()
57+
{
58+
Assert.False(new JsonValue(false).IsInteger);
59+
Assert.True(new JsonValue(1.0).IsInteger);
60+
Assert.False(new JsonValue(1.1).IsInteger);
61+
Assert.False(new JsonValue(double.PositiveInfinity).IsInteger);
62+
}
63+
64+
[Fact]
65+
public void TestIsDateTime()
66+
{
67+
Assert.False(new JsonValue(false).IsDateTime);
68+
Assert.False(new JsonValue("Some text").IsDateTime);
69+
Assert.True(new JsonValue(DateTime.Now.ToString("o")).IsDateTime);
70+
}
71+
72+
[Fact]
73+
public void TestAsBoolean()
74+
{
75+
Assert.False(new JsonValue(false).AsBoolean);
76+
Assert.False(new JsonValue(0.0).AsBoolean);
77+
Assert.False(new JsonValue(string.Empty).AsBoolean);
78+
Assert.False(new JsonValue(default(JsonObject)).AsBoolean);
79+
80+
Assert.True(new JsonValue(true).AsBoolean);
81+
Assert.True(new JsonValue(1.0).AsBoolean);
82+
Assert.True(new JsonValue("text").AsBoolean);
83+
Assert.True(new JsonValue(new JsonObject()).AsBoolean);
84+
Assert.True(new JsonValue(new JsonArray()).AsBoolean);
85+
}
86+
87+
[Fact]
88+
public void TestAsInteger()
89+
{
90+
Assert.Equal(int.MaxValue, new JsonValue(uint.MaxValue).AsInteger);
91+
Assert.Equal(int.MinValue, new JsonValue(long.MinValue).AsInteger);
92+
Assert.Equal(0, new JsonValue(0.5).AsInteger);
93+
Assert.Equal(1, new JsonValue(1).AsInteger);
94+
}
95+
96+
[Fact]
97+
public void TestAsNumber()
98+
{
99+
Assert.Equal(0.0, new JsonValue(false).AsNumber);
100+
Assert.Equal(1.0, new JsonValue(true).AsNumber);
101+
Assert.Equal(1.0, new JsonValue(1.0).AsNumber);
102+
Assert.Equal(1.0, new JsonValue("1.0").AsNumber);
103+
Assert.Equal(0, new JsonValue("text").AsNumber);
104+
Assert.Equal(0.0, new JsonValue(new JsonObject()).AsNumber);
105+
Assert.Equal(0.0, new JsonValue(default(JsonObject)).AsNumber);
106+
Assert.Equal(0.0, new JsonValue(new JsonArray()).AsNumber);
107+
}
108+
109+
[Fact]
110+
public void TestAsString()
111+
{
112+
Assert.Equal("false", new JsonValue(false).AsString);
113+
Assert.Equal("true", new JsonValue(true).AsString);
114+
Assert.Equal("1", new JsonValue(1.0).AsString);
115+
Assert.Equal("text", new JsonValue("text").AsString);
116+
Assert.Null(new JsonValue(new JsonObject()).AsString);
117+
Assert.Null(new JsonValue(default(JsonObject)).AsString);
118+
Assert.Null(new JsonValue(new JsonArray()).AsString);
119+
}
120+
121+
[Fact]
122+
public void TestAsJsonObject()
123+
{
124+
Assert.Null(new JsonValue(false).AsJsonObject);
125+
Assert.IsType<JsonObject>(new JsonValue(new JsonObject()).AsJsonObject);
126+
Assert.Null(new JsonValue(default(JsonObject)).AsJsonObject);
127+
}
128+
129+
[Fact]
130+
public void TestAsJsonArray()
131+
{
132+
Assert.Null(new JsonValue(false).AsJsonArray);
133+
Assert.IsType<JsonArray>(new JsonValue(new JsonArray()).AsJsonArray);
134+
Assert.Null(new JsonValue(default(JsonArray)).AsJsonArray);
135+
}
136+
137+
[Fact]
138+
public void TestAsDateTime()
139+
{
140+
Assert.Null(new JsonValue(false).AsDateTime);
141+
Assert.Null(new JsonValue("Some text").AsDateTime);
142+
143+
var now = new DateTime(2016, 1, 20, 5, 12, 33, DateTimeKind.Local);
144+
Assert.Equal(now, new JsonValue(now.ToString("o")).AsDateTime);
145+
}
146+
147+
[Fact]
148+
public void TestAsObject()
149+
{
150+
Assert.Equal(0.0, new JsonValue(false).AsObject);
151+
Assert.Equal(1.0, new JsonValue(true).AsObject);
152+
Assert.Equal(1.0, new JsonValue(1.0).AsObject);
153+
Assert.Equal("1.0", new JsonValue("1.0").AsObject);
154+
Assert.IsType<JsonObject>(new JsonValue(new JsonObject()).AsObject);
155+
Assert.IsType<JsonArray>(new JsonValue(new JsonArray()).AsObject);
156+
Assert.Null(new JsonValue(default(JsonObject)).AsObject);
157+
}
158+
159+
[Fact]
160+
public void TestStringIndexer()
161+
{
162+
Assert.ThrowsAny<InvalidOperationException>(() => new JsonValue(false)["key"]);
163+
Assert.ThrowsAny<InvalidOperationException>(() => new JsonValue(false)[null]);
164+
Assert.ThrowsAny<InvalidOperationException>(() => new JsonValue(false) { ["key"] = "value" });
165+
166+
Assert.Equal(JsonValue.Null, new JsonValue(new JsonObject())["key"]);
167+
var value = new JsonValue(new JsonObject()) { ["key"] = "value" };
168+
Assert.Equal("value", value["key"].AsString);
169+
Assert.ThrowsAny<ArgumentNullException>(() => new JsonValue(new JsonObject())[null]);
170+
}
171+
172+
[Fact]
173+
public void TestIntegerIndexer()
174+
{
175+
Assert.ThrowsAny<InvalidOperationException>(() => new JsonValue(false)[0]);
176+
Assert.ThrowsAny<InvalidOperationException>(() => new JsonValue(false)[-1]);
177+
Assert.ThrowsAny<InvalidOperationException>(() => new JsonValue(false) { [0] = "value" });
178+
179+
Assert.Equal(JsonValue.Null, new JsonValue(new JsonArray())[0]);
180+
Assert.Equal(JsonValue.Null, new JsonValue(new JsonArray())[-1]);
181+
182+
var value = new JsonValue(new JsonArray() { "initial" });
183+
Assert.Equal("initial", value[0].AsString);
184+
value[0] = "value";
185+
Assert.Equal("value", value[0].AsString);
186+
}
187+
188+
[Fact]
189+
public void TestConversionOperators()
190+
{
191+
// (JsonValue)(DateTime?)
192+
DateTime time = DateTime.Now;
193+
Assert.NotNull((JsonValue)time);
194+
Assert.Equal(time.ToString("o"), ((JsonValue)time).AsString);
195+
Assert.Equal(JsonValue.Null, (JsonValue)default(DateTime?));
196+
197+
// (int)(JsonValue)
198+
Assert.Equal(0, (int)new JsonValue(uint.MaxValue));
199+
Assert.Equal(0, (int)new JsonValue(long.MinValue));
200+
Assert.Equal(0, (int)new JsonValue(2.5));
201+
Assert.Equal(1, (int)new JsonValue(1));
202+
203+
// (int?)(JsonValue)
204+
Assert.Equal(0, (int?)new JsonValue(uint.MaxValue));
205+
Assert.Equal(0, (int?)new JsonValue(long.MinValue));
206+
Assert.Equal(0, (int?)new JsonValue(2.5));
207+
Assert.Equal(1, (int?)new JsonValue(1));
208+
Assert.Null((int?)JsonValue.Null);
209+
Assert.Null((int?)new JsonValue(default(JsonObject)));
210+
211+
// (bool)(JsonValue)
212+
Assert.False((bool)new JsonValue(false));
213+
Assert.False((bool)new JsonValue(0.0));
214+
Assert.False((bool)new JsonValue(string.Empty));
215+
Assert.False((bool)new JsonValue(default(JsonObject)));
216+
217+
Assert.True((bool)new JsonValue(true));
218+
Assert.False((bool)new JsonValue(1.0));
219+
Assert.False((bool)new JsonValue("text"));
220+
Assert.False((bool)new JsonValue(new JsonObject()));
221+
Assert.False((bool)new JsonValue(new JsonArray()));
222+
223+
// (bool?)(JsonValue)
224+
Assert.False((bool?)new JsonValue(false));
225+
Assert.False((bool?)new JsonValue(0.0));
226+
Assert.False((bool?)new JsonValue(string.Empty));
227+
228+
Assert.True((bool?)new JsonValue(true));
229+
Assert.False((bool?)new JsonValue(1.0));
230+
Assert.False((bool?)new JsonValue("text"));
231+
Assert.False((bool?)new JsonValue(new JsonObject()));
232+
Assert.False((bool?)new JsonValue(new JsonArray()));
233+
234+
Assert.Null((bool?)JsonValue.Null);
235+
Assert.Null((bool?)new JsonValue(default(JsonObject)));
236+
237+
// (double)(JsonValue)
238+
Assert.Equal(double.NaN, (double)new JsonValue(false));
239+
Assert.Equal(double.NaN, (double)new JsonValue(true));
240+
Assert.Equal(1.0, (double)new JsonValue(1.0));
241+
Assert.Equal(double.NaN, (double)new JsonValue("1.0"));
242+
Assert.Equal(double.NaN, (double)new JsonValue(new JsonObject()));
243+
Assert.Equal(double.NaN, (double)new JsonValue(new JsonArray()));
244+
Assert.Equal(double.NaN, (double)JsonValue.Null);
245+
Assert.Equal(double.NaN, (double)new JsonValue(default(JsonObject)));
246+
247+
// (double?)(JsonValue)
248+
Assert.Equal(double.NaN, (double?)new JsonValue(false));
249+
Assert.Equal(double.NaN, (double?)new JsonValue(true));
250+
Assert.Equal(1.0, (double?)new JsonValue(1.0));
251+
Assert.Equal(double.NaN, (double?)new JsonValue("1.0"));
252+
Assert.Equal(double.NaN, (double?)new JsonValue(new JsonObject()));
253+
Assert.Equal(double.NaN, (double?)new JsonValue(new JsonArray()));
254+
Assert.Null((double?)JsonValue.Null);
255+
Assert.Null((double?)new JsonValue(default(JsonObject)));
256+
257+
// (string)(JsonValue)
258+
Assert.Null((string)new JsonValue(false));
259+
Assert.Null((string)new JsonValue(true));
260+
Assert.Null((string)new JsonValue(1.0));
261+
Assert.Equal("text", (string)new JsonValue("text"));
262+
Assert.Null((string)new JsonValue(new JsonObject()));
263+
Assert.Null((string)new JsonValue(default(JsonObject)));
264+
Assert.Null((string)new JsonValue(new JsonArray()));
265+
266+
// (JsonObject)(JsonValue)
267+
Assert.Null((JsonObject)new JsonValue(false));
268+
Assert.IsType<JsonObject>((JsonObject)new JsonValue(new JsonObject()));
269+
Assert.Null((JsonObject)new JsonValue(default(JsonObject)));
270+
271+
// (JsonArray)(JsonValue)
272+
Assert.Null((JsonArray)new JsonValue(false));
273+
Assert.IsType<JsonArray>((JsonArray)new JsonValue(new JsonArray()));
274+
Assert.Null((JsonArray)new JsonValue(default(JsonArray)));
275+
276+
// (DateTime)(JsonValue)
277+
Assert.Equal(DateTime.MinValue, (DateTime)new JsonValue(false));
278+
Assert.Equal(DateTime.MinValue, (DateTime)new JsonValue("Some text"));
279+
280+
var now = new DateTime(2016, 1, 20, 5, 12, 33, DateTimeKind.Local);
281+
Assert.Equal(now, (DateTime)new JsonValue(now.ToString("o")));
282+
283+
// (DateTime?)(JsonValue)
284+
Assert.Null((DateTime?)new JsonValue(false));
285+
Assert.Null((DateTime?)new JsonValue("Some text"));
286+
Assert.Equal(now, (DateTime?)new JsonValue(now.ToString("o")));
287+
}
288+
289+
[Fact]
290+
public void TestOpInequality()
291+
{
292+
Assert.False(JsonValue.Null != default(JsonValue));
293+
Assert.True(new JsonValue(true) != new JsonValue(0));
294+
}
295+
296+
[Fact]
297+
public void TestEquals()
298+
{
299+
Assert.True(JsonValue.Null.Equals(null));
300+
Assert.True(JsonValue.Null.Equals(JsonValue.Null));
301+
Assert.True(JsonValue.Null.Equals(default(JsonValue)));
302+
303+
Assert.True(new JsonValue(true).Equals(new JsonValue(true)));
304+
Assert.False(new JsonValue(true).Equals(new JsonValue(false)));
305+
306+
Assert.False(JsonValue.Null.Equals(1));
307+
Assert.False(JsonValue.Null.Equals(new Exception()));
308+
}
309+
310+
[Fact]
311+
public void TestGetHashCode()
312+
{
313+
Assert.Equal(JsonValue.Null.GetHashCode(), default(JsonValue).GetHashCode());
314+
Assert.Equal(new JsonValue(1).GetHashCode(), new JsonValue(1).GetHashCode());
315+
Assert.Equal(new JsonValue("text").GetHashCode(), new JsonValue(new string("text".ToCharArray())).GetHashCode());
316+
}
317+
318+
[Fact]
319+
public void TestParse()
320+
{
321+
Assert.True(JsonValue.Parse("true").IsBoolean);
322+
Assert.True(JsonValue.Parse("1").IsInteger);
323+
Assert.True(JsonValue.Parse("1.0").IsInteger);
324+
Assert.True(JsonValue.Parse("1.0").IsNumber);
325+
Assert.True(JsonValue.Parse("\"text\"").IsString);
326+
Assert.True(JsonValue.Parse("null").IsNull);
327+
Assert.True(JsonValue.Parse("{}").IsJsonObject);
328+
Assert.True(JsonValue.Parse("[]").IsJsonArray);
329+
330+
Assert.ThrowsAny<JsonParseException>(() => JsonValue.Parse(string.Empty));
331+
Assert.ThrowsAny<JsonParseException>(() => JsonValue.Parse("{"));
332+
}
333+
}
334+
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@
235235
<Compile Include="LayoutRules\SA1518UnitTests.cs" />
236236
<Compile Include="LayoutRules\SA1519UnitTests.cs" />
237237
<Compile Include="LayoutRules\SA1520UnitTests.cs" />
238+
<Compile Include="LightJson\JsonValueTests.cs" />
238239
<Compile Include="Lightup\AccessorDeclarationSyntaxExtensionsTests.cs" />
239240
<Compile Include="Lightup\AutoWrapSeparatedSyntaxListTests.cs" />
240241
<Compile Include="Lightup\BaseMethodDeclarationSyntaxExtensionsTests.cs" />

0 commit comments

Comments
 (0)