1 // Copyright (C) 2014, 2015 Kazuhiro Fujieda <fujieda@users.osdn.me>
\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
7 // http://www.apache.org/licenses/LICENSE-2.0
\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
16 using System.Collections.Generic;
\r
18 using ExpressionToCodeLib;
\r
19 using KancolleSniffer.Log;
\r
20 using KancolleSniffer.Util;
\r
21 using Microsoft.VisualStudio.TestTools.UnitTesting;
\r
24 namespace KancolleSniffer.Test
\r
26 using Sniffer = SnifferTest.TestingSniffer;
\r
29 public class LoggerTest
\r
32 public void Initialize()
\r
34 ExpressionToCodeConfiguration.GlobalAssertionConfiguration = ExpressionToCodeConfiguration
\r
35 .GlobalAssertionConfiguration.WithPrintedListLengthLimit(200).WithMaximumValueLength(1000);
\r
39 public void InspectMissionResult()
\r
41 var sniffer = new Sniffer();
\r
44 sniffer.SetLogWriter((path, s, h) =>
\r
48 }, () => new DateTime(2015, 1, 1));
\r
49 sniffer.SkipMaster();
\r
50 sniffer.EnableLog(LogType.Mission);
\r
51 SnifferTest.SniffLogFile(sniffer, "mission_result_001");
\r
52 PAssert.That(() => "日付,結果,遠征,燃料,弾薬,鋼材,ボーキ,開発資材,高速修復材,高速建造材" == header);
\r
53 PAssert.That(() => "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,0,0|" +
\r
54 "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,1,0|" +
\r
55 "2015-01-01 00:00:00,大成功,MO作戦,0,0,360,420,1,0,0|" +
\r
56 "2015-01-01 00:00:00,失敗,東京急行(弐),0,0,0,0,0,0,0|"
\r
61 /// 出力先に書けないときは一時ファイルに書き込む
\r
64 public void WriteTmpFileWhenCantWriteTarget()
\r
66 var mock = new Mock<LogWriter.IFile>();
\r
67 var writer = new LogWriter(null, mock.Object);
\r
69 const string str = "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,0,0";
\r
71 mock.Setup(l => l.AppendAllText(It.IsAny<string>(), It.IsAny<string>()))
\r
72 .Callback<string, string>((file, s) =>
\r
74 if (file.EndsWith(".csv"))
\r
75 throw new IOException();
\r
76 if (file.EndsWith(".tmp"))
\r
79 mock.SetupSequence(l => l.Exists(It.IsAny<string>())).Returns(false).Returns(true);
\r
80 writer.Write("遠征報告書", str, "");
\r
81 PAssert.That(() => "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,0,0\r\n" == tmp);
\r
85 public void MergeTmpFile()
\r
87 MergeTmpFileMain(false);
\r
91 public void FailToMergeTmpFile()
\r
93 MergeTmpFileMain(true);
\r
96 private void MergeTmpFileMain(bool failToMerge)
\r
98 var mock = new Mock<LogWriter.IFile>();
\r
99 var writer = new LogWriter(null, mock.Object);
\r
101 var tmp = "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,0,0\r\n";
\r
103 mock.Setup(l => l.Exists(It.IsAny<string>())).Returns(true);
\r
104 mock.Setup(l => l.ReadAllText(It.IsAny<string>()))
\r
105 .Returns((string path) => path.EndsWith(".tmp") ? tmp : "");
\r
106 mock.Setup(l => l.AppendAllText(It.IsAny<string>(), It.IsAny<string>()))
\r
107 .Callback<string, string>((file, s) =>
\r
109 if (file.EndsWith(".tmp"))
\r
111 if (file.EndsWith(".csv"))
\r
114 throw new IOException();
\r
118 const string str = "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,1,0";
\r
119 writer.Write("遠征報告書", str, "");
\r
120 var result = failToMerge ? tmp : csv;
\r
122 "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,0,0\r\n" +
\r
123 "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,1,0\r\n" == result);
\r
127 public void InspectBattleResult()
\r
129 var sniffer = new Sniffer();
\r
131 sniffer.SetLogWriter((path, s, h) => { result += s + "|"; }, () => new DateTime(2017, 1, 1));
\r
132 sniffer.EnableLog(LogType.Battle);
\r
133 SnifferTest.SniffLogFile(sniffer, "battle_001");
\r
135 "2017-01-01 00:00:00,カレー洋制圧戦,1,出撃,A,T字戦(有利),警戒陣,梯形陣,敵潜水教導艦隊,,," +
\r
136 "隼鷹改二(Lv157),57/62,利根改二(Lv151),66/66,千代田航改二(Lv159),50/65,千歳航改二(Lv159),65/65,大井改二(Lv57),40/43,秋月改(Lv142),42/42," +
\r
137 "潜水ヨ級(elite),34/34,潜水ヨ級,5/24,潜水ヨ級,0/24,潜水カ級(elite),0/27,潜水カ級,0/19,潜水カ級,0/19,248~249,0,制空権確保,4-2|"
\r
142 /// 7隻編成の場合は7隻目を6隻目に重ねる
\r
145 public void InspectShip7BattleResult()
\r
147 var sniffer = new Sniffer();
\r
149 sniffer.SetLogWriter((path, s, h) => { result += s + "|"; }, () => new DateTime(2017, 1, 1));
\r
150 sniffer.EnableLog(LogType.Battle);
\r
151 SnifferTest.SniffLogFile(sniffer, "ship7battle_001");
\r
153 "2017-01-01 00:00:00,台湾沖/ルソン島沖,5,出撃,S,同航戦,単縦陣,単縦陣,深海通商破部隊 前衛水雷戦隊,,," +
\r
154 "あきつ丸改(Lv81),40/40,那智改二(Lv151),63/63,Roma改(Lv99),83/92,阿武隈改二(Lv98),40/45,霞改二(Lv96),13/31,潮改二(Lv94)・不知火改(Lv85),31/33・32/32," +
\r
155 "軽巡ホ級(flagship),0/53,駆逐ロ級後期型,0/37,駆逐ロ級後期型,0/37,駆逐ロ級後期型,0/37,駆逐イ級,0/20,駆逐イ級,0/20,317~318,0,制空権確保,40-2|"
\r
160 public void InspectMaterial()
\r
162 var sniffer = new Sniffer();
\r
164 var first = new DateTime(2015, 1, 1, 0, 0, 0);
\r
166 new Queue<DateTime>(new[] {first, first.AddMinutes(10), first.AddMinutes(15), first.AddMinutes(20)});
\r
167 sniffer.SetLogWriter((path, s, h) => { result += s + "|"; }, queue.Dequeue);
\r
168 sniffer.EnableLog(LogType.Material);
\r
169 SnifferTest.SniffLogFile(sniffer, "material_001");
\r
170 PAssert.That(() => "2015-01-01 00:00:00,26178,26742,21196,33750,1426,1574,2185,10|" +
\r
171 "2015-01-01 00:10:00,24595,25353,18900,32025,1427,1576,2187,10|" +
\r
172 "2015-01-01 00:20:00,23463,25064,17314,31765,1427,1572,2187,10|"
\r
177 public void InspectCreateItem()
\r
179 var sniffer = new Sniffer();
\r
181 sniffer.SetLogWriter((path, s, h) => { result += s + "|"; }, () => new DateTime(2015, 1, 1));
\r
182 sniffer.EnableLog(LogType.CreateItem);
\r
183 SnifferTest.SniffLogFile(sniffer, "createitem_001");
\r
184 PAssert.That(() => "2015-01-01 00:00:00,12cm単装砲,小口径主砲,10,10,30,10,綾波改二(145),120|" +
\r
185 "2015-01-01 00:00:00,失敗,,10,10,30,10,綾波改二(145),120|"
\r
190 public void InspectGetShip()
\r
192 var sniffer = new Sniffer();
\r
194 sniffer.SetLogWriter((path, s, h) => { result += s + "|"; }, () => new DateTime(2015, 1, 1));
\r
195 sniffer.EnableLog(LogType.CreateShip);
\r
196 SnifferTest.SniffLogFile(sniffer, "createship_001");
\r
197 PAssert.That(() => "2015-01-01 00:00:00,通常艦建造,雷,駆逐艦,30,30,30,30,1,1,綾波改二(145),120|" +
\r
198 "2015-01-01 00:00:00,大型艦建造,霧島,巡洋戦艦,1500,1500,2000,1000,1,0,綾波改二(145),120|"
\r
203 public void InspectRemodelSlot()
\r
205 var sniffer = new Sniffer();
\r
207 sniffer.SetLogWriter((path, s, h) => { result += s + "|"; }, () => new DateTime(2015, 1, 1));
\r
208 sniffer.EnableLog(LogType.RemodelSlot);
\r
209 SnifferTest.SniffLogFile(sniffer, "remodel_slot_001");
\r
210 PAssert.That(() => "2015-01-01 00:00:00,12.7cm連装砲,4,○,,,,10,30,60,0,1,1,明石改(50),島風改(131)|" +
\r
211 "2015-01-01 00:00:00,12.7cm連装砲,5,×,,,,10,30,60,0,1,1,明石改(50),|" +
\r
212 "2015-01-01 00:00:00,12.7cm連装砲,7,○,,12.7cm連装砲,1,10,30,60,0,1,1,明石改(50),島風改(131)|" +
\r
213 "2015-01-01 00:00:00,91式高射装置,10,○,○,10cm連装高角砲,2,0,0,60,40,9,7,明石改(50),摩耶改(98)|"
\r
218 public void Achievement()
\r
220 var logger = new Logger(null, null, null);
\r
221 logger.EnableLog(LogType.Achievement);
\r
223 var dateEnum = new[]
\r
225 new DateTime(2017, 3, 31, 21, 0, 0),
\r
226 new DateTime(2017, 3, 31, 22, 0, 0),
\r
227 new DateTime(2017, 4, 1, 1, 0, 0),
\r
228 new DateTime(2017, 4, 1, 2, 0, 0),
\r
229 new DateTime(2017, 4, 1, 3, 0, 0),
\r
230 new DateTime(2017, 4, 2, 2, 0, 0),
\r
231 new DateTime(2017, 4, 2, 3, 0, 0),
\r
232 new DateTime(2017, 4, 2, 4, 0, 0)
\r
234 logger.SetWriter((path, s, h) => { result += s + "|"; }, () =>
\r
236 dateEnum.MoveNext();
\r
237 // ReSharper disable once PossibleNullReferenceException
\r
238 return (DateTime)dateEnum.Current;
\r
240 for (var i = 0; i < 6; i++)
\r
241 logger.InspectBasic(JsonParser.Parse($"{{\"api_experience\": {i * 1000}}}"));
\r
242 logger.InspectBattleResult(JsonParser.Parse("{\"api_get_exmap_rate\": \"100\"}"));
\r
243 logger.InspectMapNext(JsonParser.Parse("{\"api_get_eo_rate\": 75}"));
\r
245 "2017-03-31 21:00:00,0,0|2017-03-31 21:00:00,0,0|2017-03-31 22:00:00,1000,0|" +
\r
246 "2017-04-01 03:00:00,4000,0|2017-04-02 02:00:00,5000,0|" +
\r
247 "2017-04-02 03:00:00,5000,100|2017-04-02 04:00:00,5000,75|"
\r
252 public void InspectClearItemGet()
\r
254 var sniffer = new Sniffer();
\r
256 sniffer.SetLogWriter((path, s, h) => { result += s + "|"; }, () => new DateTime(2017, 5, 1));
\r
257 sniffer.EnableLog(LogType.Achievement);
\r
258 SnifferTest.SniffLogFile(sniffer, "clearitemget_001");
\r
260 "2017-05-01 00:00:00,45417045,0|2017-05-01 00:00:00,45417045,350|" == result);
\r
264 /// 晴嵐(六三一空)任務の場合はapi_bounus_countがない
\r
267 public void InspectClearItemGetSeiran631Ku()
\r
269 var sniffer = new Sniffer(true);
\r
270 sniffer.SetLogWriter((path, s, h) => { }, () => new DateTime(2017, 5, 1));
\r
271 sniffer.EnableLog(LogType.Achievement);
\r
272 sniffer.Sniff("/kcsapi/api_req_quest/clearitemget",
\r
273 "api%5Fquest%5Fid=656&api%5Fverno=1",
\r
275 @"{""api_result"":1,""api_result_msg"":""成功"",""api_data"":
\r
276 {""api_material"":[0,0,0,0],""api_bounus"":[
\r
277 {""api_type"":15,""api_count"":1,""api_item"":{""api_id_from"":9999,""api_id_to"":9999,
\r
278 ""api_message"":""第一潜水隊運用航空隊:「晴嵐(六三一空)」の新編成を<br>完了しました!""}}
\r