OSDN Git Service

敵のスロットの搭載数を埋める
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer.Test / BattleBriefTest.cs
1 // Copyright (C) 2017 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 // distribukted 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.Linq;\r
17 using ExpressionToCodeLib;\r
18 using KancolleSniffer.Model;\r
19 using KancolleSniffer.Util;\r
20 using Microsoft.VisualStudio.TestTools.UnitTesting;\r
21 \r
22 namespace KancolleSniffer.Test\r
23 {\r
24     [TestClass]\r
25     public class BattleBriefTest\r
26     {\r
27         private ItemMaster _itemMaster;\r
28         private ItemInventory _itemInventory;\r
29         private ItemInfo _itemInfo;\r
30         private ShipMaster _shipMaster;\r
31         private ShipInventory _shipInventory;\r
32         private ShipInfo _shipInfo;\r
33         private BattleInfo _battleInfo;\r
34 \r
35         private string[] ReadAllLines(string log)\r
36         {\r
37             using (var logfile = SnifferTest.OpenLogFile(log))\r
38                 return logfile.ReadToEnd().Split(new[] {"\r\n"}, StringSplitOptions.None);\r
39         }\r
40 \r
41         public void InjectShips(dynamic battle, dynamic item)\r
42         {\r
43             var deck = (int)battle.api_deck_id - 1;\r
44             InjectShips(deck, (int[])battle.api_f_nowhps, (int[])battle.api_f_maxhps, (int[][])item[0]);\r
45             if (battle.api_f_nowhps_combined())\r
46                 InjectShips(1, (int[])battle.api_f_nowhps_combined, (int[])battle.api_f_maxhps_combined,\r
47                     (int[][])item[1]);\r
48             foreach (var enemy in (int[])battle.api_ship_ke)\r
49                 _shipMaster.InjectSpec(enemy);\r
50             if (battle.api_ship_ke_combined())\r
51             {\r
52                 foreach (var enemy in (int[])battle.api_ship_ke_combined)\r
53                     _shipMaster.InjectSpec(enemy);\r
54             }\r
55             _itemInfo.InjectItems(((int[][])battle.api_eSlot).SelectMany(x => x));\r
56             if (battle.api_eSlot_combined())\r
57                 _itemInfo.InjectItems(((int[][])battle.api_eSlot_combined).SelectMany(x => x));\r
58         }\r
59 \r
60         private void InjectShips(int deck, int[] nowHps, int[] maxHps, int[][] slots)\r
61         {\r
62             var id = _shipInventory.MaxId + 1;\r
63             var ships = nowHps.Zip(maxHps,\r
64                 (now, max) => new ShipStatus {Id = id++, NowHp = now, MaxHp = max}).ToArray();\r
65             _shipInventory.Add(ships);\r
66             _shipInfo.Fleets[deck].Deck = (from ship in ships select ship.Id).ToArray();\r
67             foreach (var entry in ships.Zip(slots, (ship, slot) => new {ship, slot}))\r
68             {\r
69                 entry.ship.Slot = _itemInfo.InjectItems(entry.slot.Take(5));\r
70                 if (entry.slot.Length >= 6)\r
71                     entry.ship.SlotEx = _itemInfo.InjectItems(entry.slot.Skip(5)).First();\r
72             }\r
73         }\r
74 \r
75         [TestInitialize]\r
76         public void Initialize()\r
77         {\r
78             _itemMaster = new ItemMaster();\r
79             _itemInventory = new ItemInventory();\r
80             _itemInfo = new ItemInfo(_itemMaster, _itemInventory);\r
81             _shipInventory = new ShipInventory();\r
82             _shipMaster = new ShipMaster();\r
83             _shipInfo = new ShipInfo(_shipMaster, _shipInventory, _itemInventory);\r
84             _battleInfo = new BattleInfo(_shipInfo, _itemInfo);\r
85         }\r
86 \r
87         /// <summary>\r
88         /// 連撃を受けて女神が発動する\r
89         /// </summary>\r
90         [TestMethod]\r
91         public void CauseRepairGoddessByDoubleAttack()\r
92         {\r
93             var logs = ReadAllLines("damecon_001");\r
94             var items = JsonParser.Parse("[[[],[],[],[],[43]]]");\r
95             dynamic battle = JsonParser.Parse(logs[2]);\r
96             InjectShips(battle, items);\r
97             _battleInfo.InspectBattle(logs[0], logs[1], battle);\r
98             dynamic result = JsonParser.Parse(logs[5]);\r
99             _battleInfo.InspectBattleResult(result);\r
100             PAssert.That(() => _shipInfo.Fleets[2].Ships[4].NowHp == 31);\r
101         }\r
102 \r
103         /// <summary>\r
104         /// 夜戦で戦艦の攻撃を受ける\r
105         /// </summary>\r
106         [TestMethod]\r
107         public void AttackedByBattleShipInMidnight()\r
108         {\r
109             var logs = ReadAllLines("midnight_002");\r
110             var battle = JsonParser.Parse(logs[3]);\r
111             InjectShips(battle, JsonParser.Parse(logs[0]));\r
112             _battleInfo.InspectBattle(logs[1], logs[2], battle);\r
113             _battleInfo.InspectBattleResult(JsonParser.Parse(logs[6]));\r
114             PAssert.That(() => _shipInfo.Fleets[0].Ships[3].NowHp == 12);\r
115         }\r
116 \r
117         private dynamic Data(string json) => ((dynamic)JsonParser.Parse(json)).api_data;\r
118 \r
119         /// <summary>\r
120         /// NPC友軍の支援攻撃がある\r
121         /// </summary>\r
122         [TestMethod]\r
123         public void NpcFriendFleetAttack()\r
124         {\r
125             var logs = ReadAllLines("friendfleet_001");\r
126             var battle = Data(logs[3]);\r
127             InjectShips(battle, JsonParser.Parse(logs[0]));\r
128             _battleInfo.InspectBattle(logs[1], logs[2], battle);\r
129             _battleInfo.InspectBattle(logs[4], logs[5], Data(logs[6]));\r
130             _battleInfo.InspectBattleResult(Data(logs[9]));\r
131             PAssert.That(() => !_battleInfo.DisplayedResultRank.IsError);\r
132         }\r
133 \r
134         /// <summary>\r
135         /// 空襲戦で轟沈する\r
136         /// </summary>\r
137         [TestMethod]\r
138         public void LdAirBattleHaveSunkenShip()\r
139         {\r
140             var logs = ReadAllLines("ld_airbattle_001");\r
141             var battle = Data(logs[3]);\r
142             InjectShips(battle, JsonParser.Parse(logs[0]));\r
143             _battleInfo.InspectBattle(logs[1], logs[2], battle);\r
144             _battleInfo.InspectBattleResult(Data(logs[6]));\r
145             PAssert.That(() => !_battleInfo.DisplayedResultRank.IsError);\r
146         }\r
147 \r
148         /// <summary>\r
149         /// 空襲戦で女神が発動して復活する\r
150         /// </summary>\r
151         [TestMethod]\r
152         public void LdAirBattleHaveRevivedShip()\r
153         {\r
154             var logs = ReadAllLines("ld_airbattle_002");\r
155             var battle = Data(logs[3]);\r
156             InjectShips(battle, JsonParser.Parse(logs[0]));\r
157             _battleInfo.InspectBattle(logs[1], logs[2], battle);\r
158             _battleInfo.InspectBattleResult(Data(logs[6]));\r
159             PAssert.That(() => !_battleInfo.DisplayedResultRank.IsError);\r
160         }\r
161 \r
162         /// <summary>\r
163         /// 機動対敵連合の雷撃戦でダメコンが発動する\r
164         /// </summary>\r
165         [TestMethod]\r
166         public void TorpedoTriggerDameConInCombinedBattleAir()\r
167         {\r
168             var logs = ReadAllLines("damecon_002");\r
169             var battle = Data(logs[3]);\r
170             InjectShips(battle, JsonParser.Parse(logs[0]));\r
171             _battleInfo.InspectBattle(logs[1], logs[2], battle);\r
172             _battleInfo.InspectBattle(logs[4], logs[5], Data(logs[6]));\r
173             _battleInfo.InspectBattleResult(Data(logs[9]));\r
174             PAssert.That(() => !_battleInfo.DisplayedResultRank.IsError);\r
175         }\r
176 \r
177         /// <summary>\r
178         /// 水上対敵連合の雷撃戦でダメコンが発動する\r
179         /// </summary>\r
180         [TestMethod]\r
181         public void TorpedoTriggerDamageControlInCombinedBattleWater()\r
182         {\r
183             var logs = ReadAllLines("damecon_003");\r
184             var battle = Data(logs[3]);\r
185             InjectShips(battle, JsonParser.Parse(logs[0]));\r
186             _battleInfo.InspectBattle(logs[1], logs[2], battle);\r
187             _battleInfo.InspectBattleResult(Data(logs[6]));\r
188             PAssert.That(() => _shipInfo.Fleets[1].Ships[5].NowHp == 6);\r
189         }\r
190     }\r
191 }