OSDN Git Service

バージョン10.8の準備
[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 Microsoft.VisualStudio.TestTools.UnitTesting;\r
20 using Moq;\r
21 \r
22 namespace KancolleSniffer.Test\r
23 {\r
24     [TestClass]\r
25     public class LoggerTest\r
26     {\r
27         [TestInitialize]\r
28         public void Intialize()\r
29         {\r
30             ExpressionToCodeConfiguration.GlobalAssertionConfiguration = ExpressionToCodeConfiguration\r
31                 .GlobalAssertionConfiguration.WithPrintedListLengthLimit(200).WithMaximumValueLength(1000);\r
32         }\r
33 \r
34         [TestMethod]\r
35         public void InspectMissionResult()\r
36         {\r
37             var sniffer = new Sniffer();\r
38             var result = "";\r
39             var header = "";\r
40             sniffer.SetLogWriter((path, s, h) =>\r
41             {\r
42                 result += s + "|";\r
43                 header = h;\r
44             }, () => new DateTime(2015, 1, 1));\r
45             sniffer.SkipMaster();\r
46             sniffer.EnableLog(LogType.Mission);\r
47             SnifferTest.SniffLogFile(sniffer, "mission_result_001");\r
48             PAssert.That(() => "日付,結果,遠征,燃料,弾薬,鋼材,ボーキ,開発資材,高速修復材,高速建造材" == header);\r
49             PAssert.That(() => "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,0,0|" +\r
50                                "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,1,0|" +\r
51                                "2015-01-01 00:00:00,大成功,MO作戦,0,0,360,420,1,0,0|" +\r
52                                "2015-01-01 00:00:00,失敗,東京急行(弐),0,0,0,0,0,0,0|"\r
53                                == result);\r
54         }\r
55 \r
56         /// <summary>\r
57         /// 出力先に書けないときは一時ファイルに書き込む\r
58         /// </summary>\r
59         [TestMethod]\r
60         public void WriteTmpFileWhenCantWriteTarget()\r
61         {\r
62             var mock = new Mock<LogWriter.IFile>();\r
63             var writer = new LogWriter(null, mock.Object);\r
64 \r
65             const string str = "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,0,0";\r
66             var tmp = "";\r
67             mock.Setup(l => l.AppendAllText(It.IsAny<string>(), It.IsAny<string>()))\r
68                 .Callback<string, string>((file, s) =>\r
69                 {\r
70                     if (file.EndsWith(".csv"))\r
71                         throw new IOException();\r
72                     if (file.EndsWith(".tmp"))\r
73                         tmp += s;\r
74                 });\r
75             mock.SetupSequence(l => l.Exists(It.IsAny<string>())).Returns(false).Returns(true);\r
76             writer.Write("遠征報告書", str, "");\r
77             PAssert.That(() => "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,0,0\r\n" == tmp);\r
78         }\r
79 \r
80         [TestMethod]\r
81         public void MergeTmpFile()\r
82         {\r
83             MergeTmpFileMain(false);\r
84         }\r
85 \r
86         [TestMethod]\r
87         public void FaileToMergeTmpFile()\r
88         {\r
89             MergeTmpFileMain(true);\r
90         }\r
91 \r
92         private void MergeTmpFileMain(bool failToMerge)\r
93         {\r
94             var mock = new Mock<LogWriter.IFile>();\r
95             var writer = new LogWriter(null, mock.Object);\r
96 \r
97             var tmp = "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,0,0\r\n";\r
98             var csv = "";\r
99             mock.Setup(l => l.Exists(It.IsAny<string>())).Returns(true);\r
100             mock.Setup(l => l.ReadAllText(It.IsAny<string>()))\r
101                 .Returns((string path) => path.EndsWith(".tmp") ? tmp : "");\r
102             mock.Setup(l => l.AppendAllText(It.IsAny<string>(), It.IsAny<string>()))\r
103                 .Callback<string, string>((file, s) =>\r
104                 {\r
105                     if (file.EndsWith(".tmp"))\r
106                         tmp += s;\r
107                     if (file.EndsWith(".csv"))\r
108                     {\r
109                         if (failToMerge)\r
110                             throw new IOException();\r
111                         csv += s;\r
112                     }\r
113                 });\r
114             const string str = "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,1,0";\r
115             writer.Write("遠征報告書", str, "");\r
116             var result = failToMerge ? tmp : csv;\r
117             PAssert.That(() =>\r
118                 "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,0,0\r\n" +\r
119                 "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,1,0\r\n" == result);\r
120         }\r
121 \r
122         [TestMethod]\r
123         public void InspectBattleResult()\r
124         {\r
125             var sniffer = new Sniffer();\r
126             var result = "";\r
127             sniffer.SetLogWriter((path, s, h) => { result += s + "|"; }, () => new DateTime(2017, 1, 1));\r
128             sniffer.EnableLog(LogType.Battle);\r
129             SnifferTest.SniffLogFile(sniffer, "battle_001");\r
130             PAssert.That(() =>\r
131                 "2017-01-01 00:00:00,カレー洋制圧戦,1,出撃,A,T字戦(有利),警戒陣,梯形陣,敵潜水教導艦隊,,," +\r
132                 "隼鷹改二(Lv157),57/62,利根改二(Lv151),66/66,千代田航改二(Lv159),50/65,千歳航改二(Lv159),65/65,大井改二(Lv57),40/43,秋月改(Lv142),42/42," +\r
133                 "潜水ヨ級(elite),34/34,潜水ヨ級,5/24,潜水ヨ級,0/24,潜水カ級(elite),0/27,潜水カ級,0/19,潜水カ級,0/19,248~249,0,制空権確保|"\r
134                 == result);\r
135         }\r
136 \r
137         /// <summary>\r
138         /// 7隻編成の場合は7隻目を6隻目に重ねる\r
139         /// </summary>\r
140         [TestMethod]\r
141         public void InspectShip7BattleResult()\r
142         {\r
143             var sniffer = new Sniffer();\r
144             var result = "";\r
145             sniffer.SetLogWriter((path, s, h) => { result += s + "|"; }, () => new DateTime(2017, 1, 1));\r
146             sniffer.EnableLog(LogType.Battle);\r
147             SnifferTest.SniffLogFile(sniffer, "ship7battle_001");\r
148             PAssert.That(() =>\r
149                 "2017-01-01 00:00:00,台湾沖/ルソン島沖,5,出撃,S,同航戦,単縦陣,単縦陣,深海通商破部隊 前衛水雷戦隊,,," +\r
150                 "あきつ丸改(Lv81),40/40,那智改二(Lv151),63/63,Roma改(Lv99),83/92,阿武隈改二(Lv98),40/45,霞改二(Lv96),13/31,潮改二(Lv94)・不知火改(Lv85),31/33・32/32," +\r
151                 "軽巡ホ級(flagship),0/53,駆逐ロ級後期型,0/37,駆逐ロ級後期型,0/37,駆逐ロ級後期型,0/37,駆逐イ級,0/20,駆逐イ級,0/20,317~318,0,制空権確保|"\r
152                 == result);\r
153         }\r
154 \r
155         [TestMethod]\r
156         public void InspectMaterial()\r
157         {\r
158             var sniffer = new Sniffer();\r
159             var result = "";\r
160             var first = new DateTime(2015, 1, 1, 0, 0, 0);\r
161             var queue =\r
162                 new Queue<DateTime>(new[] {first, first.AddMinutes(10), first.AddMinutes(15), first.AddMinutes(20)});\r
163             sniffer.SetLogWriter((path, s, h) => { result += s + "|"; }, queue.Dequeue);\r
164             sniffer.EnableLog(LogType.Material);\r
165             SnifferTest.SniffLogFile(sniffer, "material_001");\r
166             PAssert.That(() => "2015-01-01 00:00:00,26178,26742,21196,33750,1426,1574,2185,10|" +\r
167                                "2015-01-01 00:10:00,24595,25353,18900,32025,1427,1576,2187,10|" +\r
168                                "2015-01-01 00:20:00,23463,25064,17314,31765,1427,1572,2187,10|"\r
169                                == result);\r
170         }\r
171 \r
172         [TestMethod]\r
173         public void InspectCreateItem()\r
174         {\r
175             var sniffer = new Sniffer();\r
176             var result = "";\r
177             sniffer.SetLogWriter((path, s, h) => { result += s + "|"; }, () => new DateTime(2015, 1, 1));\r
178             sniffer.EnableLog(LogType.CreateItem);\r
179             SnifferTest.SniffLogFile(sniffer, "createitem_001");\r
180             PAssert.That(() => "2015-01-01 00:00:00,12cm単装砲,小口径主砲,10,10,30,10,綾波改二(145),120|" +\r
181                                "2015-01-01 00:00:00,失敗,,10,10,30,10,綾波改二(145),120|"\r
182                                == result);\r
183         }\r
184 \r
185         [TestMethod]\r
186         public void InspectGetShip()\r
187         {\r
188             var sniffer = new Sniffer();\r
189             var result = "";\r
190             sniffer.SetLogWriter((path, s, h) => { result += s + "|"; }, () => new DateTime(2015, 1, 1));\r
191             sniffer.EnableLog(LogType.CreateShip);\r
192             SnifferTest.SniffLogFile(sniffer, "createship_001");\r
193             PAssert.That(() => "2015-01-01 00:00:00,通常艦建造,雷,駆逐艦,30,30,30,30,1,1,綾波改二(145),120|" +\r
194                                "2015-01-01 00:00:00,大型艦建造,霧島,巡洋戦艦,1500,1500,2000,1000,1,0,綾波改二(145),120|"\r
195                                == result);\r
196         }\r
197 \r
198         [TestMethod]\r
199         public void InspectRemodelSlot()\r
200         {\r
201             var sniffer = new Sniffer();\r
202             var result = "";\r
203             sniffer.SetLogWriter((path, s, h) => { result += s + "|"; }, () => new DateTime(2015, 1, 1));\r
204             sniffer.EnableLog(LogType.RemodelSlot);\r
205             SnifferTest.SniffLogFile(sniffer, "remodel_slot_001");\r
206             PAssert.That(() => "2015-01-01 00:00:00,12.7cm連装砲,4,○,,,,10,30,60,0,1,1,明石改(50),島風改(131)|" +\r
207                                "2015-01-01 00:00:00,12.7cm連装砲,5,×,,,,10,30,60,0,1,1,明石改(50),|" +\r
208                                "2015-01-01 00:00:00,12.7cm連装砲,7,○,,12.7cm連装砲,1,10,30,60,0,1,1,明石改(50),島風改(131)|" +\r
209                                "2015-01-01 00:00:00,91式高射装置,10,○,○,10cm連装高角砲,2,0,0,60,40,9,7,明石改(50),摩耶改(98)|"\r
210                                == result);\r
211         }\r
212 \r
213         [TestMethod]\r
214         public void Achievement()\r
215         {\r
216             var logger = new Logger(null, null, null);\r
217             logger.EnableLog(LogType.Achivement);\r
218             var result = "";\r
219             var dateEnum = new[]\r
220             {\r
221                 new DateTime(2017, 3, 31, 21, 0, 0),\r
222                 new DateTime(2017, 3, 31, 22, 0, 0),\r
223                 new DateTime(2017, 4, 1, 1, 0, 0),\r
224                 new DateTime(2017, 4, 1, 2, 0, 0),\r
225                 new DateTime(2017, 4, 1, 3, 0, 0),\r
226                 new DateTime(2017, 4, 2, 2, 0, 0),\r
227                 new DateTime(2017, 4, 2, 3, 0, 0),\r
228                 new DateTime(2017, 4, 2, 4, 0, 0)\r
229             }.GetEnumerator();\r
230             logger.SetWriter((path, s, h) => { result += s + "|"; }, () =>\r
231             {\r
232                 dateEnum.MoveNext();\r
233                 // ReSharper disable once PossibleNullReferenceException\r
234                 return (DateTime)dateEnum.Current;\r
235             });\r
236             for (var i = 0; i < 6; i++)\r
237                 logger.InspectBasic(JsonParser.Parse($"{{\"api_experience\": {i * 1000}}}"));\r
238             logger.InspectBattleResult(JsonParser.Parse("{\"api_get_exmap_rate\": \"100\"}"));\r
239             logger.InspectMapNext(JsonParser.Parse("{\"api_get_eo_rate\": 75}"));\r
240             PAssert.That(() =>\r
241                 "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
242                 "2017-04-01 03:00:00,4000,0|2017-04-02 02:00:00,5000,0|" +\r
243                 "2017-04-02 03:00:00,5000,100|2017-04-02 04:00:00,5000,75|"\r
244                 == result);\r
245         }\r
246 \r
247         [TestMethod]\r
248         public void InspectClearItemGet()\r
249         {\r
250             var sniffer = new Sniffer();\r
251             var result = "";\r
252             sniffer.SetLogWriter((path, s, h) => { result += s + "|"; }, () => new DateTime(2017, 5, 1));\r
253             sniffer.EnableLog(LogType.Achivement);\r
254             SnifferTest.SniffLogFile(sniffer, "clearitemget_001");\r
255             PAssert.That(() =>\r
256                 "2017-05-01 00:00:00,45417045,0|2017-05-01 00:00:00,45417045,350|" == result);\r
257         }\r
258 \r
259         /// <summary>\r
260         /// 晴嵐(六三一空)任務の場合はapi_bounus_countがない\r
261         /// </summary>\r
262         [TestMethod]\r
263         public void InspectClearItemGetSeiran631Ku()\r
264         {\r
265             var sniffer = new Sniffer(true);\r
266             sniffer.SetLogWriter((path, s, h) => { }, () => new DateTime(2017, 5, 1));\r
267             sniffer.EnableLog(LogType.Achivement);\r
268             sniffer.Sniff("/kcsapi/api_req_quest/clearitemget",\r
269                 "api%5Fquest%5Fid=656&api%5Fverno=1",\r
270                 JsonParser.Parse(\r
271                     @"{""api_result"":1,""api_result_msg"":""成功"",""api_data"":\r
272                     {""api_material"":[0,0,0,0],""api_bounus"":[\r
273                     {""api_type"":15,""api_count"":1,""api_item"":{""api_id_from"":9999,""api_id_to"":9999,\r
274                     ""api_message"":""第一潜水隊運用航空隊:「晴嵐(六三一空)」の新編成を<br>完了しました!""}}\r
275                     ]}}"));\r
276         }\r
277     }\r
278 }