OSDN Git Service

バージョン11.12の準備
[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 TwoRepeatableNotification()\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 SuspendRepeatWithException()\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 ensei = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};\r
339             var taiha = 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(() => ensei.Equals(result));\r
349                         break;\r
350                     case 1000:\r
351                         manager.Flash();\r
352                         manager.SuspendRepeat("大破警告");\r
353                         break;\r
354                     case 2000:\r
355                         manager.Enqueue("大破警告", "摩耶改二", 8);\r
356                         manager.Flash();\r
357                         PAssert.That(() => taiha.Equals(result));\r
358                         break;\r
359                     case 10000:\r
360                         manager.Flash();\r
361                         PAssert.That(() => taiha.Repeat.Equals(result));\r
362                         break;\r
363                     case 11000:\r
364                         manager.Flash();\r
365                         manager.ResumeRepeat();\r
366                         break;\r
367                     case 12000:\r
368                         manager.Flash();\r
369                         PAssert.That(() => ensei.Repeat.Equals(result));\r
370                         return;\r
371                     default:\r
372                         manager.Flash();\r
373                         PAssert.That(() => result == null, elapsed.ToString());\r
374                         break;\r
375                 }\r
376                 result = null;\r
377                 elapsed += 1000;\r
378             }\r
379         }\r
380 \r
381         /// <summary>\r
382         /// リピート中の特定の通知を止める\r
383         /// </summary>\r
384         [TestMethod]\r
385         public void StopSpecificRepeatingNotification()\r
386         {\r
387             var time = new TimeProvider();\r
388             Message result = null;\r
389             var manager =\r
390                 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, time.GetNow);\r
391             var expected1 = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};\r
392             var expected2 = new Message {Title = "遠征が終わりました", Body = "第三艦隊 海上護衛任務", Name = "遠征終了"};\r
393             var elapsed = 0;\r
394             while (true)\r
395             {\r
396                 switch (elapsed)\r
397                 {\r
398                     case 0:\r
399                         manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);\r
400                         manager.Flash();\r
401                         PAssert.That(() => expected1.Equals(result));\r
402                         break;\r
403                     case 1000:\r
404                         manager.Enqueue("遠征終了", 2, "海上護衛任務", 10);\r
405                         manager.Flash();\r
406                         break;\r
407                     case 2000:\r
408                         manager.Flash();\r
409                         PAssert.That(() => expected2.Equals(result));\r
410                         break;\r
411                     case 5000:\r
412                         manager.Flash();\r
413                         manager.StopRepeat("遠征終了", 1);\r
414                         break;\r
415                     case 12000:\r
416                         manager.Flash();\r
417                         PAssert.That(() => expected2.Repeat.Equals(result));\r
418                         return;\r
419                     default:\r
420                         manager.Flash();\r
421                         PAssert.That(() => result == null, elapsed.ToString());\r
422                         break;\r
423                 }\r
424                 result = null;\r
425                 elapsed += 1000;\r
426             }\r
427         }\r
428 \r
429         /// <summary>\r
430         /// 継続中のリピートは艦隊やドックの番号だけ通知する\r
431         /// </summary>\r
432         [TestMethod]\r
433         public void ContinueRepeatWithoutSubject()\r
434         {\r
435             var time = new TimeProvider();\r
436             Message result = null;\r
437             var manager =\r
438                 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, time.GetNow);\r
439             var expected1 = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};\r
440             var expected2 = new Message {Title = "遠征が終わりました", Body = "第二艦隊 ", Name = "遠征終了"};\r
441             var elapsed = 0;\r
442             while (true)\r
443             {\r
444                 switch (elapsed)\r
445                 {\r
446                     case 0:\r
447                         manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);\r
448                         manager.Flash();\r
449                         PAssert.That(() => expected1.Equals(result));\r
450                         break;\r
451                     case 2000:\r
452                         manager.Flash();\r
453                         manager.StopRepeat("遠征終了", true);\r
454                         break;\r
455                     case 10000:\r
456                         manager.Flash();\r
457                         PAssert.That(() => expected2.Cont.Equals(result));\r
458                         break;\r
459                     case 11000:\r
460                         manager.Flash();\r
461                         manager.StopRepeat("遠征終了", 1);\r
462                         break;\r
463                     case 21000:\r
464                         manager.Flash();\r
465                         return;\r
466                     default:\r
467                         manager.Flash();\r
468                         PAssert.That(() => result == null, elapsed.ToString());\r
469                         break;\r
470                 }\r
471                 result = null;\r
472                 elapsed += 1000;\r
473             }\r
474         }\r
475 \r
476         /// <summary>\r
477         /// 予告する\r
478         /// </summary>\r
479         [TestMethod]\r
480         public void PreliminaryNotification()\r
481         {\r
482             var time = new TimeProvider();\r
483             Message result = null;\r
484             var manager =\r
485                 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, time.GetNow);\r
486             var expected = new Message {Title = "[予告] 遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};\r
487             manager.Enqueue("遠征終了", 1, "防空射撃演習", 0, true);\r
488             manager.Flash();\r
489             PAssert.That(() => expected.Equals(result));\r
490         }\r
491 \r
492         /// <summary>\r
493         /// 同時に通知されるタイトルが同じ通知をマージする\r
494         /// </summary>\r
495         [TestMethod]\r
496         public void MergeTwoNotificationsWithSameTitle()\r
497         {\r
498             var time = new TimeProvider();\r
499             Message result = null;\r
500             var manager =\r
501                 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, time.GetNow);\r
502             manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);\r
503             manager.Enqueue("遠征終了", 2, "海上護衛任務", 10);\r
504             manager.Flash();\r
505             PAssert.That(() =>\r
506                 new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習\r\n第三艦隊 海上護衛任務", Name = "遠征終了"}.Equals(result));\r
507         }\r
508 \r
509         /// <summary>\r
510         /// マージされた二つの通知の一方を止める\r
511         /// </summary>\r
512         [TestMethod]\r
513         public void StopOneOfMergedNotifications()\r
514         {\r
515             var time = new TimeProvider();\r
516             Message result = null;\r
517             var manager =\r
518                 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, time.GetNow);\r
519             var expected1 = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習\r\n第三艦隊 海上護衛任務", Name = "遠征終了"};\r
520             var expected2 = new Message {Title = "遠征が終わりました", Body = "第三艦隊 海上護衛任務", Name = "遠征終了"};\r
521             var elapsed = 0;\r
522             while (true)\r
523             {\r
524                 switch (elapsed)\r
525                 {\r
526                     case 0:\r
527                         manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);\r
528                         manager.Enqueue("遠征終了", 2, "海上護衛任務", 10);\r
529                         manager.Flash();\r
530                         PAssert.That(() => expected1.Equals(result));\r
531                         break;\r
532                     case 5000:\r
533                         manager.Flash();\r
534                         manager.StopRepeat("遠征終了", 1);\r
535                         break;\r
536                     case 10000:\r
537                         manager.Flash();\r
538                         PAssert.That(() => expected2.Repeat.Equals(result));\r
539                         return;\r
540                     default:\r
541                         manager.Flash();\r
542                         PAssert.That(() => result == null, elapsed.ToString());\r
543                         break;\r
544                 }\r
545                 result = null;\r
546                 elapsed += 1000;\r
547             }\r
548         }\r
549     }\r
550 }