OSDN Git Service

1-6のゴールが海戦としてカウンターに計上されるのを直す
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer.Test / LoggerTest.cs
1 // Copyright (C) 2014, 2015 Kazuhiro Fujieda <fujieda@users.osdn.me>\r
2 // \r
3 // Licensed under the Apache License, Version 2.0 (the "License");\r
4 // you may not use this file except in compliance with the License.\r
5 // You may obtain a copy of the License at\r
6 //\r
7 //    http://www.apache.org/licenses/LICENSE-2.0\r
8 //\r
9 // Unless required by applicable law or agreed to in writing, software\r
10 // distributed under the License is distributed on an "AS IS" BASIS,\r
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
12 // See the License for the specific language governing permissions and\r
13 // limitations under the License.\r
14 \r
15 using System;\r
16 using System.Collections.Generic;\r
17 using System.IO;\r
18 using DynaJson;\r
19 using ExpressionToCodeLib;\r
20 using KancolleSniffer.Log;\r
21 using Microsoft.VisualStudio.TestTools.UnitTesting;\r
22 using Moq;\r
23 \r
24 namespace KancolleSniffer.Test\r
25 {\r
26     using Sniffer = SnifferTest.TestingSniffer;\r
27 \r
28     [TestClass]\r
29     public class LoggerTest\r
30     {\r
31         [TestInitialize]\r
32         public void Initialize()\r
33         {\r
34             ExpressionToCodeConfiguration.GlobalAssertionConfiguration = ExpressionToCodeConfiguration\r
35                 .GlobalAssertionConfiguration.WithPrintedListLengthLimit(200).WithMaximumValueLength(1000);\r
36         }\r
37 \r
38         [TestMethod]\r
39         public void InspectMissionResult()\r
40         {\r
41             var sniffer = new Sniffer(true);\r
42             var result = "";\r
43             var header = "";\r
44             sniffer.SetLogWriter((path, s, h) =>\r
45             {\r
46                 result += s + "|";\r
47                 header = h;\r
48             }, () => new DateTime(2015, 1, 1));\r
49             sniffer.EnableLog(LogType.Mission);\r
50             SnifferTest.SniffLogFile(sniffer, "mission_result_001");\r
51             PAssert.That(() => "日付,結果,遠征,燃料,弾薬,鋼材,ボーキ,開発資材,高速修復材,高速建造材,改修資材" == header);\r
52             PAssert.That(() => "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,0,0,0|" +\r
53                                "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,1,0,0|" +\r
54                                "2015-01-01 00:00:00,大成功,MO作戦,0,0,360,420,1,0,0,0|" +\r
55                                "2015-01-01 00:00:00,失敗,東京急行(弐),0,0,0,0,0,0,0,0|"\r
56                                == result);\r
57         }\r
58 \r
59         [TestMethod]\r
60         public void MissionResultGetScrew()\r
61         {\r
62             var sniffer = new Sniffer(true);\r
63             var result = "";\r
64             var header = "";\r
65             sniffer.SetLogWriter((path, s, h) =>\r
66             {\r
67                 result += s + "|";\r
68                 header = h;\r
69             }, () => new DateTime(2019, 1, 1));\r
70             sniffer.EnableLog(LogType.Mission);\r
71             SnifferTest.SniffLogFile(sniffer, "mission_result_002");\r
72             PAssert.That(() => "日付,結果,遠征,燃料,弾薬,鋼材,ボーキ,開発資材,高速修復材,高速建造材,改修資材" == header);\r
73             PAssert.That(() => "2019-01-01 00:00:00,大成功,南西諸島離島防衛作戦,0,0,1800,975,0,0,0,1|"\r
74                                == result);\r
75         }\r
76 \r
77         /// <summary>\r
78         /// 出力先に書けないときは一時ファイルに書き込む\r
79         /// </summary>\r
80         [TestMethod]\r
81         public void WriteTmpFileWhenCantWriteTarget()\r
82         {\r
83             var mock = new Mock<LogWriter.IFile>();\r
84             var writer = new LogWriter(null, mock.Object);\r
85 \r
86             const string str = "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,0,0";\r
87             var tmp = "";\r
88             mock.Setup(l => l.AppendAllText(It.IsAny<string>(), It.IsAny<string>()))\r
89                 .Callback<string, string>((file, s) =>\r
90                 {\r
91                     if (file.EndsWith(".csv"))\r
92                         throw new IOException();\r
93                     if (file.EndsWith(".tmp"))\r
94                         tmp += s;\r
95                 });\r
96             mock.SetupSequence(l => l.Exists(It.IsAny<string>())).Returns(false).Returns(true);\r
97             writer.Write("遠征報告書", str, "");\r
98             PAssert.That(() => "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,0,0\r\n" == tmp);\r
99         }\r
100 \r
101         [TestMethod]\r
102         public void MergeTmpFile()\r
103         {\r
104             MergeTmpFileMain(false);\r
105         }\r
106 \r
107         [TestMethod]\r
108         public void FailToMergeTmpFile()\r
109         {\r
110             MergeTmpFileMain(true);\r
111         }\r
112 \r
113         private void MergeTmpFileMain(bool failToMerge)\r
114         {\r
115             var mock = new Mock<LogWriter.IFile>();\r
116             var writer = new LogWriter(null, mock.Object);\r
117 \r
118             var tmp = "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,0,0\r\n";\r
119             var csv = "";\r
120             mock.Setup(l => l.Exists(It.IsAny<string>())).Returns(true);\r
121             mock.Setup(l => l.ReadAllText(It.IsAny<string>()))\r
122                 .Returns((string path) => path.EndsWith(".tmp") ? tmp : "");\r
123             mock.Setup(l => l.AppendAllText(It.IsAny<string>(), It.IsAny<string>()))\r
124                 .Callback<string, string>((file, s) =>\r
125                 {\r
126                     if (file.EndsWith(".tmp"))\r
127                         tmp += s;\r
128                     if (file.EndsWith(".csv"))\r
129                     {\r
130                         if (failToMerge)\r
131                             throw new IOException();\r
132                         csv += s;\r
133                     }\r
134                 });\r
135             const string str = "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,1,0";\r
136             writer.Write("遠征報告書", str, "");\r
137             var result = failToMerge ? tmp : csv;\r
138             PAssert.That(() =>\r
139                 "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,0,0\r\n" +\r
140                 "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,1,0\r\n" == result);\r
141         }\r
142 \r
143         [TestMethod]\r
144         public void InspectBattleResult()\r
145         {\r
146             var sniffer = new Sniffer();\r
147             var result = "";\r
148             sniffer.SetLogWriter((path, s, h) => { result += s + "|"; }, () => new DateTime(2017, 1, 1));\r
149             sniffer.EnableLog(LogType.Battle);\r
150             SnifferTest.SniffLogFile(sniffer, "battle_001");\r
151             PAssert.That(() =>\r
152                 "2017-01-01 00:00:00,カレー洋制圧戦,1,出撃,A,T字戦(有利),警戒陣,梯形陣,敵潜水教導艦隊,,," +\r
153                 "隼鷹改二(Lv157),57/62,利根改二(Lv151),66/66,千代田航改二(Lv159),50/65,千歳航改二(Lv159),65/65,大井改二(Lv57),40/43,秋月改(Lv142),42/42," +\r
154                 "潜水ヨ級(elite),34/34,潜水ヨ級,5/24,潜水ヨ級,0/24,潜水カ級(elite),0/27,潜水カ級,0/19,潜水カ級,0/19,248~249,0,制空権確保,4-2|"\r
155                 == result);\r
156         }\r
157 \r
158         /// <summary>\r
159         /// 7隻編成の場合は7隻目を6隻目に重ねる\r
160         /// </summary>\r
161         [TestMethod]\r
162         public void InspectShip7BattleResult()\r
163         {\r
164             var sniffer = new Sniffer();\r
165             var result = "";\r
166             sniffer.SetLogWriter((path, s, h) => { result += s + "|"; }, () => new DateTime(2017, 1, 1));\r
167             sniffer.EnableLog(LogType.Battle);\r
168             SnifferTest.SniffLogFile(sniffer, "ship7battle_001");\r
169             PAssert.That(() =>\r
170                 "2017-01-01 00:00:00,台湾沖/ルソン島沖,5,出撃,S,同航戦,単縦陣,単縦陣,深海通商破部隊 前衛水雷戦隊,,," +\r
171                 "あきつ丸改(Lv81),40/40,那智改二(Lv151),63/63,Roma改(Lv99),83/92,阿武隈改二(Lv98),40/45,霞改二(Lv96),13/31,潮改二(Lv94)・不知火改(Lv85),31/33・32/32," +\r
172                 "軽巡ホ級(flagship),0/53,駆逐ロ級後期型,0/37,駆逐ロ級後期型,0/37,駆逐ロ級後期型,0/37,駆逐イ級,0/20,駆逐イ級,0/20,317~318,0,制空権確保,40-2|"\r
173                 == result);\r
174         }\r
175 \r
176         /// <summary>\r
177         /// 6隻未満の場合\r
178         /// </summary>\r
179         [TestMethod]\r
180         public void InspectShip2BattleResult()\r
181         {\r
182             var sniffer = new Sniffer();\r
183             var result = "";\r
184             sniffer.SetLogWriter((path, s, h) => { result += s + "|"; }, () => new DateTime(2019, 1, 1));\r
185             sniffer.EnableLog(LogType.Battle);\r
186             SnifferTest.SniffLogFile(sniffer, "battle_003");\r
187             Assert.IsFalse(sniffer.IsBattleResultError);\r
188             Assert.AreEqual("2019-01-01 00:00:00,鎮守府正面海域,1,出撃,S,反航戦,単縦陣,単縦陣,敵偵察艦,駆逐艦,睦月," +\r
189                             "早波改(Lv54),32/32,五月雨(Lv20),16/16,,,,,,,,,駆逐ハ級,0/24,,,,,,,,,,,0,0,,1-1|",\r
190                 result);\r
191         }\r
192 \r
193         /// <summary>\r
194         /// 基地空襲戦\r
195         /// </summary>\r
196         [TestMethod]\r
197         public void InspectAirRaidBattle()\r
198         {\r
199             var sniffer = new Sniffer();\r
200             var result = "";\r
201             sniffer.SetLogWriter((path, s, h) => { result += s + "|"; }, () => new DateTime(2019, 1, 1));\r
202             sniffer.EnableLog(LogType.Battle);\r
203             SnifferTest.SniffLogFile(sniffer, "airraid_battle_001");\r
204             Assert.AreEqual("2019-01-01 00:00:00,アリューシャン列島沖,12,出撃,S,同航戦,単縦陣,輪形陣,,,," +\r
205                             "基地航空隊1(Lv0),200/200,基地航空隊2(Lv0),200/200,基地航空隊3(Lv0),200/200,,,,,,," +\r
206                             "北方棲妹,790/790,砲台小鬼,130/130,砲台小鬼,130/130,飛行場姫,500/500,飛行場姫,500/500,集積地棲姫,600/600,425~426,231,航空優勢,44-3|",\r
207                 result);\r
208         }\r
209 \r
210         /// <summary>\r
211         /// ボス前の基地空襲戦\r
212         /// </summary>\r
213         [TestMethod]\r
214         public void InspectAirRaidBattleBeforeBoss()\r
215         {\r
216             var sniffer = new Sniffer();\r
217             var result = "";\r
218             sniffer.SetLogWriter((path, s, h) => { result += s + "|"; }, () => new DateTime(2019, 1, 1));\r
219             sniffer.EnableLog(LogType.Battle);\r
220             SnifferTest.SniffLogFile(sniffer, "airraid_battle_003");\r
221             Assert.AreEqual("2019-01-01 00:00:00,北太平洋ハワイ諸島戦域,22,出撃,A,T字戦(不利),単縦陣,輪形陣,,,," +\r
222                             "基地航空隊1(Lv0),200/200,基地航空隊2(Lv0),188/200,基地航空隊3(Lv0),200/200,,,,,,," +\r
223                             "中枢棲姫,900/900,飛行場姫,500/500,飛行場姫,500/500,飛行場姫,500/500,砲台小鬼,130/130,集積地棲姫,600/600,471~473,212,航空優勢,44-4|",\r
224                 result);\r
225         }\r
226 \r
227         [TestMethod]\r
228         public void InspectMaterial()\r
229         {\r
230             var sniffer = new Sniffer();\r
231             var result = "";\r
232             var first = new DateTime(2015, 1, 1, 0, 0, 0);\r
233             var queue =\r
234                 new Queue<DateTime>(new[] {first, first.AddMinutes(10), first.AddMinutes(15), first.AddMinutes(20)});\r
235             sniffer.SetLogWriter((path, s, h) => { result += s + "|"; }, queue.Dequeue);\r
236             sniffer.EnableLog(LogType.Material);\r
237             SnifferTest.SniffLogFile(sniffer, "material_001");\r
238             PAssert.That(() => "2015-01-01 00:00:00,26178,26742,21196,33750,1426,1574,2185,10|" +\r
239                                "2015-01-01 00:10:00,24595,25353,18900,32025,1427,1576,2187,10|" +\r
240                                "2015-01-01 00:20:00,23463,25064,17314,31765,1427,1572,2187,10|"\r
241                                == result);\r
242         }\r
243 \r
244         [TestMethod]\r
245         public void InspectCreateItem()\r
246         {\r
247             var sniffer = new Sniffer();\r
248             var result = "";\r
249             sniffer.SetLogWriter((path, s, h) => { result += s + "|"; }, () => new DateTime(2015, 1, 1));\r
250             sniffer.EnableLog(LogType.CreateItem);\r
251             SnifferTest.SniffLogFile(sniffer, "createitem_001");\r
252             PAssert.That(() => "2015-01-01 00:00:00,12cm単装砲,小口径主砲,10,10,30,10,綾波改二(145),120|" +\r
253                                "2015-01-01 00:00:00,失敗,,10,10,30,10,綾波改二(145),120|"\r
254                                == result);\r
255         }\r
256 \r
257         [TestMethod]\r
258         public void InspectCreateItemMulti()\r
259         {\r
260             var sniffer = new Sniffer();\r
261             var result = "";\r
262             sniffer.SetLogWriter((path, s, h) => { result += s + "|"; }, () => new DateTime(2019, 1, 1));\r
263             sniffer.EnableLog(LogType.CreateItem);\r
264             SnifferTest.SniffLogFile(sniffer, "createitem_002");\r
265             Assert.AreEqual("2019-01-01 00:00:00,失敗,,10,10,30,10,大淀改(167),120|" +\r
266                             "2019-01-01 00:00:00,61cm三連装魚雷,魚雷,10,10,30,10,大淀改(167),120|" +\r
267                             "2019-01-01 00:00:00,失敗,,10,10,30,10,大淀改(167),120|",\r
268                 result);\r
269         }\r
270 \r
271         [TestMethod]\r
272         public void InspectGetShip()\r
273         {\r
274             var sniffer = new Sniffer();\r
275             var result = "";\r
276             sniffer.SetLogWriter((path, s, h) => { result += s + "|"; }, () => new DateTime(2015, 1, 1));\r
277             sniffer.EnableLog(LogType.CreateShip);\r
278             SnifferTest.SniffLogFile(sniffer, "createship_001");\r
279             PAssert.That(() => "2015-01-01 00:00:00,通常艦建造,雷,駆逐艦,30,30,30,30,1,1,綾波改二(145),120|" +\r
280                                "2015-01-01 00:00:00,大型艦建造,霧島,巡洋戦艦,1500,1500,2000,1000,1,0,綾波改二(145),120|"\r
281                                == result);\r
282         }\r
283 \r
284         [TestMethod]\r
285         public void InspectRemodelSlot()\r
286         {\r
287             var sniffer = new Sniffer();\r
288             var result = "";\r
289             sniffer.SetLogWriter((path, s, h) => { result += s + "|"; }, () => new DateTime(2015, 1, 1));\r
290             sniffer.EnableLog(LogType.RemodelSlot);\r
291             SnifferTest.SniffLogFile(sniffer, "remodel_slot_001");\r
292             PAssert.That(() => "2015-01-01 00:00:00,12.7cm連装砲,4,○,,,,10,30,60,0,1,1,明石改(50),島風改(131)|" +\r
293                                "2015-01-01 00:00:00,12.7cm連装砲,5,×,,,,10,30,60,0,1,1,明石改(50),|" +\r
294                                "2015-01-01 00:00:00,12.7cm連装砲,7,○,,12.7cm連装砲,1,10,30,60,0,1,1,明石改(50),島風改(131)|" +\r
295                                "2015-01-01 00:00:00,91式高射装置,10,○,○,10cm連装高角砲,2,0,0,60,40,9,7,明石改(50),摩耶改(98)|"\r
296                                == result);\r
297         }\r
298 \r
299         private JsonObject Js(object obj) => new JsonObject(obj);\r
300 \r
301         [TestMethod]\r
302         public void Achievement()\r
303         {\r
304             var logger = new Logger(null, null, null);\r
305             logger.EnableLog(LogType.Achievement);\r
306             var result = "";\r
307             var dateEnum = new[]\r
308             {\r
309                 new DateTime(2017, 3, 31, 21, 0, 0),\r
310                 new DateTime(2017, 3, 31, 22, 0, 0),\r
311                 new DateTime(2017, 4, 1, 1, 0, 0),\r
312                 new DateTime(2017, 4, 1, 2, 0, 0),\r
313                 new DateTime(2017, 4, 1, 3, 0, 0),\r
314                 new DateTime(2017, 4, 2, 2, 0, 0),\r
315                 new DateTime(2017, 4, 2, 3, 0, 0),\r
316                 new DateTime(2017, 4, 2, 4, 0, 0)\r
317             }.GetEnumerator();\r
318             logger.SetWriter((path, s, h) => { result += s + "|"; }, () =>\r
319             {\r
320                 dateEnum.MoveNext();\r
321                 // ReSharper disable once PossibleNullReferenceException\r
322                 return (DateTime)dateEnum.Current;\r
323             });\r
324             for (var i = 0; i < 6; i++)\r
325                 logger.InspectBasic(Js(new {api_experience = i * 1000}));\r
326             logger.InspectBattleResult(Js(new {api_get_exmap_rate = "100"}));\r
327             logger.InspectMapNext(Js(new\r
328                 {api_maparea_id = 0, api_mapinfo_no = 0, api_no = 0, api_event_id = 0, api_get_eo_rate = 75}));\r
329             PAssert.That(() =>\r
330                 "2017-03-31 21:00:00,0,0|2017-03-31 21:00:00,0,0|2017-03-31 22:00:00,1000,0|" +\r
331                 "2017-04-01 03:00:00,4000,0|2017-04-02 02:00:00,5000,0|" +\r
332                 "2017-04-02 03:00:00,5000,100|2017-04-02 04:00:00,5000,75|"\r
333                 == result);\r
334         }\r
335 \r
336         [TestMethod]\r
337         public void InspectClearItemGet()\r
338         {\r
339             var sniffer = new Sniffer();\r
340             var result = "";\r
341             sniffer.SetLogWriter((path, s, h) => { result += s + "|"; }, () => new DateTime(2017, 5, 1));\r
342             sniffer.EnableLog(LogType.Achievement);\r
343             SnifferTest.SniffLogFile(sniffer, "clearitemget_001");\r
344             PAssert.That(() =>\r
345                 "2017-05-01 00:00:00,45417045,0|2017-05-01 00:00:00,45417045,350|" == result);\r
346         }\r
347 \r
348         /// <summary>\r
349         /// 晴嵐(六三一空)任務の場合はapi_bounus_countがない\r
350         /// </summary>\r
351         [TestMethod]\r
352         public void InspectClearItemGetSeiran631Ku()\r
353         {\r
354             var sniffer = new Sniffer(true);\r
355             sniffer.SetLogWriter((path, s, h) => { }, () => new DateTime(2017, 5, 1));\r
356             sniffer.EnableLog(LogType.Achievement);\r
357             sniffer.Sniff("/kcsapi/api_req_quest/clearitemget",\r
358                 "api%5Fquest%5Fid=656&api%5Fverno=1",\r
359                 JsonObject.Parse(\r
360                     @"{""api_result"":1,""api_result_msg"":""成功"",""api_data"":\r
361                     {""api_material"":[0,0,0,0],""api_bounus"":[\r
362                     {""api_type"":15,""api_count"":1,""api_item"":{""api_id_from"":9999,""api_id_to"":9999,\r
363                     ""api_message"":""第一潜水隊運用航空隊:「晴嵐(六三一空)」の新編成を<br>完了しました!""}}\r
364                     ]}}"));\r
365         }\r
366     }\r
367 }