OSDN Git Service

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