OSDN Git Service

連合艦隊時の僚艦夜戦突撃で第一旗艦に発動マークが付くのを直す
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer.Test / BattleTest.cs
1 // Copyright (C) 2018 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.Collections.Generic;\r
16 using System.Linq;\r
17 using ExpressionToCodeLib;\r
18 using KancolleSniffer.Model;\r
19 using Microsoft.VisualStudio.TestTools.UnitTesting;\r
20 \r
21 namespace KancolleSniffer.Test\r
22 {\r
23     using Sniffer = SnifferTest.TestingSniffer;\r
24     using static SnifferTest;\r
25 \r
26     [TestClass]\r
27     public class BattleTest\r
28     {\r
29         [ClassInitialize]\r
30         public static void Initialize(TestContext context)\r
31         {\r
32             ExpressionToCodeConfiguration.GlobalAssertionConfiguration = ExpressionToCodeConfiguration\r
33                 .GlobalAssertionConfiguration.WithPrintedListLengthLimit(200).WithMaximumValueLength(1000);\r
34         }\r
35 \r
36         /// <summary>\r
37         /// 4-2-1で開幕対潜雷撃を含む戦闘を行う\r
38         /// </summary>\r
39         [TestMethod]\r
40         public void NormalBattleWithVariousTypesOfAttack()\r
41         {\r
42             var sniffer = new Sniffer();\r
43             SniffLogFile(sniffer, "battle_001");\r
44             PAssert.That(() => sniffer.Battle.ResultRank == BattleResultRank.A);\r
45             AssertEqualBattleResult(sniffer,\r
46                 new[] {57, 66, 50, 65, 40, 42}, new[] {34, 5, 0, 0, 0, 0});\r
47         }\r
48 \r
49         private void AssertEqualBattleResult(Sniffer sniffer, IEnumerable<int> expected, IEnumerable<int> enemy,\r
50             string msg = null)\r
51         {\r
52             var result = sniffer.Fleets[0].Ships.Select(s => s.NowHp);\r
53             PAssert.That(() => expected.SequenceEqual(result), msg);\r
54             var enemyResult = sniffer.Battle.Result.Enemy.Main.Select(s => s.NowHp);\r
55             PAssert.That(() => enemy.SequenceEqual(enemyResult), msg);\r
56         }\r
57 \r
58         /// <summary>\r
59         /// 開幕夜戦で潜水艦同士がお見合いする\r
60         /// </summary>\r
61         [TestMethod]\r
62         public void SpMidnightWithoutBattle()\r
63         {\r
64             var sniffer = new Sniffer();\r
65             SniffLogFile(sniffer, "sp_midnight_001");\r
66             PAssert.That(() => sniffer.Battle.ResultRank == BattleResultRank.D);\r
67         }\r
68 \r
69         /// <summary>\r
70         /// 夜戦で戦艦が攻撃すると一回で三発分のデータが来る\r
71         /// そのうち存在しない攻撃はターゲット、ダメージともに-1になる\r
72         /// </summary>\r
73         [TestMethod]\r
74         public void BattleShipAttackInMidnight()\r
75         {\r
76             var sniffer = new Sniffer();\r
77             SniffLogFile(sniffer, "midnight_001");\r
78             PAssert.That(() => sniffer.Battle.ResultRank == BattleResultRank.S);\r
79         }\r
80 \r
81         /// <summary>\r
82         /// 7隻編成の戦闘で7隻目が攻撃される\r
83         /// </summary>\r
84         [TestMethod]\r
85         public void Ship7Battle()\r
86         {\r
87             var sniffer = new Sniffer();\r
88             SniffLogFile(sniffer, "ship7battle_001");\r
89             PAssert.That(() => sniffer.Battle.ResultRank == BattleResultRank.P);\r
90         }\r
91 \r
92         /// <summary>\r
93         /// 演習のあとのportで戦闘結果の検証を行わない\r
94         /// </summary>\r
95         [TestMethod]\r
96         public void NotVerifyBattleResultAfterPractice()\r
97         {\r
98             var sniffer = new Sniffer();\r
99             SniffLogFile(sniffer, "practice_001");\r
100             PAssert.That(() => !sniffer.IsBattleResultError);\r
101         }\r
102 \r
103         /// <summary>\r
104         /// 演習でダメコンを発動させない\r
105         /// </summary>\r
106         [TestMethod]\r
107         public void NotTriggerDameConInPractice()\r
108         {\r
109             var sniffer = new Sniffer();\r
110             SniffLogFile(sniffer, "practice_002");\r
111             PAssert.That(() => !sniffer.IsBattleResultError);\r
112         }\r
113 \r
114         /// <summary>\r
115         /// 演習中の艦を要修復リストに載せない\r
116         /// </summary>\r
117         [TestMethod]\r
118         public void DamagedShipListNotShowShipInPractice()\r
119         {\r
120             var sniffer = new Sniffer();\r
121             SniffLogFile(sniffer, "practice_003");\r
122             PAssert.That(() => sniffer.RepairList.Select(s => s.Name).SequenceEqual(new[] {"飛龍改二", "翔鶴改二"}));\r
123         }\r
124 \r
125         /// <summary>\r
126         /// 連合艦隊が開幕雷撃で被弾する\r
127         /// </summary>\r
128         [TestMethod]\r
129         public void OpeningTorpedoInCombinedBattle()\r
130         {\r
131             var sniffer = new Sniffer();\r
132             SniffLogFile(sniffer, "combined_battle_001");\r
133             PAssert.That(() => !sniffer.IsBattleResultError);\r
134         }\r
135 \r
136         /// <summary>\r
137         /// 連合艦隊が閉幕雷撃で被弾する\r
138         /// </summary>\r
139         [TestMethod]\r
140         public void ClosingTorpedoInCombinedBattle()\r
141         {\r
142             var sniffer = new Sniffer();\r
143             SniffLogFile(sniffer, "combined_battle_002");\r
144             PAssert.That(() => !sniffer.IsBattleResultError);\r
145         }\r
146 \r
147         /// <summary>\r
148         /// 第一が6隻未満の連合艦隊で戦闘する\r
149         /// </summary>\r
150         [TestMethod]\r
151         public void SmallCombinedFleetBattle()\r
152         {\r
153             var sniffer = new Sniffer();\r
154             SniffLogFile(sniffer, "combined_battle_003");\r
155             PAssert.That(() => !sniffer.IsBattleResultError);\r
156         }\r
157 \r
158         /// <summary>\r
159         /// 護衛退避する\r
160         /// </summary>\r
161         [TestMethod]\r
162         public void EscapeWithEscort()\r
163         {\r
164             var sniffer = new Sniffer();\r
165             SniffLogFile(sniffer, "escape_001");\r
166             var fleets = sniffer.Fleets;\r
167             PAssert.That(() => fleets[0].Ships[5].Escaped &&\r
168                                fleets[1].Ships[2].Escaped);\r
169         }\r
170 \r
171         /// <summary>\r
172         /// 開幕夜戦に支援が来る\r
173         /// </summary>\r
174         [TestMethod]\r
175         public void SpMidnightSupportAttack()\r
176         {\r
177             var sniffer = new Sniffer();\r
178             SniffLogFile(sniffer, "sp_midnight_002");\r
179             PAssert.That(() => !sniffer.IsBattleResultError);\r
180             PAssert.That(() => sniffer.Battle.SupportType == 2);\r
181         }\r
182 \r
183         /// <summary>\r
184         /// 払暁戦を行う\r
185         /// </summary>\r
186         [TestMethod]\r
187         public void NightToDay()\r
188         {\r
189             var sniffer = new Sniffer();\r
190             SniffLogFile(sniffer, "nighttoday_001");\r
191             PAssert.That(() => !sniffer.IsBattleResultError);\r
192         }\r
193 \r
194         /// <summary>\r
195         /// 第二期の開幕夜戦のセル情報を表示する\r
196         /// </summary>\r
197         [TestMethod]\r
198         // ReSharper disable once InconsistentNaming\r
199         public void SpMidnightIn2ndSequence()\r
200         {\r
201             var sniffer = new Sniffer();\r
202             SniffLogFile(sniffer, "sp_midnight_003");\r
203             PAssert.That(() => sniffer.CellInfo.Current == "1戦目(夜戦)");\r
204         }\r
205 \r
206         /// <summary>\r
207         /// 単艦退避する\r
208         /// </summary>\r
209         [TestMethod]\r
210         public void EscapeWithoutEscort()\r
211         {\r
212             var sniffer = new Sniffer();\r
213             SniffLogFile(sniffer, "escape_002");\r
214             PAssert.That(() => sniffer.Fleets[2].Ships[1].Escaped);\r
215             PAssert.That(() => !sniffer.IsBattleResultError);\r
216         }\r
217 \r
218         /// <summary>\r
219         /// 出撃時に大破している艦娘がいたら警告する\r
220         /// </summary>\r
221         [TestMethod]\r
222         public void DamagedShipWarningOnMapStart()\r
223         {\r
224             var sniffer = new Sniffer();\r
225             SniffLogFile(sniffer, "mapstart_001");\r
226             PAssert.That(() => sniffer.BadlyDamagedShips.SequenceEqual(new[] {"大潮"}));\r
227         }\r
228 \r
229         /// <summary>\r
230         /// 連合艦隊に大破艦がいる状態で第3艦隊が出撃したときに警告しない\r
231         /// </summary>\r
232         [TestMethod]\r
233         public void NotWarnDamagedShipInCombinedFleetOnMapStart()\r
234         {\r
235             var sniffer = new Sniffer();\r
236             SniffLogFile(sniffer, "mapstart_002");\r
237             PAssert.That(() => !sniffer.BadlyDamagedShips.Any());\r
238         }\r
239 \r
240         /// <summary>\r
241         /// 連合艦隊の第二旗艦の大破を警告しない\r
242         /// </summary>\r
243         [TestMethod]\r
244         public void NotWarnDamaged1StShipInGuardFleet()\r
245         {\r
246             var sniffer = new Sniffer();\r
247             SniffLogFile(sniffer, "combined_battle_004");\r
248             PAssert.That(() => !sniffer.BadlyDamagedShips.Any());\r
249         }\r
250 \r
251         /// <summary>\r
252         /// Nelson Touchに対応する\r
253         /// </summary>\r
254         [TestMethod]\r
255         public void NelsonTouch()\r
256         {\r
257             var sniffer = new Sniffer();\r
258             SniffLogFile(sniffer, "nelsontouch_001");\r
259             PAssert.That(() => !sniffer.IsBattleResultError);\r
260             PAssert.That(() => sniffer.Battle.Result.Friend.Main[0].SpecialAttack == ShipStatus.Attack.Fire);\r
261             PAssert.That(() => sniffer.Fleets[0].Ships[0].SpecialAttack == ShipStatus.Attack.Fired);\r
262             // ship_deckでフラグを引き継ぐ\r
263             SniffLogFile(sniffer, "nelsontouch_002");\r
264             PAssert.That(() => sniffer.Fleets[0].Ships[0].SpecialAttack == ShipStatus.Attack.Fired);\r
265             // 夜戦\r
266             var night = new Sniffer();\r
267             SniffLogFile(night, "nelsontouch_003");\r
268             PAssert.That(() => night.Battle.Result.Friend.Main[0].SpecialAttack == ShipStatus.Attack.Fire);\r
269             // 海戦をまたがってフラグを引き継ぐ\r
270             var fired = new Sniffer();\r
271             SniffLogFile(fired, "nelsontouch_004");\r
272             PAssert.That(() => fired.Fleets[0].Ships[0].SpecialAttack == ShipStatus.Attack.Fired);\r
273         }\r
274 \r
275         /// <summary>\r
276         /// 長門改二の一斉射に対応する\r
277         /// </summary>\r
278         [TestMethod]\r
279         // ReSharper disable once IdentifierTypo\r
280         public void NagatoSpecial()\r
281         {\r
282             var sniffer = new Sniffer();\r
283             SniffLogFile(sniffer, "nagatospecial_001");\r
284             PAssert.That(() => !sniffer.IsBattleResultError);\r
285             PAssert.That(() => sniffer.Battle.Result.Friend.Main[0].SpecialAttack == ShipStatus.Attack.Fire);\r
286             PAssert.That(() => sniffer.Fleets[0].Ships[0].SpecialAttack == ShipStatus.Attack.Fired);\r
287         }\r
288 \r
289         /// <summary>\r
290         /// 陸奥改二の一斉射に対応する\r
291         /// </summary>\r
292         [TestMethod]\r
293         // ReSharper disable once IdentifierTypo\r
294         public void MutsuSpecial()\r
295         {\r
296             var sniffer = new Sniffer();\r
297             SniffLogFile(sniffer, "mutsuspecial_001");\r
298             PAssert.That(() => !sniffer.IsBattleResultError);\r
299             PAssert.That(() => sniffer.Battle.Result.Friend.Main[0].SpecialAttack == ShipStatus.Attack.Fire);\r
300             PAssert.That(() => sniffer.Fleets[0].Ships[0].SpecialAttack == ShipStatus.Attack.Fired);\r
301         }\r
302 \r
303         /// <summary>\r
304         /// 連合艦隊時の僚艦夜戦突撃に対応する\r
305         /// </summary>\r
306         [TestMethod]\r
307         public void KongoSpecial()\r
308         {\r
309             var sniffer = new Sniffer();\r
310             SniffLogFile(sniffer, "kongospecial_001");\r
311             PAssert.That(() => !sniffer.IsBattleResultError);\r
312             PAssert.That(() => sniffer.Battle.Result.Friend.Guard[0].SpecialAttack == ShipStatus.Attack.Fire);\r
313             PAssert.That(() => sniffer.Fleets[1].Ships[0].SpecialAttack == ShipStatus.Attack.Fired);\r
314         }\r
315 \r
316         /// <summary>\r
317         /// レーダー射撃戦に対応する\r
318         /// </summary>\r
319         [TestMethod]\r
320         public void LdShooting()\r
321         {\r
322             var sniffer = new Sniffer();\r
323             SniffLogFile(sniffer, "ld_shooting_001");\r
324             PAssert.That(() => !sniffer.IsBattleResultError);\r
325         }\r
326 \r
327         /// <summary>\r
328         /// 敵連合艦隊の護衛の装備を正しく読み取る\r
329         /// </summary>\r
330         [TestMethod]\r
331         public void EnemyGuardSlot()\r
332         {\r
333             var sniffer = new Sniffer();\r
334             SniffLogFile(sniffer, "enemy_combined_001");\r
335             PAssert.That(() => sniffer.Battle.Result.Enemy.Guard[0].Slot[0].Spec.Id == 506);\r
336         }\r
337 \r
338         /// <summary>\r
339         /// 敵艦隊の制空値を計算する\r
340         /// </summary>\r
341         [TestMethod]\r
342         public void EnemyFighterPower()\r
343         {\r
344             var sniffer = new Sniffer();\r
345             SniffLogFile(sniffer, "enemy_combined_001");\r
346             var fp = sniffer.Battle.EnemyFighterPower;\r
347             PAssert.That(() => fp.AirCombat == 209 && fp.Interception == 212);\r
348         }\r
349 \r
350         /// <summary>\r
351         /// ダメコン進撃する\r
352         /// </summary>\r
353         [TestMethod]\r
354         public void NotWarnDamagedShipWithDamageControl()\r
355         {\r
356             var sniffer = new Sniffer();\r
357             SniffLogFile(sniffer, "damecon_advance_001");\r
358             PAssert.That(() => sniffer.BadlyDamagedShips.Length == 0);\r
359         }\r
360 \r
361         /// <summary>\r
362         /// 迎撃機ありの基地空襲戦\r
363         /// </summary>\r
364         [TestMethod]\r
365         public void AirRaidBattleWithInterceptor()\r
366         {\r
367             var sniffer = new Sniffer();\r
368             SniffLogFile(sniffer, "airraid_battle_001");\r
369             var battle = sniffer.Battle;\r
370             Assert.AreEqual(BattleState.AirRaid, battle.BattleState);\r
371             Assert.AreEqual(2, battle.AirControlLevel);\r
372             Assert.AreEqual(425, battle.FighterPower.Min);\r
373             Assert.AreEqual(231, battle.EnemyFighterPower.AirCombat);\r
374             Assert.AreEqual(BattleResultRank.S, battle.ResultRank);\r
375             var ships = battle.Result.Friend.Main;\r
376             Assert.IsTrue(new[] {200, 200, 200}.SequenceEqual(ships.Select(ship => ship.NowHp)));\r
377             Assert.IsTrue(new[] {"基地航空隊1", "基地航空隊2", "基地航空隊3"}.SequenceEqual(ships.Select(ship => ship.Name)));\r
378             Assert.IsTrue(\r
379                 new[] {"烈風改(三五二空/熟練)", "雷電", "雷電", "烈風改"}.SequenceEqual(ships[2].Slot.Select(item => item.Spec.Name)));\r
380             Assert.IsTrue(new[]{18, 18, 18, 18}.SequenceEqual(ships[2].OnSlot));\r
381         }\r
382 \r
383         /// <summary>\r
384         /// 迎撃機なしの基地航空戦\r
385         /// </summary>\r
386         [TestMethod]\r
387         public void AirRaidBattleWithoutInterceptor()\r
388         {\r
389             var sniffer = new Sniffer();\r
390             SniffLogFile(sniffer, "airraid_battle_002");\r
391             var battle = sniffer.Battle;\r
392             Assert.AreEqual(BattleState.AirRaid, battle.BattleState);\r
393             Assert.AreEqual(4, battle.AirControlLevel);\r
394             Assert.AreEqual(0, battle.FighterPower.Min);\r
395             Assert.AreEqual(231, battle.EnemyFighterPower.AirCombat);\r
396             Assert.AreEqual(BattleResultRank.B, battle.ResultRank);\r
397             var ships = battle.Result.Friend.Main;\r
398             Assert.IsTrue(new[] {82, 174, 147}.SequenceEqual(ships.Select(ship => ship.NowHp)));\r
399         }\r
400 \r
401         /// <summary>\r
402         /// 基地航空戦直後のボス戦\r
403         /// </summary>\r
404         [TestMethod]\r
405         public void AirRaidBattleBeforeBoss()\r
406         {\r
407             var sniffer = new Sniffer();\r
408             SniffLogFile(sniffer, "airraid_battle_004");\r
409             var battle = sniffer.Battle;\r
410             Assert.AreEqual(BattleState.Result, battle.BattleState);\r
411             Assert.AreEqual(0, sniffer.BadlyDamagedShips.Length);\r
412         }\r
413 \r
414         /// <summary>\r
415         /// 緊急泊地修理\r
416         /// </summary>\r
417         [TestMethod]\r
418         public void AnchorageRepair()\r
419         {\r
420             var sniffer = new Sniffer();\r
421             SniffLogFile(sniffer, "anchorage_repair_001");\r
422             PAssert.That(() => !sniffer.IsBattleResultError);\r
423         }\r
424 \r
425         /// <summary>\r
426         /// 大破進撃しても平気なマスでの大破警告抑制\r
427         /// </summary>\r
428         [TestMethod]\r
429         public void IgnoreDamagedShips()\r
430         {\r
431             var sniffer = new Sniffer();\r
432             SniffLogFile(sniffer, "endpoint_001");\r
433             PAssert.That(() => sniffer.BadlyDamagedShips.Length == 0);\r
434         }\r
435     }\r
436 }