OSDN Git Service

一覧ウィンドウに海域ゲージの情報を表示する
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer.Test / SnifferTest.cs
1 // Copyright (C) 2014 Kazuhiro Fujieda <fujieda@users.osdn.me>\r
2 // \r
3 // This program is part of KancolleSniffer.\r
4 //\r
5 // KancolleSniffer is free software: you can redistribute it and/or modify\r
6 // it under the terms of the GNU General Public License as published by\r
7 // the Free Software Foundation, either version 3 of the License, or\r
8 // (at your option) any later version.\r
9 //\r
10 // This program is distributed in the hope that it will be useful,\r
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13 // GNU General Public License for more details.\r
14 //\r
15 // You should have received a copy of the GNU General Public License\r
16 // along with this program; if not, see <http://www.gnu.org/licenses/>.\r
17 \r
18 using System;\r
19 using System.Collections.Generic;\r
20 using System.IO;\r
21 using System.IO.Compression;\r
22 using System.Linq;\r
23 using Codeplex.Data;\r
24 using ExpressionToCodeLib;\r
25 using Microsoft.VisualStudio.TestTools.UnitTesting;\r
26 \r
27 namespace KancolleSniffer.Test\r
28 {\r
29     [TestClass]\r
30     public class SnifferTest\r
31     {\r
32         public static StreamReader OpenLogFile(string name)\r
33         {\r
34             var dir = Path.GetDirectoryName(Path.GetDirectoryName(Environment.CurrentDirectory));\r
35 // ReSharper disable once AssignNullToNotNullAttribute\r
36             var path = Path.Combine(dir, Path.Combine("logs", name + ".log.gz"));\r
37             return new StreamReader(new GZipStream(File.Open(path, FileMode.Open), CompressionMode.Decompress));\r
38         }\r
39 \r
40         public static void SniffLogFile(Sniffer sniffer, string name)\r
41         {\r
42             var ln = 0;\r
43             using (var stream = OpenLogFile(name))\r
44             {\r
45                 while (!stream.EndOfStream)\r
46                 {\r
47                     var triple = new List<string>();\r
48                     foreach (var s in new[] {"url: ", "request: ", "response: "})\r
49                     {\r
50                         var line = stream.ReadLine();\r
51                         ln++;\r
52                         if (line == null)\r
53                             throw new Exception($"ログのurl, request, responseがそろっていません: {ln:d}行目");\r
54                         if (!line.StartsWith(s))\r
55                             throw new Exception($"ログに不正な行が含まれています: {ln:d}行目");\r
56                         triple.Add(line.Substring(s.Count()));\r
57                     }\r
58                     var json = DynamicJson.Parse(triple[2]);\r
59                     sniffer.Sniff(triple[0], triple[1], json);\r
60                 }\r
61             }\r
62         }\r
63 \r
64         /// <summary>\r
65         ///  演習で受けたダメージが次の戦闘の結果に影響しない\r
66         /// </summary>\r
67         [TestMethod]\r
68         public void DamageInPracticeNotSpillIntoSortie()\r
69         {\r
70             var expected = new[] {31, 15, 15};\r
71             var sniffer = new Sniffer();\r
72             SniffLogFile(sniffer, "battle_001");\r
73             var result = sniffer.GetShipStatuses(0).Select(s => s.NowHp);\r
74             PAssert.That(() => (expected.SequenceEqual(result)));\r
75         }\r
76 \r
77         /// <summary>\r
78         /// 演習では大破警告を出さない\r
79         /// </summary>\r
80         [TestMethod]\r
81         public void IgnoreDamagedShipsInPractice()\r
82         {\r
83             var sniffer = new Sniffer();\r
84             SniffLogFile(sniffer, "practice_001");\r
85             PAssert.That(() => !sniffer.Battle.HasDamagedShip);\r
86         }\r
87 \r
88         /// <summary>\r
89         /// 夜戦のダメージを戦闘結果に反映する\r
90         /// </summary>\r
91         [TestMethod]\r
92         public void CaptureDamageInNightCombat()\r
93         {\r
94             var sniffer = new Sniffer();\r
95             SniffLogFile(sniffer, "battle_002");\r
96             AssertEqualBattleResult(sniffer, new[] {28, 1, 13});\r
97             PAssert.That(()=> sniffer.Battle.HasDamagedShip);\r
98         }\r
99 \r
100         private void AssertEqualBattleResult(Sniffer sniffer, IEnumerable<int> expected, string msg = null)\r
101         {\r
102             var result = sniffer.GetShipStatuses(0).Select(s => s.NowHp);\r
103             PAssert.That(() => (expected.SequenceEqual(result)), msg);\r
104         }\r
105 \r
106         /// <summary>\r
107         /// 連合艦隊(水上打撃部隊)による戦闘のダメージを結果に反映する\r
108         /// </summary>\r
109         [TestMethod]\r
110         public void CombinedFleetSurface()\r
111         {\r
112             var sniffer = new Sniffer();\r
113             SniffLogFile(sniffer, "combined_surface_001");\r
114             AssertEauqlCombinedResult(sniffer, new[] {40, 77, 77, 33, 51, 47}, new[] {39, 35, 11, 39, 37, 40});\r
115             PAssert.That(() => !sniffer.Battle.HasDamagedShip);\r
116 \r
117             SniffLogFile(sniffer, "combined_surface_002");\r
118             AssertEauqlCombinedResult(sniffer, new[] {40, 77, 77, 33, 15, 6}, new[] {39, 35, 4, 3, 14, 40});\r
119             PAssert.That(() => sniffer.Battle.HasDamagedShip);\r
120         }\r
121 \r
122         private void AssertEauqlCombinedResult(Sniffer sniffer, IEnumerable<int> expected0, IEnumerable<int> expected1, string msg = null)\r
123         {\r
124             var result0 = sniffer.GetShipStatuses(0).Select(s => s.NowHp);\r
125             var result1 = sniffer.GetShipStatuses(1).Select(s => s.NowHp);\r
126             PAssert.That(() => (expected0.SequenceEqual(result0) && expected1.SequenceEqual(result1)), msg);\r
127         }\r
128 \r
129         /// <summary>\r
130         /// 開幕夜戦のダメージを戦闘結果に反映する\r
131         /// </summary>\r
132         [TestMethod]\r
133         public void SpMidnight()\r
134         {\r
135             var sniffer = new Sniffer();\r
136             SniffLogFile(sniffer, "sp_midnight_001");\r
137             AssertEqualBattleResult(sniffer, new[] {1});\r
138             PAssert.That(() => sniffer.Battle.HasDamagedShip);\r
139         }\r
140 \r
141         /// <summary>\r
142         /// 連合艦隊(空母機動部隊)による戦闘のダメージを結果に反映する\r
143         /// </summary>\r
144         [TestMethod]\r
145         public void CombinedFleetAir()\r
146         {\r
147             var sniffer = new Sniffer();\r
148             SniffLogFile(sniffer, "combined_air_001");\r
149             AssertEauqlCombinedResult(sniffer, new[] {40, 98, 90, 66, 78, 86}, new[] {47, 41, 5, 42, 43, 29});\r
150             PAssert.That(() => sniffer.Battle.HasDamagedShip);\r
151 \r
152             SniffLogFile(sniffer, "combined_air_002");\r
153             AssertEauqlCombinedResult(sniffer, new[] {13, 87, 90, 59, 69, 86}, new[] {47, 41, 5, 20, 43, 29});\r
154         }\r
155 \r
156         /// <summary>\r
157         /// 護衛退避を正しく処理する\r
158         /// </summary>\r
159         [TestMethod]\r
160         public void EscapeShip()\r
161         {\r
162             var sniffer = new Sniffer();\r
163             SniffLogFile(sniffer, "combined_escape_001");\r
164             AssertEauqlCombinedResult(sniffer, new[]{37, 105, 106, 90, 66, 10}, new[]{41, 41, 37, 44, 43, 43}, "連合艦隊で2戦して大破が出るまで");\r
165             PAssert.That(() => sniffer.Battle.HasDamagedShip);\r
166             SniffLogFile(sniffer, "combined_escape_002");\r
167             PAssert.That(() => sniffer.GetShipStatuses(0)[5].Escaped && sniffer.GetShipStatuses(1)[1].Escaped, "続けて護衛退避を実行");\r
168             PAssert.That(() => !sniffer.Battle.HasDamagedShip);\r
169             SniffLogFile(sniffer, "combined_escape_003");\r
170             AssertEauqlCombinedResult(sniffer, new[] {37, 105, 106, 90, 1, 10}, new[] {41, 41, 32, 44, 43, 43}, "もう一戦して大破が出るまで");\r
171             PAssert.That(() => sniffer.Battle.HasDamagedShip);\r
172             SniffLogFile(sniffer, "combined_escape_004");\r
173             PAssert.That(() => sniffer.GetShipStatuses(0)[5].Escaped && sniffer.GetShipStatuses(1)[1].Escaped &&\r
174                 sniffer.GetShipStatuses(0)[4].Escaped && sniffer.GetShipStatuses(1)[2].Escaped, "続けて護衛退避を実行");\r
175             PAssert.That(() => !sniffer.Battle.HasDamagedShip);\r
176         }\r
177 \r
178         /// <summary>\r
179         /// 護衛退避した空母を除いた制空値を計算する\r
180         /// </summary>\r
181         [TestMethod]\r
182         public void FighterPowerWithoutEscapedShip()\r
183         {\r
184             var sniffer = new Sniffer();\r
185             SniffLogFile(sniffer, "combined_escape_001");\r
186             PAssert.That(() => sniffer.GetFighterPower(0) == 187);\r
187             SniffLogFile(sniffer, "combined_escape_002");\r
188             PAssert.That(() => sniffer.GetFighterPower(0) == 65);\r
189         }\r
190 \r
191         /// <summary>\r
192         /// 夜戦の開始時に昼戦の結果を反映する\r
193         /// </summary>\r
194         [TestMethod]\r
195         public void ResultOfDayBattleShowInNightBattle()\r
196         {\r
197             var sniffer = new Sniffer();\r
198             SniffLogFile(sniffer, "battle_003");\r
199             AssertEqualBattleResult(sniffer, new[] {28, 2, 13});\r
200             PAssert.That(() => !sniffer.Battle.HasDamagedShip, "夜戦の開始時は大破警告を出さない");\r
201         }\r
202 \r
203         /// <summary>\r
204         /// 通常艦隊の航空戦のダメージを結果に反映する\r
205         /// </summary>\r
206         [TestMethod]\r
207         public void AirBattle()\r
208         {\r
209             var sniffer = new Sniffer();\r
210             SniffLogFile(sniffer, "airbattle_001");\r
211             AssertEqualBattleResult(sniffer, new[]{37, 36, 31, 37, 17, 63}, "夜戦あり");\r
212 \r
213             sniffer = new Sniffer();\r
214             SniffLogFile(sniffer, "airbattle_002");\r
215             AssertEqualBattleResult(sniffer, new[] { 66, 36, 16, 27, 35, 38 }, "昼戦のみ");\r
216         }\r
217 \r
218         /// <summary>\r
219         /// 支援射撃による敵の損傷を勝利判定に反映させる\r
220         /// </summary>\r
221         [TestMethod]\r
222         public void SupportShellingChangeResultRank()\r
223         {\r
224             var sniffer = new Sniffer();\r
225             SniffLogFile(sniffer, "support_001");\r
226             PAssert.That(()=> sniffer.Battle.ResultRank == BattleResultRank.A);\r
227         }\r
228 \r
229         /// <summary>\r
230         /// ダメコンの使用を戦闘結果に反映させる\r
231         /// </summary>\r
232         [TestMethod]\r
233         public void DamageControl()\r
234         {\r
235             var sniffer = new Sniffer();\r
236             SniffLogFile(sniffer, "damecon_001");\r
237             AssertEqualBattleResult(sniffer, new[] {30, 1, 3}, "戦闘前");\r
238             PAssert.That(() => sniffer.GetShipStatuses(0)[1].Slot.SequenceEqual(new[] {2, 4593, -1, -1, -1}), "ダメコンを二つ装備");\r
239             PAssert.That(() => sniffer.Battle.ResultRank == BattleResultRank.S, "判定はS勝利");\r
240             SniffLogFile(sniffer, "damecon_002");\r
241             AssertEqualBattleResult(sniffer, new[] {30, 1, 3}, "戦闘後");\r
242             PAssert.That(() => sniffer.GetShipStatuses(0)[1].Slot.SequenceEqual(new[] {-1, 4593, -1, -1, -1}), "ダメコンを一つ消費");\r
243         }\r
244 \r
245         /// <summary>\r
246         /// 連合艦隊(水上打撃部隊)で二回目の砲撃戦がない場合を正しく処理する\r
247         /// </summary>\r
248         [TestMethod]\r
249         // ReSharper disable once InconsistentNaming\r
250         public void CombinedFleetSurfaceWithout2ndShelling()\r
251         {\r
252             var sniffer = new Sniffer();\r
253             SniffLogFile(sniffer, "combined_surface_003");\r
254             PAssert.That(() => sniffer.Battle.ResultRank == BattleResultRank.P);\r
255         }\r
256 \r
257         /// <summary>\r
258         /// ship2に代わるship_deckを処理する\r
259         /// </summary>\r
260         [TestMethod]\r
261         public void ShipDeck()\r
262         {\r
263             var sniffer = new Sniffer();\r
264             SniffLogFile(sniffer, "ship_deck_001");\r
265             PAssert.That(() => sniffer.GetShipStatuses(0)[0].Fuel == 36);\r
266         }\r
267 \r
268         /// <summary>\r
269         /// 夜戦かどうかを選択する画面でリロードしても結果を次の戦闘に持ち越さない\r
270         /// </summary>\r
271         [TestMethod]\r
272         public void ReloadBeforeBattleResult()\r
273         {\r
274             var sniffer = new Sniffer();\r
275             SniffLogFile(sniffer, "reload_001");\r
276             PAssert.That(() => sniffer.GetShipStatuses(0)[0].NowHp == 41);\r
277         }\r
278 \r
279         /// <summary>\r
280         /// 航空戦のない演習を正しく処理する\r
281         /// </summary>\r
282         [TestMethod]\r
283         public void PracticeWithoutAirBattle()\r
284         {\r
285             var sniffer = new Sniffer();\r
286             SniffLogFile(sniffer, "practice_002");\r
287             PAssert.That(() => sniffer.Battle.AirControlLevel == -1);\r
288         }\r
289 \r
290         /// <summary>\r
291         /// 2-5をクリアしたときの特別戦果を反映する\r
292         /// </summary>\r
293         [TestMethod]\r
294         public void ExMapBattleResult()\r
295         {\r
296             var sniffer0 = new Sniffer();\r
297             sniffer0.ExMap.ClearClearStatus();\r
298             SniffLogFile(sniffer0, "eo_001");\r
299             PAssert.That(() => sniffer0.ExMap.Achievement == 100, "ほかのマップの情報なし");\r
300             var sniffer1 = new Sniffer();\r
301             SniffLogFile(sniffer1, "eo_001");\r
302             // すでに3-5をクリアしているので合計で250\r
303             PAssert.That(() => sniffer1.ExMap.Achievement == 250, "ほかのマップの情報あり");\r
304         }\r
305 \r
306         /// <summary>\r
307         /// 1-6をクリアしたときの特別戦果を反映する\r
308         /// </summary>\r
309         [TestMethod]\r
310         public void ExMapMapNext()\r
311         {\r
312             var sniffer0 = new Sniffer();\r
313             sniffer0.ExMap.ClearClearStatus();\r
314             SniffLogFile(sniffer0, "eo_002");\r
315             PAssert.That(() => sniffer0.ExMap.Achievement == 75, "ほかのマップの情報なし");\r
316             var sniffer1 = new Sniffer();\r
317             SniffLogFile(sniffer1, "eo_002");\r
318             // 5-5以外クリアしているので合計で400\r
319             PAssert.That(()=> sniffer1.ExMap.Achievement == 400, "ほかのマップの情報あり");\r
320         }\r
321 \r
322         /// <summary>\r
323         /// 編成で空き番号を使ったローテートを正しく反映する\r
324         /// </summary>\r
325         [TestMethod]\r
326         public void RotateFleetMember()\r
327         {\r
328             var sniffer = new Sniffer();\r
329             SniffLogFile(sniffer, "deck_001");\r
330             var result = sniffer.GetDeck(0);\r
331             PAssert.That(() => new[] {756, 17204, 6156, 28806, 1069, -1}.SequenceEqual(result));\r
332         }\r
333 \r
334         /// <summary>\r
335         /// 編成で艦隊に配置ずみの艦娘を交換する\r
336         /// </summary>\r
337         [TestMethod]\r
338         public void ExchangeFleetMember()\r
339         {\r
340             var sniffer = new Sniffer();\r
341 \r
342             SniffLogFile(sniffer, "deck_002");\r
343             var result0 = sniffer.GetDeck(0);\r
344             PAssert.That(() => new[] {1069, 6156, 756, 3223, -1, -1}.SequenceEqual(result0), "編成で艦隊内で艦娘と交換する");\r
345 \r
346             SniffLogFile(sniffer, "deck_003");\r
347             var result10 = sniffer.GetDeck(0);\r
348             var result11 = sniffer.GetDeck(1);\r
349             PAssert.That(() => new[] {1069, 6156, 14258, 3223, -1, -1}.SequenceEqual(result10) &&\r
350                                new[] {101, 4487, 756, 14613, 28806, -1}.SequenceEqual(result11), "002に続いて艦隊をまたがって交換する");\r
351 \r
352             SniffLogFile(sniffer, "deck_004");\r
353             var result20 = sniffer.GetDeck(0);\r
354             var result21 = sniffer.GetDeck(1);\r
355             PAssert.That(() => new[] {1069, 6156, 14258, 3223, 756, -1}.SequenceEqual(result20) &&\r
356                                new[] {101, 4487, 14613, 28806, -1, -1}.SequenceEqual(result21),\r
357                 "003に続いて空き番号にほかの艦隊の艦娘を配置する");\r
358         }\r
359 \r
360         /// <summary>\r
361         /// 改修による資材の減少をすぐに反映する\r
362         /// </summary>\r
363         [TestMethod]\r
364         public void ConsumptionByRemodelSlot()\r
365         {\r
366             var sniffer = new Sniffer();\r
367             SniffLogFile(sniffer, "remodel_slot_001");\r
368             PAssert.That(() => sniffer.Item.MaterialHistory.Select(m => m.Now)\r
369                 .SequenceEqual(new[] {25292, 25570, 25244, 41113, 1405, 1525, 2137, 8}));\r
370         }\r
371 \r
372         /// <summary>\r
373         /// 装備の数を正しく数える\r
374         /// </summary>\r
375         [TestMethod]\r
376         public void CountItem()\r
377         {\r
378             var sniffer = new Sniffer();\r
379             SniffLogFile(sniffer, "createitem_001");\r
380             PAssert.That(() => sniffer.Item.NowEquips == 606);\r
381         }\r
382 \r
383         /// <summary>\r
384         /// 海域ゲージ情報を作成する\r
385         /// </summary>\r
386         [TestMethod]\r
387         public void MapInfo()\r
388         {\r
389             var sniffer = new Sniffer();\r
390             SniffLogFile(sniffer, "mapinfo_001");\r
391             PAssert.That(() => sniffer.MiscText ==\r
392                                "[海域ゲージ]\r\n" +\r
393                                "1-6 : 撃破 3/7\r\n5-5 : 撃破 0/5\r\n6-3 : 撃破 0/4\r\n" +\r
394                                "31-1 : HP 0/750\r\n31-2 : HP 0/1050\r\n31-3 : HP 0/2100\r\n31-4 : HP 0/3500\r\n31-5 : HP 1/2450\r\n",\r
395                 "最初の海域ゲージ情報");\r
396             SniffLogFile(sniffer, "mapinfo_002");\r
397             PAssert.That(() => sniffer.MiscText == "", "戦闘から戻ったらクリア");\r
398             SniffLogFile(sniffer, "mapinfo_003");\r
399             PAssert.That(() => sniffer.MiscText ==\r
400                                "[海域ゲージ]\r\n" +\r
401                                "1-6 : 撃破 4/7\r\n5-5 : 撃破 0/5\r\n6-3 : 撃破 0/4\r\n" +\r
402                                "31-1 : HP 0/750\r\n31-2 : HP 0/1050\r\n31-3 : HP 0/2100\r\n31-4 : HP 0/3500\r\n31-5 : HP 1/2450\r\n",\r
403                 "更新された海域ゲージ情報");\r
404         }\r
405     }\r
406 }