OSDN Git Service

強制帰投中の遠征タイマーをマイナスにする
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer.Test / LogProcessorTest.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;\r
16 using System.Collections.Generic;\r
17 using System.Linq;\r
18 using ExpressionToCodeLib;\r
19 using KancolleSniffer.Log;\r
20 using KancolleSniffer.Model;\r
21 using Microsoft.VisualStudio.TestTools.UnitTesting;\r
22 \r
23 namespace KancolleSniffer.Test\r
24 {\r
25     [TestClass]\r
26     public class LogProcessorTest\r
27     {\r
28         [ClassInitialize]\r
29         public static void Initialize(TestContext context)\r
30         {\r
31             ExpressionToCodeConfiguration.GlobalAssertionConfiguration = ExpressionToCodeConfiguration\r
32                 .GlobalAssertionConfiguration.WithPrintedListLengthLimit(200).WithMaximumValueLength(1000);\r
33         }\r
34 \r
35         /// <summary>\r
36         /// 古い遠征報告書に改修資材の数字を追加する\r
37         /// </summary>\r
38         [TestMethod]\r
39         public void EnseiLog()\r
40         {\r
41             var processor = new LogProcessor();\r
42             var log = new[]\r
43             {\r
44                 "2018-09-10 17:45:09,大成功,北方鼠輸送作戦,589,498,0,0,0,0,0",\r
45                 "2018-09-10 17:53:34,成功,長距離練習航海,0,117,34,0,0,1,0"\r
46             };\r
47             var result = processor.Process(log, "遠征報告書.csv", DateTime.MinValue, DateTime.MaxValue, false);\r
48             PAssert.That(() => result.SequenceEqual(new[]\r
49             {\r
50                 "[\"2018-09-10 17:45:09\",\"大成功\",\"北方鼠輸送作戦\",\"589\",\"498\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\"]",\r
51                 ",\n[\"2018-09-10 17:53:34\",\"成功\",\"長距離練習航海\",\"0\",\"117\",\"34\",\"0\",\"0\",\"1\",\"0\",\"0\"]"\r
52             }));\r
53         }\r
54 \r
55         /// <summary>\r
56         /// 海戦・ドロップ報告書を加工する\r
57         /// </summary>\r
58         [TestMethod]\r
59         public void BattleLog()\r
60         {\r
61             var processor = new LogProcessor(null, new Dictionary<string, string> {{"鎮守府正面海域", "1-1"}});\r
62             var log = new[]\r
63             {\r
64                 "2018-09-08 11:28:01,鎮守府正面海域,3,ボス,A,同航戦,単縦陣,単縦陣,敵主力艦隊,駆逐艦,雷,浜波改(Lv78),32/32,涼風(Lv10),3/16,,,,,,,,,軽巡ホ級,0/33,駆逐イ級,0/20,駆逐イ級,7/20,,,,,,,0,0,"\r
65             };\r
66             var result = processor.Process(log, "海戦・ドロップ報告書.csv", DateTime.MinValue, DateTime.MaxValue, false);\r
67             PAssert.That(() =>\r
68                 result.First() ==\r
69                 "[\"2018-09-08 11:28:01\",\"鎮守府正面海域\",\"3\",\"ボス\",\"A\",\"同航戦\",\"単縦陣\",\"単縦陣\",\"敵主力艦隊\",\"駆逐艦\",\"雷\"," +\r
70                 "\"浜波改(Lv78)\",\"32/32\",\"涼風(Lv10)\",\"3/16\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"," +\r
71                 "\"軽巡ホ級\",\"0/33\",\"駆逐イ級\",\"0/20\",\"駆逐イ級\",\"7/20\",\"\",\"\",\"\",\"\",\"\",\"\",\"0\",\"0\",\"\",\"涼風(Lv10)\",\"\",\"1-1\"]");\r
72         }\r
73 \r
74         /// <summary>\r
75         /// 資材ログの最後に現在値を示すレコードを追加する\r
76         /// </summary>\r
77         [TestMethod]\r
78         public void MaterialLogWithCurrentRecord()\r
79         {\r
80             var processor = new LogProcessor(new[]\r
81             {\r
82                 new MaterialCount {Now = 2001}, new MaterialCount {Now = 2002}, new MaterialCount {Now = 2003},\r
83                 new MaterialCount {Now = 2004},\r
84                 new MaterialCount {Now = 201}, new MaterialCount {Now = 202}, new MaterialCount {Now = 203},\r
85                 new MaterialCount {Now = 100}\r
86             });\r
87             var now = new DateTime(2018, 1, 1);\r
88             var log = "2018-09-10 20:36:34,294892,296784,259518,294588,2484,2975,2550,3";\r
89 \r
90             var result = processor.Process(new[] {log}, "資材ログ.csv", DateTime.MinValue, DateTime.MaxValue, false, now)\r
91                 .ToArray();\r
92             PAssert.That(() =>\r
93                 result[0] ==\r
94                 "[\"2018-09-10 20:36:34\",\"294892\",\"296784\",\"259518\",\"294588\",\"2484\",\"2975\",\"2550\",\"3\"]");\r
95             var date = Logger.FormatDateTime(now);\r
96             PAssert.That(() =>\r
97                 result[1] ==\r
98                 $",\n[\"{date}\",\"2001\",\"2002\",\"2003\",\"2004\",\"201\",\"202\",\"203\",\"100\"]", "現在値");\r
99         }\r
100 \r
101         /// <summary>\r
102         /// 資材グラフの描画を高速化するために値をすべて数値にする\r
103         /// </summary>\r
104         [TestMethod]\r
105         public void MaterialLogInNumberType()\r
106         {\r
107             var processor = new LogProcessor();\r
108             var log = "2018-09-10 20:36:34,294892,296784,259518,294588,2484,2975,2550,3";\r
109 \r
110             var result = processor.Process(new[] {log}, "資材ログ.csv", DateTime.MinValue, DateTime.MaxValue, true)\r
111                 .ToArray();\r
112             PAssert.That(() => result.Length == 1, "現在値の出力なし");\r
113             PAssert.That(() => result[0] == "[1536579394000,294892,296784,259518,294588,2484,2975,2550,3]");\r
114         }\r
115 \r
116         /// <summary>\r
117         /// 指定された範囲のログを出力する\r
118         /// </summary>\r
119         [TestMethod]\r
120         public void Range()\r
121         {\r
122             var log = new[]\r
123             {\r
124                 "2018-09-09 23:58:35,66023314,0",\r
125                 "2018-09-10 08:08:31,66023314,0",\r
126                 "2018-09-10 11:03:01,66024154,0"\r
127             };\r
128             var processor = new LogProcessor();\r
129             Func<DateTime, DateTime, IEnumerable<string>> rangeProcessor =\r
130                 (from, to) => processor.Process(log, "戦果.csv", from, to, false);\r
131 \r
132             PAssert.That(\r
133                 () => rangeProcessor(DateTime.MinValue, DateTime.MaxValue).SequenceEqual(new[]\r
134                 {\r
135                     "[\"2018-09-09 23:58:35\",\"66023314\",\"0\"]",\r
136                     ",\n[\"2018-09-10 08:08:31\",\"66023314\",\"0\"]",\r
137                     ",\n[\"2018-09-10 11:03:01\",\"66024154\",\"0\"]"\r
138                 }));\r
139             PAssert.That(\r
140                 () => rangeProcessor(DateTime.MinValue, new DateTime(2018, 9, 10)).SequenceEqual(new[]\r
141                     {"[\"2018-09-09 23:58:35\",\"66023314\",\"0\"]"}\r
142                 ));\r
143             PAssert.That(\r
144                 () => rangeProcessor(new DateTime(2018, 9, 10), DateTime.MaxValue).SequenceEqual(new[]\r
145                 {\r
146                     "[\"2018-09-10 08:08:31\",\"66023314\",\"0\"]",\r
147                     ",\n[\"2018-09-10 11:03:01\",\"66024154\",\"0\"]"\r
148                 }));\r
149             PAssert.That(\r
150                 () => rangeProcessor(new DateTime(2018, 9, 10), new DateTime(2018, 9, 10, 11, 0, 0)).SequenceEqual(new[]\r
151                 {\r
152                     "[\"2018-09-10 08:08:31\",\"66023314\",\"0\"]"\r
153                 }));\r
154         }\r
155 \r
156         /// <summary>\r
157         /// 想定と異なる日付フォーマットに対応する。\r
158         /// </summary>\r
159         [TestMethod]\r
160         public void DateFormat()\r
161         {\r
162             var processor = new LogProcessor();\r
163 \r
164             var body = ",大型艦建造,まるゆ,潜水艦,1500,1500,2000,1000,1,0,瑞鶴改二甲(163),120";\r
165             var expected =\r
166                 ",\"大型艦建造\",\"まるゆ\",\"潜水艦\",\"1500\",\"1500\",\"2000\",\"1000\",\"1\",\"0\",\"瑞鶴改二甲(163)\",\"120\"]";\r
167 \r
168             Func<string, string> dateProcessor =\r
169                 date => processor.Process(new[] {date + body}, "建造報告書", DateTime.MinValue, DateTime.MaxValue, false)\r
170                     .First();\r
171             var era = "30-09-10 20:13:39";\r
172             PAssert.That(() => "[\"2018-09-10 20:13:39\"" + expected == dateProcessor(era), "和暦を西暦に直す");\r
173             var excel = "2018/9/10 20:13";\r
174             PAssert.That(() => "[\"2018-09-10 20:13:00\"" + expected == dateProcessor(excel), "Excelの形式から変換する");\r
175         }\r
176 \r
177         /// <summary>\r
178         /// 壊れたログを取り除く\r
179         /// </summary>\r
180         [TestMethod]\r
181         public void TruncatedLog()\r
182         {\r
183             var processor = new LogProcessor();\r
184             var logs = new[]\r
185             {\r
186                 "2014-12-15 23:10:34,29734,29855,28016,41440,1407,1529,2151,13",\r
187                 "2014-12-15 23:13:29,29709,29819,28019,41440,1407,1529,21",\r
188                 "2014-12-15 23:16:06,29710,29819,28018,41440,1407,1529,2151,13"\r
189             };\r
190             var result = processor.Process(logs, "資材ログ", DateTime.MinValue, DateTime.MaxValue, true);\r
191             PAssert.That(() => result.SequenceEqual(new[]\r
192             {\r
193                 "[1418652634000,29734,29855,28016,41440,1407,1529,2151,13]",\r
194                 ",\n[1418652966000,29710,29819,28018,41440,1407,1529,2151,13]"\r
195             }));\r
196         }\r
197     }\r
198 }