OSDN Git Service

敵のスロットの搭載数を埋める
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer.Test / JsonTest.cs
1 using System.Collections.Generic;\r
2 using System.Linq;\r
3 using KancolleSniffer.Util;\r
4 using Microsoft.CSharp.RuntimeBinder;\r
5 using Microsoft.VisualStudio.TestTools.UnitTesting;\r
6 \r
7 namespace KancolleSniffer.Test\r
8 {\r
9     [TestClass]\r
10     public class JsonTest\r
11     {\r
12         [TestMethod]\r
13         [ExpectedException(typeof(JsonParserException))]\r
14         public void InvalidChar()\r
15         {\r
16             JsonParser.Parse("aaaa");\r
17         }\r
18 \r
19         [TestMethod]\r
20         [ExpectedException(typeof(JsonParserException))]\r
21         public void InvalidToken()\r
22         {\r
23             JsonParser.Parse("nula");\r
24         }\r
25 \r
26         [TestMethod]\r
27         [ExpectedException(typeof(JsonParserException))]\r
28         public void ShortToken()\r
29         {\r
30             JsonParser.Parse("tru");\r
31         }\r
32 \r
33         [TestMethod]\r
34         [ExpectedException(typeof(JsonParserException))]\r
35         public void ShortTokenStartWithT()\r
36         {\r
37             JsonParser.Parse("taa");\r
38         }\r
39 \r
40         [TestMethod]\r
41         [ExpectedException(typeof(JsonParserException))]\r
42         public void InvalidEscape()\r
43         {\r
44             JsonParser.Parse("\"\\aaaa\"");\r
45         }\r
46 \r
47         [TestMethod]\r
48         [ExpectedException(typeof(JsonParserException))]\r
49         public void UnexpectedEos()\r
50         {\r
51             JsonParser.Parse("\"aaaa");\r
52         }\r
53 \r
54         [TestMethod]\r
55         [ExpectedException(typeof(JsonParserException))]\r
56         public void ObjectColonRequired()\r
57         {\r
58             JsonParser.Parse("{\"api_result\",1}");\r
59         }\r
60 \r
61         [TestMethod]\r
62         [ExpectedException(typeof(JsonParserException))]\r
63         public void ObjectStringRequired()\r
64         {\r
65             JsonParser.Parse("{api_result\":1}");\r
66         }\r
67 \r
68         [TestMethod]\r
69         [ExpectedException(typeof(JsonParserException))]\r
70         public void ObjectTerminatorRequired()\r
71         {\r
72             JsonParser.Parse("{\"api_result\":1");\r
73         }\r
74 \r
75         [TestMethod]\r
76         [ExpectedException(typeof(JsonParserException))]\r
77         public void ArrayTerminatorRequired()\r
78         {\r
79             JsonParser.Parse("[1,2,3");\r
80         }\r
81 \r
82         [TestMethod]\r
83         public void Null()\r
84         {\r
85             Assert.AreEqual(JsonParser.Parse("null"), null);\r
86         }\r
87 \r
88         [TestMethod]\r
89         public void Bool()\r
90         {\r
91             Assert.IsTrue((bool)(dynamic)JsonParser.Parse("true"));\r
92             Assert.IsFalse((bool)(dynamic)JsonParser.Parse("false"));\r
93         }\r
94 \r
95         [TestMethod]\r
96         public void Number()\r
97         {\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
102         }\r
103 \r
104         [TestMethod]\r
105         public void String()\r
106         {\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
113         }\r
114 \r
115         [TestMethod]\r
116         public void ObjectEmpty()\r
117         {\r
118             var obj = (dynamic)JsonParser.Parse("{}");\r
119             Assert.IsTrue(obj.IsObject);\r
120         }\r
121 \r
122         [TestMethod]\r
123         public void CheckProperty()\r
124         {\r
125             Assert.IsFalse(((dynamic)JsonParser.Parse("{}")).api_result());\r
126         }\r
127 \r
128         [TestMethod]\r
129         public void CheckPropertyOfBool()\r
130         {\r
131             Assert.IsFalse(((dynamic)JsonParser.Parse("true")).api_result());\r
132         }\r
133 \r
134         [TestMethod]\r
135         [ExpectedException(typeof(RuntimeBinderException))]\r
136         public void GetIndexOfBool()\r
137         {\r
138             Assert.IsFalse(((dynamic)JsonParser.Parse("true"))[0]);\r
139         }\r
140 \r
141         [TestMethod]\r
142         [ExpectedException(typeof(RuntimeBinderException))]\r
143         public void PropertyNotExists()\r
144         {\r
145             Assert.IsTrue(((dynamic)JsonParser.Parse("{}")).api_result);\r
146         }\r
147 \r
148         [TestMethod]\r
149         public void ObjectWithNull()\r
150         {\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
154         }\r
155 \r
156         [TestMethod]\r
157         public void QueryAttribute()\r
158         {\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
162         }\r
163 \r
164         [TestMethod]\r
165         public void ObjectWithNumber()\r
166         {\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
170         }\r
171 \r
172         [TestMethod]\r
173         public void ObjectWithString()\r
174         {\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
178         }\r
179 \r
180         [TestMethod]\r
181         public void ArrayEmpty()\r
182         {\r
183             var obj = (dynamic)JsonParser.Parse("[]");\r
184             Assert.IsTrue(obj.IsArray);\r
185         }\r
186 \r
187         [TestMethod]\r
188         public void ArrayWithPrimitives()\r
189         {\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
196         }\r
197 \r
198         [TestMethod]\r
199         public void WithWhiteSpace()\r
200         {\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
205         }\r
206 \r
207         [TestMethod]\r
208         public void EnumerateArray()\r
209         {\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
213                 list.Add(entry.a);\r
214             Assert.IsTrue(list.SequenceEqual(new[] {1d, 2d}));\r
215         }\r
216 \r
217         [TestMethod]\r
218         public void ObjectWithArray()\r
219         {\r
220             var obj = (dynamic)JsonParser.Parse("{\"ary\":[]}");\r
221             Assert.IsTrue(obj.ary.IsArray);\r
222         }\r
223 \r
224         [TestMethod]\r
225         public void EnumerateProperty()\r
226         {\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
232         }\r
233 \r
234         [TestMethod]\r
235         public void PropertyOrder()\r
236         {\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
244         }\r
245 \r
246         [TestMethod]\r
247         public void CastArrayToPrimitiveArray()\r
248         {\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
255         }\r
256 \r
257         [TestMethod]\r
258         public void CastArrayToIntArray()\r
259         {\r
260             var iAry = (int[])(dynamic)JsonParser.Parse("[1,2,3]");\r
261             Assert.IsTrue(iAry.SequenceEqual(new[] {1, 2, 3}));\r
262         }\r
263 \r
264         [TestMethod]\r
265         public void CastArrayToObjectArray()\r
266         {\r
267             var ary = (object[])(dynamic)JsonParser.Parse("[1,2,3]");\r
268             Assert.IsTrue(ary.Cast<double>().SequenceEqual(new[] {1d, 2d, 3d}));\r
269         }\r
270 \r
271         [TestMethod]\r
272         public void CastArrayOfArrayToArrayOfIntArray()\r
273         {\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
277         }\r
278 \r
279         [TestMethod]\r
280         [ExpectedException(typeof(RuntimeBinderException))]\r
281         public void CastArrayToArrayOfIntArray()\r
282         {\r
283             Assert.IsTrue(((double[][])(dynamic)JsonParser.Parse("[1,2,3]")).GetType().IsArray);\r
284         }\r
285 \r
286         // ReSharper disable UnusedVariable\r
287         [TestMethod]\r
288         [ExpectedException(typeof(RuntimeBinderException))]\r
289         public void CastArrayToArrayOfFloat()\r
290         {\r
291             var dummy = (float[])(dynamic)JsonParser.Parse("[1,2,3]");\r
292         }\r
293 \r
294         [TestMethod]\r
295         [ExpectedException(typeof(RuntimeBinderException))]\r
296         public void CastObjectToArray()\r
297         {\r
298             var dummy = (double[])(dynamic)JsonParser.Parse("{}");\r
299         }\r
300 \r
301         [TestMethod]\r
302         [ExpectedException(typeof(RuntimeBinderException))]\r
303         public void CastArrayToDouble()\r
304         {\r
305             var dummy = (double)(dynamic)JsonParser.Parse("[1,2,3]");\r
306         }\r
307 \r
308         [TestMethod]\r
309         [ExpectedException(typeof(RuntimeBinderException))]\r
310         public void CastBoolToEnumerable()\r
311         {\r
312             var dummy = (dynamic)JsonParser.Parse("false");\r
313             foreach (var entry in dummy)\r
314             {\r
315             }\r
316         }\r
317 \r
318         // ReSharper restore UnusedVariable\r
319 \r
320         [TestMethod]\r
321         public void SetMember()\r
322         {\r
323             var obj = (dynamic)JsonParser.Parse("{}");\r
324             obj.is_a = "hoge";\r
325             Assert.AreEqual(obj.is_a, "hoge");\r
326         }\r
327 \r
328         [TestMethod]\r
329         public void SetMemberArray()\r
330         {\r
331             var obj = (dynamic)JsonParser.Parse("{}");\r
332             var array = new[] {1, 2, 3, 4};\r
333             obj.is_a = array;\r
334             Assert.IsTrue(array.SequenceEqual((int[])obj.is_a));\r
335         }\r
336 \r
337         [TestMethod]\r
338         public void SetIndex()\r
339         {\r
340             var array = (dynamic)JsonParser.Parse("[1,2,3,4]");\r
341             array[2] = 5;\r
342             Assert.IsTrue(array[2] == 5);\r
343 \r
344             var obj = (dynamic)JsonParser.Parse("{}");\r
345             obj["is_a"] = "hoge";\r
346             Assert.AreEqual(obj.is_a, "hoge");\r
347         }\r
348 \r
349         [TestMethod]\r
350         public void CreateObject()\r
351         {\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
355         }\r
356 \r
357         [TestMethod]\r
358         public void CreateArray()\r
359         {\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
363         }\r
364 \r
365         [TestMethod]\r
366         public void Serialize()\r
367         {\r
368             var input =\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
373         }\r
374     }\r
375 }