OSDN Git Service

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