OSDN Git Service

fca96b0a9d45daa2588d5005120e2e72a64e1a31
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer.Test / SnifferTest.cs
1 // Copyright (C) 2014 Kazuhiro Fujieda <fujieda@users.sourceforge.jp>\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(string.Format("ログのurl, request, responseがそろっていません: {0:d}行目", ln));\r
54                         if (!line.StartsWith(s))\r
55                             throw new Exception(string.Format("ログに不正な行が含まれています: {0:d}行目", ln));\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)\r
101         {\r
102             var result = sniffer.GetShipStatuses(0).Select(s => s.NowHp);\r
103             PAssert.That(() => (expected.SequenceEqual(result)));\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             AssertEauqlCombinedResult(sniffer, new[] {37, 105, 106, 90, 66, 0}, new[] {41, 0, 37, 44, 43, 43}, "続けて護衛退避を実行");\r
168             PAssert.That(() => !sniffer.Battle.HasDamagedShip);\r
169             SniffLogFile(sniffer, "combined_escape_003");\r
170             AssertEauqlCombinedResult(sniffer, new[] {37, 105, 106, 90, 1, 0}, new[] {41, 0, 32, 44, 43, 43}, "もう一戦して大破が出るまで");\r
171             PAssert.That(() => sniffer.Battle.HasDamagedShip);\r
172             SniffLogFile(sniffer, "combined_escape_004");\r
173             AssertEauqlCombinedResult(sniffer, new[] {37, 105, 106, 90, 0, 0}, new[] {41, 0, 0, 44, 43, 43}, "さらに護衛退避を実行");\r
174             PAssert.That(() => !sniffer.Battle.HasDamagedShip);\r
175         }\r
176 \r
177         /// <summary>\r
178         /// 夜戦の開始時に昼戦の結果を反映する\r
179         /// </summary>\r
180         [TestMethod]\r
181         public void ResultOfDayBattleShowInNightBattle()\r
182         {\r
183             var sniffer = new Sniffer();\r
184             SniffLogFile(sniffer, "battle_003");\r
185             AssertEqualBattleResult(sniffer, new[] {28, 2, 13});\r
186             PAssert.That(() => !sniffer.Battle.HasDamagedShip, "夜戦の開始時は大破警告を出さない");\r
187         }\r
188 \r
189         /// <summary>\r
190         /// 編成で空き番号を使ったローテートを正しく反映する\r
191         /// </summary>\r
192         [TestMethod]\r
193         public void RotateFleetMember()\r
194         {\r
195             var sniffer = new Sniffer();\r
196             SniffLogFile(sniffer, "deck_001");\r
197             var result = sniffer.GetDeck(0);\r
198             PAssert.That(() => new[] {756, 17204, 6156, 28806, 1069, -1}.SequenceEqual(result));\r
199         }\r
200 \r
201         /// <summary>\r
202         /// 編成で艦隊に配置ずみの艦娘を交換する\r
203         /// </summary>\r
204         [TestMethod]\r
205         public void ExchangeFleetMember()\r
206         {\r
207             var sniffer = new Sniffer();\r
208 \r
209             SniffLogFile(sniffer, "deck_002");\r
210             var result0 = sniffer.GetDeck(0);\r
211             PAssert.That(() => new[] {1069, 6156, 756, 3223, -1, -1}.SequenceEqual(result0), "編成で艦隊内で艦娘と交換する");\r
212 \r
213             SniffLogFile(sniffer, "deck_003");\r
214             var result10 = sniffer.GetDeck(0);\r
215             var result11 = sniffer.GetDeck(1);\r
216             PAssert.That(() => new[] {1069, 6156, 14258, 3223, -1, -1}.SequenceEqual(result10) &&\r
217                                new[] {101, 4487, 756, 14613, 28806, -1}.SequenceEqual(result11), "002に続いて艦隊をまたがって交換する");\r
218 \r
219             SniffLogFile(sniffer, "deck_004");\r
220             var result20 = sniffer.GetDeck(0);\r
221             var result21 = sniffer.GetDeck(1);\r
222             PAssert.That(() => new[] {1069, 6156, 14258, 3223, 756, -1}.SequenceEqual(result20) &&\r
223                                new[] {101, 4487, 14613, 28806, -1, -1}.SequenceEqual(result21),\r
224                 "003に続いて空き番号にほかの艦隊の艦娘を配置する");\r
225         }\r
226     }\r
227 }