OSDN Git Service

バージョン10.8の準備
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer.Test / NotificationManagerTest.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 // 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 ExpressionToCodeLib;\r
17 using Microsoft.VisualStudio.TestTools.UnitTesting;\r
18 \r
19 namespace KancolleSniffer.Test\r
20 {\r
21     [TestClass]\r
22     public class NotificationManagerTest\r
23     {\r
24         private class TimeProvider\r
25         {\r
26             private DateTime _now = new DateTime(2017, 11, 1);\r
27 \r
28             public DateTime GetNow()\r
29             {\r
30                     var now = _now;\r
31                     _now += TimeSpan.FromSeconds(1);\r
32                     return now;\r
33             }\r
34         }\r
35 \r
36         private class Message\r
37         {\r
38             public string Title { private get; set; }\r
39             public string Body { private get; set; }\r
40             public string Name { private get; set; }\r
41 \r
42             public bool Equals(Message other) =>\r
43                 other != null && Title == other.Title && Body == other.Body && Name == other.Name;\r
44 \r
45             public Message Repeat => new Message {Title = "[リピート] " + Title, Body = Body, Name = Name};\r
46             public Message Cont => new Message {Title = "[継続] " + Title, Body = Body, Name = Name};\r
47         }\r
48 \r
49         /// <summary>\r
50         /// 単発\r
51         /// </summary>\r
52         [TestMethod]\r
53         public void SingleNotification()\r
54         {\r
55             var time = new TimeProvider();\r
56             Message result = null;\r
57             var manager =\r
58                 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, time.GetNow);\r
59             manager.Enqueue("遠征終了", 1, "防空射撃演習");\r
60             manager.Flash();\r
61             PAssert.That(() => new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"}.Equals(result));\r
62         }\r
63 \r
64         /// <summary>\r
65         /// 連続した通知の間隔を二秒空ける\r
66         /// </summary>\r
67         [TestMethod]\r
68         public void TwoNotificationAtSameTime()\r
69         {\r
70             var time = new TimeProvider();\r
71             Message result = null;\r
72             var manager =\r
73                 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, time.GetNow);\r
74             manager.Enqueue("遠征終了", 1, "防空射撃演習");\r
75             manager.Enqueue("疲労回復49", 1, "cond49");\r
76             manager.Flash();\r
77             PAssert.That(() => new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"}.Equals(result));\r
78             result = null;\r
79             manager.Flash();\r
80             PAssert.That(() => result == null);\r
81             manager.Flash();\r
82             PAssert.That(() => new Message {Title = "疲労が回復しました", Body = "第二艦隊", Name = "疲労回復"}.Equals(result));\r
83         }\r
84 \r
85         /// <summary>\r
86         /// 一つ目の通知の一秒後に投入された通知は一秒ずらす\r
87         /// </summary>\r
88         [TestMethod]\r
89         public void TwoNotification1SecDelay()\r
90         {\r
91             var time = new TimeProvider();\r
92             Message result = null;\r
93             var manager =\r
94                 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, time.GetNow);\r
95             manager.Enqueue("建造完了", 0, "");\r
96             manager.Flash();\r
97             PAssert.That(() => new Message {Title = "建造が終わりました", Body = "第一ドック", Name = "建造完了"}.Equals(result));\r
98             manager.Flash();\r
99             manager.Enqueue("建造完了", 1, "");\r
100             manager.Flash();\r
101             PAssert.That(() => new Message {Title = "建造が終わりました", Body = "第二ドック", Name = "建造完了"}.Equals(result));\r
102         }\r
103 \r
104         /// <summary>\r
105         /// 通知をリピートさせる\r
106         /// </summary>\r
107         [TestMethod]\r
108         public void SingleRepeatableNotification()\r
109         {\r
110             var time = new TimeProvider();\r
111             Message result = null;\r
112             var manager =\r
113                 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, time.GetNow);\r
114             var expected = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};\r
115             var elapsed = 0;\r
116             while (true)\r
117             {\r
118                 switch (elapsed)\r
119                 {\r
120                     case 0:\r
121                         manager.Enqueue("遠征終了", 1, "防空射撃演習", 2);\r
122                         manager.Flash();\r
123                         PAssert.That(() => expected.Equals(result));\r
124                         break;\r
125                     case 2000:\r
126                         manager.Flash();\r
127                         PAssert.That(() => expected.Repeat.Equals(result));\r
128                         break;\r
129                     case 4000:\r
130                         manager.Flash();\r
131                         PAssert.That(() => expected.Repeat.Equals(result));\r
132                         return;\r
133                     default:\r
134                         manager.Flash();\r
135                         PAssert.That(() => result == null, elapsed.ToString());\r
136                         break;\r
137                 }\r
138                 result = null;\r
139                 elapsed += 1000;\r
140             }\r
141         }\r
142 \r
143         /// <summary>\r
144         /// 二つの通知をリピートさせる\r
145         /// </summary>\r
146         [TestMethod]\r
147         public void TwoRepeatableNotofication()\r
148         {\r
149             var time = new TimeProvider();\r
150             Message result = null;\r
151             var manager =\r
152                 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, time.GetNow);\r
153             var ensei = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};\r
154             var hakuchi = new Message {Title = "泊地修理 第一艦隊", Body = "20分経過しました。", Name = "泊地修理20分経過"};\r
155             var elapsed = 0;\r
156             while (true)\r
157             {\r
158                 switch (elapsed)\r
159                 {\r
160                     case 0:\r
161                         manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);\r
162                         manager.Flash();\r
163                         PAssert.That(() => ensei.Equals(result));\r
164                         break;\r
165                     case 2000:\r
166                         manager.Enqueue("泊地修理20分経過", 0, "", 5);\r
167                         manager.Flash();\r
168                         PAssert.That(() => hakuchi.Equals(result));\r
169                         break;\r
170                     case 7000:\r
171                         manager.Flash();\r
172                         PAssert.That(() => hakuchi.Repeat.Equals(result), "泊地修理2回目");\r
173                         break;\r
174                     case 10000:\r
175                         manager.Flash();\r
176                         PAssert.That(() => ensei.Repeat.Equals(result), "遠征終了2回目");\r
177                         return;\r
178                     default:\r
179                         manager.Flash();\r
180                         PAssert.That(() => result == null, elapsed.ToString());\r
181                         break;\r
182                 }\r
183                 result = null;\r
184                 elapsed += 1000;\r
185             }\r
186         }\r
187 \r
188         /// <summary>\r
189         /// スケジュールがぶつかる二つの通知をリピートさせる\r
190         /// </summary>\r
191         [TestMethod]\r
192         public void TwoRepeatableNotification1SecDelay()\r
193         {\r
194             var time = new TimeProvider();\r
195             Message result = null;\r
196             var manager =\r
197                 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, time.GetNow);\r
198             var ensei = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};\r
199             var hakuchi = new Message {Title = "泊地修理 第一艦隊", Body = "20分経過しました。", Name = "泊地修理20分経過"};\r
200             var elapsed = 0;\r
201             while (true)\r
202             {\r
203                 switch (elapsed)\r
204                 {\r
205                     case 0:\r
206                         manager.Enqueue("遠征終了", 1, "防空射撃演習", 3);\r
207                         manager.Flash();\r
208                         PAssert.That(() => ensei.Equals(result));\r
209                         break;\r
210                     case 1000:\r
211                         manager.Enqueue("泊地修理20分経過", 0, "", 2);\r
212                         manager.Flash();\r
213                         break;\r
214                     case 2000:\r
215                         manager.Flash();\r
216                         PAssert.That(() => hakuchi.Equals(result));\r
217                         break;\r
218                     case 4000:\r
219                         manager.Flash();\r
220                         PAssert.That(() => ensei.Repeat.Equals(result), "遠征終了2回目");\r
221                         break;\r
222                     case 6000:\r
223                         manager.Flash();\r
224                         PAssert.That(() => hakuchi.Repeat.Equals(result), "泊地修理2回目");\r
225                         return;\r
226                     default:\r
227                         manager.Flash();\r
228                         PAssert.That(() => result == null, elapsed.ToString());\r
229                         break;\r
230                 }\r
231                 result = null;\r
232                 elapsed += 1000;\r
233             }\r
234         }\r
235 \r
236         /// <summary>\r
237         /// リピートしている通知を止める\r
238         /// </summary>\r
239         [TestMethod]\r
240         public void RemoveRepeatableNotification()\r
241         {\r
242             var time = new TimeProvider();\r
243             Message result = null;\r
244             var manager =\r
245                 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, time.GetNow);\r
246             var ensei = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};\r
247             var nyukyo = new Message {Title = "入渠が終わりました", Body = "第一ドック 綾波改二", Name = "入渠終了"};\r
248             var elapsed = 0;\r
249             while (true)\r
250             {\r
251                 switch (elapsed)\r
252                 {\r
253                     case 0:\r
254                         manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);\r
255                         manager.Flash();\r
256                         PAssert.That(() => ensei.Equals(result));\r
257                         break;\r
258                     case 2000:\r
259                         manager.Enqueue("入渠終了", 0, "綾波改二", 5);\r
260                         manager.Flash();\r
261                         PAssert.That(() => nyukyo.Equals(result));\r
262                         break;\r
263                     case 3000:\r
264                         manager.StopRepeat("入渠終了");\r
265                         manager.Flash();\r
266                         break;\r
267                     case 7000:\r
268                         manager.Flash();\r
269                         PAssert.That(() => result == null, "入渠終了2回目はない");\r
270                         break;\r
271                     case 10000:\r
272                         manager.Flash();\r
273                         PAssert.That(() => ensei.Repeat.Equals(result), "遠征終了2回目");\r
274                         return;\r
275                     default:\r
276                         manager.Flash();\r
277                         PAssert.That(() => result == null, elapsed.ToString());\r
278                         break;\r
279                 }\r
280                 result = null;\r
281                 elapsed += 1000;\r
282             }\r
283         }\r
284 \r
285         /// <summary>\r
286         /// リピートを中断・再開する\r
287         /// </summary>\r
288         [TestMethod]\r
289         public void SuspendRepeat()\r
290         {\r
291             var time = new TimeProvider();\r
292             Message result = null;\r
293             var manager =\r
294                 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, time.GetNow);\r
295             var expected = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};\r
296             var elapsed = 0;\r
297             while (true)\r
298             {\r
299                 switch (elapsed)\r
300                 {\r
301                     case 0:\r
302                         manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);\r
303                         manager.Flash();\r
304                         PAssert.That(() => expected.Equals(result));\r
305                         break;\r
306                     case 1000:\r
307                         manager.Flash();\r
308                         manager.SuspendRepeat();\r
309                         break;\r
310                     case 11000:\r
311                         manager.Flash();\r
312                         manager.ResumeRepeat();\r
313                         break;\r
314                     case 12000:\r
315                         manager.Flash();\r
316                         PAssert.That(() => expected.Repeat.Equals(result));\r
317                         return;\r
318                     default:\r
319                         manager.Flash();\r
320                         PAssert.That(() => result == null, elapsed.ToString());\r
321                         break;\r
322                 }\r
323                 result = null;\r
324                 elapsed += 1000;\r
325             }\r
326         }\r
327 \r
328         /// <summary>\r
329         /// リピート中の特定の通知を止める\r
330         /// </summary>\r
331         [TestMethod]\r
332         public void StopSpecificRepeatingNotification()\r
333         {\r
334             var time = new TimeProvider();\r
335             Message result = null;\r
336             var manager =\r
337                 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, time.GetNow);\r
338             var expected1 = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};\r
339             var expected2 = new Message {Title = "遠征が終わりました", Body = "第三艦隊 海上護衛任務", Name = "遠征終了"};\r
340             var elapsed = 0;\r
341             while (true)\r
342             {\r
343                 switch (elapsed)\r
344                 {\r
345                     case 0:\r
346                         manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);\r
347                         manager.Flash();\r
348                         PAssert.That(() => expected1.Equals(result));\r
349                         break;\r
350                     case 1000:\r
351                         manager.Enqueue("遠征終了", 2, "海上護衛任務", 10);\r
352                         manager.Flash();\r
353                         break;\r
354                     case 2000:\r
355                         manager.Flash();\r
356                         PAssert.That(() => expected2.Equals(result));\r
357                         break;\r
358                     case 5000:\r
359                         manager.Flash();\r
360                         manager.StopRepeat("遠征終了", 1);\r
361                         break;\r
362                     case 12000:\r
363                         manager.Flash();\r
364                         PAssert.That(() => expected2.Repeat.Equals(result));\r
365                         return;\r
366                     default:\r
367                         manager.Flash();\r
368                         PAssert.That(() => result == null, elapsed.ToString());\r
369                         break;\r
370                 }\r
371                 result = null;\r
372                 elapsed += 1000;\r
373             }\r
374         }\r
375 \r
376         /// <summary>\r
377         /// 継続中のリピートは艦隊やドックの番号だけ通知する\r
378         /// </summary>\r
379         [TestMethod]\r
380         public void ContinueRepeatWithoutSubject()\r
381         {\r
382             var time = new TimeProvider();\r
383             Message result = null;\r
384             var manager =\r
385                 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, time.GetNow);\r
386             var expected1 = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};\r
387             var expected2 = new Message {Title = "遠征が終わりました", Body = "第二艦隊 ", Name = "遠征終了"};\r
388             var elapsed = 0;\r
389             while (true)\r
390             {\r
391                 switch (elapsed)\r
392                 {\r
393                     case 0:\r
394                         manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);\r
395                         manager.Flash();\r
396                         PAssert.That(() => expected1.Equals(result));\r
397                         break;\r
398                     case 2000:\r
399                         manager.Flash();\r
400                         manager.StopRepeat("遠征終了", true);\r
401                         break;\r
402                     case 10000:\r
403                         manager.Flash();\r
404                         PAssert.That(() => expected2.Cont.Equals(result));\r
405                         break;\r
406                     case 11000:\r
407                         manager.Flash();\r
408                         manager.StopRepeat("遠征終了", 1);\r
409                         break;\r
410                     case 21000:\r
411                         manager.Flash();\r
412                         return;\r
413                     default:\r
414                         manager.Flash();\r
415                         PAssert.That(() => result == null, elapsed.ToString());\r
416                         break;\r
417                 }\r
418                 result = null;\r
419                 elapsed += 1000;\r
420             }\r
421         }\r
422 \r
423         /// <summary>\r
424         /// 予告する\r
425         /// </summary>\r
426         [TestMethod]\r
427         public void PreliminaryNotification()\r
428         {\r
429             var time = new TimeProvider();\r
430             Message result = null;\r
431             var manager =\r
432                 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, time.GetNow);\r
433             var expected = new Message {Title = "[予告] 遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};\r
434             manager.Enqueue("遠征終了", 1, "防空射撃演習", 0, true);\r
435             manager.Flash();\r
436             PAssert.That(() => expected.Equals(result));\r
437         }\r
438 \r
439         /// <summary>\r
440         /// 同時に通知されるタイトルが同じ通知をマージする\r
441         /// </summary>\r
442         [TestMethod]\r
443         public void MergeTwoNotificationsWithSameTitle()\r
444         {\r
445             var time = new TimeProvider();\r
446             Message result = null;\r
447             var manager =\r
448                 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, time.GetNow);\r
449             manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);\r
450             manager.Enqueue("遠征終了", 2, "海上護衛任務", 10);\r
451             manager.Flash();\r
452             PAssert.That(() =>\r
453                 new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習\r\n第三艦隊 海上護衛任務", Name = "遠征終了"}.Equals(result));\r
454         }\r
455 \r
456         /// <summary>\r
457         /// マージされた二つの通知の一方を止める\r
458         /// </summary>\r
459         [TestMethod]\r
460         public void StopOneOfMergedNotifications()\r
461         {\r
462             var time = new TimeProvider();\r
463             Message result = null;\r
464             var manager =\r
465                 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, time.GetNow);\r
466             var expected1 = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習\r\n第三艦隊 海上護衛任務", Name = "遠征終了"};\r
467             var expected2 = new Message {Title = "遠征が終わりました", Body = "第三艦隊 海上護衛任務", Name = "遠征終了"};\r
468             var elapsed = 0;\r
469             while (true)\r
470             {\r
471                 switch (elapsed)\r
472                 {\r
473                     case 0:\r
474                         manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);\r
475                         manager.Enqueue("遠征終了", 2, "海上護衛任務", 10);\r
476                         manager.Flash();\r
477                         PAssert.That(() => expected1.Equals(result));\r
478                         break;\r
479                     case 5000:\r
480                         manager.Flash();\r
481                         manager.StopRepeat("遠征終了", 1);\r
482                         break;\r
483                     case 10000:\r
484                         manager.Flash();\r
485                         PAssert.That(() => expected2.Repeat.Equals(result));\r
486                         return;\r
487                     default:\r
488                         manager.Flash();\r
489                         PAssert.That(() => result == null, elapsed.ToString());\r
490                         break;\r
491                 }\r
492                 result = null;\r
493                 elapsed += 1000;\r
494             }\r
495         }\r
496     }\r
497 }