1 using System.Collections.Generic;
\r
3 using KancolleSniffer.Util;
\r
4 using Microsoft.CSharp.RuntimeBinder;
\r
5 using Microsoft.VisualStudio.TestTools.UnitTesting;
\r
7 namespace KancolleSniffer.Test
\r
10 public class JsonTest
\r
13 [ExpectedException(typeof(JsonParserException))]
\r
14 public void InvalidChar()
\r
16 JsonParser.Parse("aaaa");
\r
20 [ExpectedException(typeof(JsonParserException))]
\r
21 public void InvalidToken()
\r
23 JsonParser.Parse("nula");
\r
27 [ExpectedException(typeof(JsonParserException))]
\r
28 public void ShortToken()
\r
30 JsonParser.Parse("tru");
\r
34 [ExpectedException(typeof(JsonParserException))]
\r
35 public void ShortTokenStartWithT()
\r
37 JsonParser.Parse("taa");
\r
41 [ExpectedException(typeof(JsonParserException))]
\r
42 public void InvalidEscape()
\r
44 JsonParser.Parse("\"\\aaaa\"");
\r
48 [ExpectedException(typeof(JsonParserException))]
\r
49 public void UnexpectedEos()
\r
51 JsonParser.Parse("\"aaaa");
\r
55 [ExpectedException(typeof(JsonParserException))]
\r
56 public void ObjectColonRequired()
\r
58 JsonParser.Parse("{\"api_result\",1}");
\r
62 [ExpectedException(typeof(JsonParserException))]
\r
63 public void ObjectStringRequired()
\r
65 JsonParser.Parse("{api_result\":1}");
\r
69 [ExpectedException(typeof(JsonParserException))]
\r
70 public void ObjectTerminatorRequired()
\r
72 JsonParser.Parse("{\"api_result\":1");
\r
76 [ExpectedException(typeof(JsonParserException))]
\r
77 public void ArrayTerminatorRequired()
\r
79 JsonParser.Parse("[1,2,3");
\r
85 Assert.AreEqual(JsonParser.Parse("null"), null);
\r
91 Assert.IsTrue((bool)(dynamic)JsonParser.Parse("true"));
\r
92 Assert.IsFalse((bool)(dynamic)JsonParser.Parse("false"));
\r
96 public void Number()
\r
98 Assert.AreEqual(123d, (double)(dynamic)JsonParser.Parse("123"));
\r
99 Assert.AreEqual(-123d, (double)(dynamic)JsonParser.Parse("-123"));
\r
100 Assert.AreEqual(123.456d, (double)(dynamic)JsonParser.Parse("123.456"));
\r
101 Assert.AreEqual(123, (int)(dynamic)JsonParser.Parse("123.456"));
\r
105 public void String()
\r
107 // ReSharper disable SuspiciousTypeConversion.Global
\r
108 Assert.AreEqual("api_result", (string)(dynamic)JsonParser.Parse(@"""api_result"""));
\r
109 Assert.AreEqual("/\"\\\b\f\n\r\t", (string)(dynamic)JsonParser.Parse(@"""\/\""\\\b\f\n\r\t"""));
\r
110 Assert.AreEqual("大和改二", (string)(dynamic)JsonParser.Parse(@"""\u5927\u548c\u6539\u4e8c"""));
\r
111 Assert.AreEqual(@"\", (string)(dynamic)JsonParser.Parse(@"""\\"""));
\r
112 // ReSharper restore SuspiciousTypeConversion.Global
\r
116 public void ObjectEmpty()
\r
118 var obj = (dynamic)JsonParser.Parse("{}");
\r
119 Assert.IsTrue(obj.IsObject);
\r
123 public void CheckProperty()
\r
125 Assert.IsFalse(((dynamic)JsonParser.Parse("{}")).api_result());
\r
129 public void CheckPropertyOfBool()
\r
131 Assert.IsFalse(((dynamic)JsonParser.Parse("true")).api_result());
\r
135 [ExpectedException(typeof(RuntimeBinderException))]
\r
136 public void GetIndexOfBool()
\r
138 Assert.IsFalse(((dynamic)JsonParser.Parse("true"))[0]);
\r
142 [ExpectedException(typeof(RuntimeBinderException))]
\r
143 public void PropertyNotExists()
\r
145 Assert.IsTrue(((dynamic)JsonParser.Parse("{}")).api_result);
\r
149 public void ObjectWithNull()
\r
151 var obj = (dynamic)JsonParser.Parse("{\"api_result\":null}");
\r
152 Assert.AreEqual(null, obj.api_result);
\r
153 Assert.AreEqual(null, obj["api_result"]);
\r
157 public void QueryAttribute()
\r
159 var obj = (dynamic)JsonParser.Parse("{\"api_result\":null}");
\r
160 Assert.IsTrue(obj.api_result());
\r
161 Assert.IsTrue(obj.IsDefined("api_result"));
\r
165 public void ObjectWithNumber()
\r
167 var obj = (dynamic)JsonParser.Parse("{\"api_result\":1}");
\r
168 Assert.AreEqual(1d, obj.api_result);
\r
169 Assert.AreEqual(1d, obj["api_result"]);
\r
173 public void ObjectWithString()
\r
175 var obj = (dynamic)JsonParser.Parse("{\"api_result\":1,\"api_result_msg\":\"\u6210\u529f\"}");
\r
176 Assert.AreEqual("成功", obj.api_result_msg);
\r
177 Assert.AreEqual("成功", obj["api_result_msg"]);
\r
181 public void ArrayEmpty()
\r
183 var obj = (dynamic)JsonParser.Parse("[]");
\r
184 Assert.IsTrue(obj.IsArray);
\r
188 public void ArrayWithPrimitives()
\r
190 var bAry = (dynamic)JsonParser.Parse("[true,false,true]");
\r
191 Assert.IsTrue(bAry[0]);
\r
192 var dAry = (dynamic)JsonParser.Parse("[1,2,3]");
\r
193 Assert.AreEqual(dAry[0], 1d);
\r
194 var sAry = (dynamic)JsonParser.Parse("[\"1\", \"2\", \"3\"]");
\r
195 Assert.AreEqual(sAry[0], "1");
\r
199 public void WithWhiteSpace()
\r
201 var obj = (dynamic)JsonParser.Parse("{\"api_result\":1, \"api_result_msg\" :\"\u6210\u529f\"}");
\r
202 Assert.AreEqual("成功", obj.api_result_msg);
\r
203 var ary = (double[])(dynamic)JsonParser.Parse("[1, 2, 3]");
\r
204 Assert.IsTrue(ary.SequenceEqual(new[] {1d, 2d, 3d}));
\r
208 public void EnumerateArray()
\r
210 var ary = (dynamic)JsonParser.Parse("[{\"a\":1},{\"a\":2}]");
\r
211 var list = new List<double>();
\r
212 foreach (var entry in ary)
\r
214 Assert.IsTrue(list.SequenceEqual(new[] {1d, 2d}));
\r
218 public void ObjectWithArray()
\r
220 var obj = (dynamic)JsonParser.Parse("{\"ary\":[]}");
\r
221 Assert.IsTrue(obj.ary.IsArray);
\r
225 public void EnumerateProperty()
\r
227 var obj = (dynamic)JsonParser.Parse("{\"a\":{\"a\":1},\"b\":{\"a\":2}}");
\r
228 var list = new List<double>();
\r
229 foreach (KeyValuePair<string, dynamic> entry in obj)
\r
230 list.Add(entry.Value.a);
\r
231 Assert.IsTrue(list.SequenceEqual(new[] {1d, 2d}));
\r
235 public void PropertyOrder()
\r
237 const int count = 100;
\r
238 var json = "{" + string.Join(",", Enumerable.Range(0, count).Select(n => $"\"{"a" + n}\":{n}")) + "}";
\r
239 var obj = (dynamic)JsonParser.Parse(json);
\r
240 var list = new List<int>();
\r
241 foreach (KeyValuePair<string, dynamic> kv in obj)
\r
242 list.Add((int)kv.Value);
\r
243 Assert.IsTrue(list.SequenceEqual(Enumerable.Range(0, count)));
\r
247 public void CastArrayToPrimitiveArray()
\r
249 var bAry = (bool[])(dynamic)JsonParser.Parse("[true,false,true]");
\r
250 Assert.IsTrue(bAry.SequenceEqual(new[] {true, false, true}));
\r
251 var dAry = (double[])(dynamic)JsonParser.Parse("[1,2,3]");
\r
252 Assert.IsTrue(dAry.SequenceEqual(new[] {1d, 2d, 3d}));
\r
253 var sAry = (string[])(dynamic)JsonParser.Parse("[\"1\", \"2\", \"3\"]");
\r
254 Assert.IsTrue(sAry.SequenceEqual(new[] {"1", "2", "3"}));
\r
258 public void CastArrayToIntArray()
\r
260 var iAry = (int[])(dynamic)JsonParser.Parse("[1,2,3]");
\r
261 Assert.IsTrue(iAry.SequenceEqual(new[] {1, 2, 3}));
\r
265 public void CastArrayToObjectArray()
\r
267 var ary = (object[])(dynamic)JsonParser.Parse("[1,2,3]");
\r
268 Assert.IsTrue(ary.Cast<double>().SequenceEqual(new[] {1d, 2d, 3d}));
\r
272 public void CastArrayOfArrayToArrayOfIntArray()
\r
274 var ary = (double[][])(dynamic)JsonParser.Parse("[[1,2],[3,4],[5,6]]");
\r
275 // ReSharper disable once PossibleNullReferenceException
\r
276 Assert.IsTrue(ary.GetType().GetElementType().IsArray);
\r
280 [ExpectedException(typeof(RuntimeBinderException))]
\r
281 public void CastArrayToArrayOfIntArray()
\r
283 Assert.IsTrue(((double[][])(dynamic)JsonParser.Parse("[1,2,3]")).GetType().IsArray);
\r
286 // ReSharper disable UnusedVariable
\r
288 [ExpectedException(typeof(RuntimeBinderException))]
\r
289 public void CastArrayToArrayOfFloat()
\r
291 var dummy = (float[])(dynamic)JsonParser.Parse("[1,2,3]");
\r
295 [ExpectedException(typeof(RuntimeBinderException))]
\r
296 public void CastObjectToArray()
\r
298 var dummy = (double[])(dynamic)JsonParser.Parse("{}");
\r
302 [ExpectedException(typeof(RuntimeBinderException))]
\r
303 public void CastArrayToDouble()
\r
305 var dummy = (double)(dynamic)JsonParser.Parse("[1,2,3]");
\r
309 [ExpectedException(typeof(RuntimeBinderException))]
\r
310 public void CastBoolToEnumerable()
\r
312 var dummy = (dynamic)JsonParser.Parse("false");
\r
313 foreach (var entry in dummy)
\r
318 // ReSharper restore UnusedVariable
\r
321 public void SetMember()
\r
323 var obj = (dynamic)JsonParser.Parse("{}");
\r
325 Assert.AreEqual(obj.is_a, "hoge");
\r
329 public void SetMemberArray()
\r
331 var obj = (dynamic)JsonParser.Parse("{}");
\r
332 var array = new[] {1, 2, 3, 4};
\r
334 Assert.IsTrue(array.SequenceEqual((int[])obj.is_a));
\r
338 public void SetIndex()
\r
340 var array = (dynamic)JsonParser.Parse("[1,2,3,4]");
\r
342 Assert.IsTrue(array[2] == 5);
\r
344 var obj = (dynamic)JsonParser.Parse("{}");
\r
345 obj["is_a"] = "hoge";
\r
346 Assert.AreEqual(obj.is_a, "hoge");
\r
350 public void CreateObject()
\r
352 var json = (dynamic)JsonObject.CreateJsonObject(new {aaa = 1, bbb = new[] {1, 2, 3}});
\r
353 Assert.IsTrue(json.aaa == 1);
\r
354 Assert.IsTrue(json.bbb[1] == 2);
\r
358 public void CreateArray()
\r
360 var json = (dynamic)JsonObject.CreateJsonObject(new[] {new {aaa = 1}, new {aaa = 2}});
\r
361 Assert.IsTrue(json[0].aaa == 1);
\r
362 Assert.IsTrue(json[1].aaa == 2);
\r
366 public void Serialize()
\r
369 "[{\"api_id\":1,\"api_name\":\"睦月\",\"api_maxeq\":[[0,1],0,0,0,0],\"api_test\":true,\"api_null\":null}," +
\r
370 "{\"api_id\":2,\"api_name\":\"如月\",\"api_maxeq\":[0,0,0,0,null],\"api_test\":false}]";
\r
371 var json = JsonParser.Parse(input);
\r
372 Assert.AreEqual(json.ToString(), input);
\r