OSDN Git Service

戦闘後のHPの矛盾と勝利判定の矛盾を一度に確認する
[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 KancolleSniffer.Model;\r
18 using ExpressionToCodeLib;\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         }\r
181 \r
182         /// <summary>\r
183         /// 払暁戦を行う\r
184         /// </summary>\r
185         [TestMethod]\r
186         public void NightToDay()\r
187         {\r
188             var sniffer = new Sniffer();\r
189             SniffLogFile(sniffer, "nighttoday_001");\r
190             PAssert.That(() => !sniffer.IsBattleResultError);\r
191         }\r
192 \r
193         /// <summary>\r
194         /// 第二期の開幕夜戦のセル情報を表示する\r
195         /// </summary>\r
196         [TestMethod]\r
197         // ReSharper disable once InconsistentNaming\r
198         public void SpMidnightIn2ndSequence()\r
199         {\r
200             var sniffer = new Sniffer();\r
201             SniffLogFile(sniffer, "sp_midnight_003");\r
202             PAssert.That(() => sniffer.CellInfo.Current == "1戦目(夜戦)");\r
203         }\r
204 \r
205         /// <summary>\r
206         /// 単艦退避する\r
207         /// </summary>\r
208         [TestMethod]\r
209         public void EscapeWithoutEscort()\r
210         {\r
211             var sniffer = new Sniffer();\r
212             SniffLogFile(sniffer, "escape_002");\r
213             PAssert.That(() => sniffer.Fleets[2].Ships[1].Escaped);\r
214             PAssert.That(() => !sniffer.IsBattleResultError);\r
215         }\r
216 \r
217         /// <summary>\r
218         /// 出撃時に大破している艦娘がいたら警告する\r
219         /// </summary>\r
220         [TestMethod]\r
221         public void DamagedShipWarningOnMapStart()\r
222         {\r
223             var sniffer = new Sniffer();\r
224             SniffLogFile(sniffer, "mapstart_001");\r
225             PAssert.That(() => sniffer.BadlyDamagedShips.SequenceEqual(new[] {"大潮"}));\r
226         }\r
227 \r
228         /// <summary>\r
229         /// 連合艦隊に大破艦がいる状態で第3艦隊が出撃したときに警告しない\r
230         /// </summary>\r
231         [TestMethod]\r
232         public void NotWarnDamagedShipInCombinedFleetOnMapStart()\r
233         {\r
234             var sniffer = new Sniffer();\r
235             SniffLogFile(sniffer, "mapstart_002");\r
236             PAssert.That(() => !sniffer.BadlyDamagedShips.Any());\r
237         }\r
238 \r
239         /// <summary>\r
240         /// 連合艦隊の第二旗艦の大破を警告しない\r
241         /// </summary>\r
242         [TestMethod]\r
243         public void NotWarnDamaged1StShipInGuardFleet()\r
244         {\r
245             var sniffer = new Sniffer();\r
246             SniffLogFile(sniffer, "combined_battle_004");\r
247             PAssert.That(() => !sniffer.BadlyDamagedShips.Any());\r
248         }\r
249 \r
250         /// <summary>\r
251         /// Nelson Touchに対応する\r
252         /// </summary>\r
253         [TestMethod]\r
254         public void NelsonTouch()\r
255         {\r
256             var sniffer = new Sniffer();\r
257             SniffLogFile(sniffer, "nelsontouch_001");\r
258             PAssert.That(() => !sniffer.IsBattleResultError);\r
259             PAssert.That(() => sniffer.Battle.Result.Friend.Main[0].SpecialAttack == ShipStatus.Attack.Fire);\r
260             PAssert.That(() => sniffer.Fleets[0].Ships[0].SpecialAttack == ShipStatus.Attack.Fired);\r
261             // ship_deckでフラグを引き継ぐ\r
262             SniffLogFile(sniffer, "nelsontouch_002");\r
263             PAssert.That(() => sniffer.Fleets[0].Ships[0].SpecialAttack == ShipStatus.Attack.Fired);\r
264             // 夜戦\r
265             var night = new Sniffer();\r
266             SniffLogFile(night, "nelsontouch_003");\r
267             PAssert.That(() => night.Battle.Result.Friend.Main[0].SpecialAttack == ShipStatus.Attack.Fire);\r
268         }\r
269 \r
270         [TestMethod]\r
271         // ReSharper disable once IdentifierTypo\r
272         public void NagatoSpecial()\r
273         {\r
274             var sniffer = new Sniffer();\r
275             SniffLogFile(sniffer, "nagatospecial_001");\r
276             PAssert.That(() => !sniffer.IsBattleResultError);\r
277             PAssert.That(() => sniffer.Battle.Result.Friend.Main[0].SpecialAttack == ShipStatus.Attack.Fire);\r
278             PAssert.That(() => sniffer.Fleets[0].Ships[0].SpecialAttack == ShipStatus.Attack.Fired);\r
279         }\r
280 \r
281         /// <summary>\r
282         /// レーザー射撃戦に対応する\r
283         /// </summary>\r
284         [TestMethod]\r
285         public void LdShooting()\r
286         {\r
287             var sniffer = new Sniffer();\r
288             SniffLogFile(sniffer, "ld_shooting_001");\r
289             PAssert.That(() => !sniffer.IsBattleResultError);\r
290         }\r
291     }\r
292 }