OSDN Git Service

JSONオブジェクトのメンバー順を保存する
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer.Test / JsonTest.cs
1 using System.Collections.Generic;\r
2 using System.Linq;\r
3 using Microsoft.CSharp.RuntimeBinder;\r
4 using Microsoft.VisualStudio.TestTools.UnitTesting;\r
5 \r
6 namespace KancolleSniffer.Test\r
7 {\r
8     [TestClass]\r
9     public class JsonTest\r
10     {\r
11         [TestMethod]\r
12         [ExpectedException(typeof(JsonParserException))]\r
13         public void InvalidChar()\r
14         {\r
15             JsonParser.Parse("aaaa");\r
16         }\r
17 \r
18         [TestMethod]\r
19         [ExpectedException(typeof(JsonParserException))]\r
20         public void InvalidToken()\r
21         {\r
22             JsonParser.Parse("nula");\r
23         }\r
24 \r
25         [TestMethod]\r
26         [ExpectedException(typeof(JsonParserException))]\r
27         public void ShortToken()\r
28         {\r
29             JsonParser.Parse("tru");\r
30         }\r
31 \r
32         [TestMethod]\r
33         [ExpectedException(typeof(JsonParserException))]\r
34         public void ShortTokenStartWithT()\r
35         {\r
36             JsonParser.Parse("taa");\r
37         }\r
38 \r
39         [TestMethod]\r
40         [ExpectedException(typeof(JsonParserException))]\r
41         public void InvalidEscape()\r
42         {\r
43             JsonParser.Parse("\"\\aaaa\"");\r
44         }\r
45 \r
46         [TestMethod]\r
47         [ExpectedException(typeof(JsonParserException))]\r
48         public void UnexpectedEos()\r
49         {\r
50             JsonParser.Parse("\"aaaa");\r
51         }\r
52 \r
53         [TestMethod]\r
54         [ExpectedException(typeof(JsonParserException))]\r
55         public void ObjectColonRequired()\r
56         {\r
57             JsonParser.Parse("{\"api_result\",1}");\r
58         }\r
59 \r
60         [TestMethod]\r
61         [ExpectedException(typeof(JsonParserException))]\r
62         public void ObjectStringRequired()\r
63         {\r
64             JsonParser.Parse("{api_result\":1}");\r
65         }\r
66 \r
67         [TestMethod]\r
68         [ExpectedException(typeof(JsonParserException))]\r
69         public void ObjectTerminatorRequired()\r
70         {\r
71             JsonParser.Parse("{\"api_result\":1");\r
72         }\r
73 \r
74         [TestMethod]\r
75         [ExpectedException(typeof(JsonParserException))]\r
76         public void ArrayTerminatorRequired()\r
77         {\r
78             JsonParser.Parse("[1,2,3");\r
79         }\r
80 \r
81         [TestMethod]\r
82         public void Null()\r
83         {\r
84             Assert.AreEqual(JsonParser.Parse("null"), null);\r
85         }\r
86 \r
87         [TestMethod]\r
88         public void Bool()\r
89         {\r
90             Assert.IsTrue((bool)(dynamic)JsonParser.Parse("true"));\r
91             Assert.IsFalse((bool)(dynamic)JsonParser.Parse("false"));\r
92         }\r
93 \r
94         [TestMethod]\r
95         public void Number()\r
96         {\r
97             Assert.AreEqual(123d, (double)(dynamic)JsonParser.Parse("123"));\r
98             Assert.AreEqual(-123d, (double)(dynamic)JsonParser.Parse("-123"));\r
99             Assert.AreEqual(123.456d, (double)(dynamic)JsonParser.Parse("123.456"));\r
100             Assert.AreEqual(123, (int)(dynamic)JsonParser.Parse("123.456"));\r
101         }\r
102 \r
103         [TestMethod]\r
104         public void String()\r
105         {\r
106             // ReSharper disable SuspiciousTypeConversion.Global\r
107             Assert.AreEqual("api_result", (string)(dynamic)JsonParser.Parse(@"""api_result"""));\r
108             Assert.AreEqual("/\"\\\b\f\n\r\t", (string)(dynamic)JsonParser.Parse(@"""\/\""\\\b\f\n\r\t"""));\r
109             Assert.AreEqual("大和改二", (string)(dynamic)JsonParser.Parse(@"""\u5927\u548c\u6539\u4e8c"""));\r
110             Assert.AreEqual(@"\", (string)(dynamic)JsonParser.Parse(@"""\\"""));\r
111             // ReSharper restore SuspiciousTypeConversion.Global\r
112         }\r
113 \r
114         [TestMethod]\r
115         public void ObjectEmpty()\r
116         {\r
117             var obj = (dynamic)JsonParser.Parse("{}");\r
118             Assert.IsTrue(obj.IsObject);\r
119         }\r
120 \r
121         [TestMethod]\r
122         public void CheckProperty()\r
123         {\r
124             Assert.IsFalse(((dynamic)JsonParser.Parse("{}")).api_result());\r
125         }\r
126 \r
127         [TestMethod]\r
128         public void CheckPropertyOfBool()\r
129         {\r
130             Assert.IsFalse(((dynamic)JsonParser.Parse("true")).api_result());\r
131         }\r
132 \r
133         [TestMethod]\r
134         [ExpectedException(typeof(RuntimeBinderException))]\r
135         public void GetIndexOfBool()\r
136         {\r
137             Assert.IsFalse(((dynamic)JsonParser.Parse("true"))[0]);\r
138         }\r
139 \r
140         [TestMethod]\r
141         [ExpectedException(typeof(RuntimeBinderException))]\r
142         public void PropertyNotExists()\r
143         {\r
144             Assert.IsTrue(((dynamic)JsonParser.Parse("{}")).api_result);\r
145         }\r
146 \r
147         [TestMethod]\r
148         public void ObjectWithNull()\r
149         {\r
150             var obj = (dynamic)JsonParser.Parse("{\"api_result\":null}");\r
151             Assert.AreEqual(null, obj.api_result);\r
152             Assert.AreEqual(null, obj["api_result"]);\r
153         }\r
154 \r
155         [TestMethod]\r
156         public void QueryAttribute()\r
157         {\r
158             var obj = (dynamic)JsonParser.Parse("{\"api_result\":null}");\r
159             Assert.IsTrue(obj.api_result());\r
160             Assert.IsTrue(obj.IsDefined("api_result"));\r
161         }\r
162 \r
163         [TestMethod]\r
164         public void ObjectWithNumber()\r
165         {\r
166             var obj = (dynamic)JsonParser.Parse("{\"api_result\":1}");\r
167             Assert.AreEqual(1d, obj.api_result);\r
168             Assert.AreEqual(1d, obj["api_result"]);\r
169         }\r
170 \r
171         [TestMethod]\r
172         public void ObjectWithString()\r
173         {\r
174             var obj = (dynamic)JsonParser.Parse("{\"api_result\":1,\"api_result_msg\":\"\u6210\u529f\"}");\r
175             Assert.AreEqual("成功", obj.api_result_msg);\r
176             Assert.AreEqual("成功", obj["api_result_msg"]);\r
177         }\r
178 \r
179         [TestMethod]\r
180         public void ArrayEmpty()\r
181         {\r
182             var obj = (dynamic)JsonParser.Parse("[]");\r
183             Assert.IsTrue(obj.IsArray);\r
184         }\r
185 \r
186         [TestMethod]\r
187         public void ArrayWithPrimitives()\r
188         {\r
189             var bary = (dynamic)JsonParser.Parse("[true,false,true]");\r
190             Assert.IsTrue(bary[0]);\r
191             var dary = (dynamic)JsonParser.Parse("[1,2,3]");\r
192             Assert.AreEqual(dary[0], 1d);\r
193             var sary = (dynamic)JsonParser.Parse("[\"1\", \"2\", \"3\"]");\r
194             Assert.AreEqual(sary[0], "1");\r
195         }\r
196 \r
197         [TestMethod]\r
198         public void WithWhiteSpace()\r
199         {\r
200             var obj = (dynamic)JsonParser.Parse("{\"api_result\":1, \"api_result_msg\" :\"\u6210\u529f\"}");\r
201             Assert.AreEqual("成功", obj.api_result_msg);\r
202             var ary = (double[])(dynamic)JsonParser.Parse("[1, 2, 3]");\r
203             Assert.IsTrue(ary.SequenceEqual(new[] {1d, 2d, 3d}));\r
204         }\r
205 \r
206         [TestMethod]\r
207         public void EnumerateArray()\r
208         {\r
209             var ary = (dynamic)JsonParser.Parse("[{\"a\":1},{\"a\":2}]");\r
210             var list = new List<double>();\r
211             foreach (var entry in ary)\r
212                 list.Add(entry.a);\r
213             Assert.IsTrue(list.SequenceEqual(new[] {1d, 2d}));\r
214         }\r
215 \r
216         [TestMethod]\r
217         public void ObjectWithArray()\r
218         {\r
219             var obj = (dynamic)JsonParser.Parse("{\"ary\":[]}");\r
220             Assert.IsTrue(obj.ary.IsArray);\r
221         }\r
222 \r
223         [TestMethod]\r
224         public void EnumerateProperty()\r
225         {\r
226             var obj = (dynamic)JsonParser.Parse("{\"a\":{\"a\":1},\"b\":{\"a\":2}}");\r
227             var list = new List<double>();\r
228             foreach (KeyValuePair<string, dynamic> entry in obj)\r
229                 list.Add(entry.Value.a);\r
230             Assert.IsTrue(list.SequenceEqual(new[] {1d, 2d}));\r
231         }\r
232 \r
233         [TestMethod]\r
234         public void PropertyOrder()\r
235         {\r
236             const int count = 100;\r
237             var json = "{" + string.Join(",", Enumerable.Range(0, count).Select(n => $"\"{"a" + n}\":{n}")) + "}";\r
238             var obj = (dynamic)JsonParser.Parse(json);\r
239             var list = new List<int>();\r
240             foreach (KeyValuePair<string, dynamic> kv in obj)\r
241                 list.Add((int)kv.Value);\r
242             Assert.IsTrue(list.SequenceEqual(Enumerable.Range(0, count)));\r
243         }\r
244 \r
245         [TestMethod]\r
246         public void CastArrayToPrimitivetArray()\r
247         {\r
248             var bary = (bool[])(dynamic)JsonParser.Parse("[true,false,true]");\r
249             Assert.IsTrue(bary.SequenceEqual(new[] {true, false, true}));\r
250             var dary = (double[])(dynamic)JsonParser.Parse("[1,2,3]");\r
251             Assert.IsTrue(dary.SequenceEqual(new[] {1d, 2d, 3d}));\r
252             var sary = (string[])(dynamic)JsonParser.Parse("[\"1\", \"2\", \"3\"]");\r
253             Assert.IsTrue(sary.SequenceEqual(new[] {"1", "2", "3"}));\r
254         }\r
255 \r
256         [TestMethod]\r
257         public void CastArrayToIntArray()\r
258         {\r
259             var iary = (int[])(dynamic)JsonParser.Parse("[1,2,3]");\r
260             Assert.IsTrue(iary.SequenceEqual(new[] {1, 2, 3}));\r
261         }\r
262 \r
263         [TestMethod]\r
264         public void CastArrayToObjectArray()\r
265         {\r
266             var ary = (object[])(dynamic)JsonParser.Parse("[1,2,3]");\r
267             Assert.IsTrue(ary.Cast<double>().SequenceEqual(new[] {1d, 2d, 3d}));\r
268         }\r
269 \r
270         [TestMethod]\r
271         public void CastArrayOfArrayToArrayOfIntArray()\r
272         {\r
273             var iary = (double[][])(dynamic)JsonParser.Parse("[[1,2],[3,4],[5,6]]");\r
274             // ReSharper disable once PossibleNullReferenceException\r
275             Assert.IsTrue(iary.GetType().GetElementType().IsArray);\r
276         }\r
277 \r
278         [TestMethod]\r
279         [ExpectedException(typeof(RuntimeBinderException))]\r
280         public void CastArrayToArrayOfIntArray()\r
281         {\r
282             Assert.IsTrue(((double[][])(dynamic)JsonParser.Parse("[1,2,3]")).GetType().IsArray);\r
283         }\r
284 \r
285         // ReSharper disable UnusedVariable\r
286         [TestMethod]\r
287         [ExpectedException(typeof(RuntimeBinderException))]\r
288         public void CastArrayToArrayOfFloat()\r
289         {\r
290             var dummy = (float[])(dynamic)JsonParser.Parse("[1,2,3]");\r
291         }\r
292 \r
293         [TestMethod]\r
294         [ExpectedException(typeof(RuntimeBinderException))]\r
295         public void CastObjectToArray()\r
296         {\r
297             var dummy = (double[])(dynamic)JsonParser.Parse("{}");\r
298         }\r
299 \r
300         [TestMethod]\r
301         [ExpectedException(typeof(RuntimeBinderException))]\r
302         public void CastArrayToDouble()\r
303         {\r
304             var dummy = (double)(dynamic)JsonParser.Parse("[1,2,3]");\r
305         }\r
306 \r
307         [TestMethod]\r
308         [ExpectedException(typeof(RuntimeBinderException))]\r
309         public void CastBoolToEnumerable()\r
310         {\r
311             var dummy = (dynamic)JsonParser.Parse("false");\r
312             foreach (var entry in dummy)\r
313             {\r
314             }\r
315         }\r
316 \r
317         // ReSharper restore UnusedVariable\r
318 \r
319         [TestMethod]\r
320         public void SetMember()\r
321         {\r
322             var obj = (dynamic)JsonParser.Parse("{}");\r
323             obj.is_a = "hoge";\r
324             Assert.AreEqual(obj.is_a, "hoge");\r
325         }\r
326 \r
327         [TestMethod]\r
328         public void SetMemberArray()\r
329         {\r
330             var obj = (dynamic)JsonParser.Parse("{}");\r
331             var array = new[] {1, 2, 3, 4};\r
332             obj.is_a = array;\r
333             Assert.IsTrue(array.SequenceEqual((int[])obj.is_a));\r
334         }\r
335 \r
336         [TestMethod]\r
337         public void SetIndex()\r
338         {\r
339             var array = (dynamic)JsonParser.Parse("[1,2,3,4]");\r
340             array[2] = 5;\r
341             Assert.IsTrue(array[2] == 5);\r
342 \r
343             var obj = (dynamic)JsonParser.Parse("{}");\r
344             obj["is_a"] = "hoge";\r
345             Assert.AreEqual(obj.is_a, "hoge");\r
346         }\r
347 \r
348         [TestMethod]\r
349         public void CreateObject()\r
350         {\r
351             var json = (dynamic)JsonObject.CreateJsonObject(new {aaa = 1, bbb = new[] {1, 2, 3}});\r
352             Assert.IsTrue(json.aaa == 1);\r
353             Assert.IsTrue(json.bbb[1] == 2);\r
354         }\r
355 \r
356         [TestMethod]\r
357         public void CreateArray()\r
358         {\r
359             var json = (dynamic)JsonObject.CreateJsonObject(new[] {new {aaa = 1}, new {aaa = 2}});\r
360             Assert.IsTrue(json[0].aaa == 1);\r
361             Assert.IsTrue(json[1].aaa == 2);\r
362         }\r
363 \r
364         [TestMethod]\r
365         public void Serialize()\r
366         {\r
367             var input =\r
368                 "[{\"api_id\":1,\"api_name\":\"睦月\",\"api_maxeq\":[[0,1],0,0,0,0],\"api_test\":true,\"api_null\":null}," +\r
369                 "{\"api_id\":2,\"api_name\":\"如月\",\"api_maxeq\":[0,0,0,0,null],\"api_test\":false}]";\r
370             var json = JsonParser.Parse(input);\r
371             Assert.AreEqual(json.ToString(), input);\r
372         }\r
373     }\r
374 }