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 \r
271         /// <summary>\r
272         /// 長門改二の一斉射に対応する\r
273         /// </summary>\r
274         [TestMethod]\r
275         // ReSharper disable once IdentifierTypo\r
276         public void NagatoSpecial()\r
277         {\r
278             var sniffer = new Sniffer();\r
279             SniffLogFile(sniffer, "nagatospecial_001");\r
280             PAssert.That(() => !sniffer.IsBattleResultError);\r
281             PAssert.That(() => sniffer.Battle.Result.Friend.Main[0].SpecialAttack == ShipStatus.Attack.Fire);\r
282             PAssert.That(() => sniffer.Fleets[0].Ships[0].SpecialAttack == ShipStatus.Attack.Fired);\r
283         }\r
284 \r
285         /// <summary>\r
286         /// 陸奥改二の一斉射に対応する\r
287         /// </summary>\r
288         [TestMethod]\r
289         // ReSharper disable once IdentifierTypo\r
290         public void MutsuSpecial()\r
291         {\r
292             var sniffer = new Sniffer();\r
293             SniffLogFile(sniffer, "mutsuspecial_001");\r
294             PAssert.That(() => !sniffer.IsBattleResultError);\r
295             PAssert.That(() => sniffer.Battle.Result.Friend.Main[0].SpecialAttack == ShipStatus.Attack.Fire);\r
296             PAssert.That(() => sniffer.Fleets[0].Ships[0].SpecialAttack == ShipStatus.Attack.Fired);\r
297         }\r
298 \r
299         /// <summary>\r
300         /// レーダー射撃戦に対応する\r
301         /// </summary>\r
302         [TestMethod]\r
303         public void LdShooting()\r
304         {\r
305             var sniffer = new Sniffer();\r
306             SniffLogFile(sniffer, "ld_shooting_001");\r
307             PAssert.That(() => !sniffer.IsBattleResultError);\r
308         }\r
309 \r
310         /// <summary>\r
311         /// 敵連合艦隊の護衛の装備を正しく読み取る\r
312         /// </summary>\r
313         [TestMethod]\r
314         public void EnemyGuardSlot()\r
315         {\r
316             var sniffer = new Sniffer();\r
317             SniffLogFile(sniffer, "enemy_combined_001");\r
318             PAssert.That(() => sniffer.Battle.Result.Enemy.Guard[0].Slot[0].Spec.Id == 506);\r
319         }\r
320 \r
321         /// <summary>\r
322         /// 敵艦隊の制空値を計算する\r
323         /// </summary>\r
324         [TestMethod]\r
325         public void EnemyFighterPower()\r
326         {\r
327             var sniffer = new Sniffer();\r
328             SniffLogFile(sniffer, "enemy_combined_001");\r
329             var fp = sniffer.Battle.EnemyFighterPower;\r
330             PAssert.That(() => fp.AirCombat == 209 && fp.Interception == 212);\r
331         }\r
332 \r
333         /// <summary>\r
334         /// ダメコン進撃する\r
335         /// </summary>\r
336         [TestMethod]\r
337         public void NotWarnDamagedShipWithDamageControl()\r
338         {\r
339             var sniffer = new Sniffer();\r
340             SniffLogFile(sniffer, "damecon_advance_001");\r
341             PAssert.That(() => sniffer.BadlyDamagedShips.Length == 0);\r
342         }\r
343 \r
344         /// <summary>\r
345         /// 迎撃機ありの基地空襲戦\r
346         /// </summary>\r
347         [TestMethod]\r
348         public void AirRaidBattleWithInterceptor()\r
349         {\r
350             var sniffer = new Sniffer();\r
351             SniffLogFile(sniffer, "airraid_battle_001");\r
352             var battle = sniffer.Battle;\r
353             Assert.AreEqual(BattleState.AirRaid, battle.BattleState);\r
354             Assert.AreEqual(2, battle.AirControlLevel);\r
355             Assert.AreEqual(425, battle.FighterPower.Min);\r
356             Assert.AreEqual(231, battle.EnemyFighterPower.AirCombat);\r
357             Assert.AreEqual(BattleResultRank.S, battle.ResultRank);\r
358             var ships = battle.Result.Friend.Main;\r
359             Assert.IsTrue(new[] {200, 200, 200}.SequenceEqual(ships.Select(ship => ship.NowHp)));\r
360             Assert.IsTrue(new[] {"基地航空隊1", "基地航空隊2", "基地航空隊3"}.SequenceEqual(ships.Select(ship => ship.Name)));\r
361             Assert.IsTrue(\r
362                 new[] {"烈風改(三五二空/熟練)", "雷電", "雷電", "烈風改"}.SequenceEqual(ships[2].Slot.Select(item => item.Spec.Name)));\r
363             Assert.IsTrue(new[]{18, 18, 18, 18}.SequenceEqual(ships[2].OnSlot));\r
364         }\r
365 \r
366         /// <summary>\r
367         /// 迎撃機なしの基地航空戦\r
368         /// </summary>\r
369         [TestMethod]\r
370         public void AirRaidBattleWithoutInterceptor()\r
371         {\r
372             var sniffer = new Sniffer();\r
373             SniffLogFile(sniffer, "airraid_battle_002");\r
374             var battle = sniffer.Battle;\r
375             Assert.AreEqual(BattleState.AirRaid, battle.BattleState);\r
376             Assert.AreEqual(4, battle.AirControlLevel);\r
377             Assert.AreEqual(0, battle.FighterPower.Min);\r
378             Assert.AreEqual(231, battle.EnemyFighterPower.AirCombat);\r
379             Assert.AreEqual(BattleResultRank.B, battle.ResultRank);\r
380             var ships = battle.Result.Friend.Main;\r
381             Assert.IsTrue(new[] {82, 174, 147}.SequenceEqual(ships.Select(ship => ship.NowHp)));\r
382         }\r
383     }\r
384 }