1 // Copyright (C) 2017 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 ExpressionToCodeLib;
\r
17 using Microsoft.VisualStudio.TestTools.UnitTesting;
\r
19 namespace KancolleSniffer.Test
\r
22 public class NotificationManagerTest
\r
24 private class MockTimer : NotificationManager.ITimer
\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
36 public int Interval { get; set; }
\r
44 _start += TimeSpan.FromMilliseconds(_elapsed);
\r
49 public event EventHandler Tick;
\r
61 public DateTime Now => _now;
\r
63 public int Elapsed => _totalElapsed;
\r
65 public void ElapseTime(int millis)
\r
67 _totalElapsed += millis;
\r
70 _now = _start += TimeSpan.FromMilliseconds(millis);
\r
73 var after = _elapsed + millis;
\r
74 for (var n = _elapsed / Interval; n < after / Interval; n++)
\r
76 _now = _start + TimeSpan.FromMilliseconds((n + 1) * Interval);
\r
77 Tick?.Invoke(this, EventArgs.Empty);
\r
80 _now = _start + TimeSpan.FromMilliseconds(_elapsed);
\r
84 private class Message
\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
90 public bool Equals(Message other) =>
\r
91 other != null && Title == other.Title && Body == other.Body && Name == other.Name;
\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
101 public void SingleNotification()
\r
103 var timer = new MockTimer();
\r
104 Message result = null;
\r
106 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, timer);
\r
107 manager.Enqueue("遠征終了", 1, "防空射撃演習");
\r
109 PAssert.That(() => new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"}.Equals(result));
\r
113 /// 連続した通知の間隔を二秒空ける
\r
116 public void TwoNotificationAtSameTime()
\r
118 var timer = new MockTimer();
\r
119 Message result = null;
\r
121 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, timer);
\r
122 manager.Enqueue("遠征終了", 1, "防空射撃演習");
\r
123 manager.Enqueue("疲労回復49", 1, "cond49");
\r
125 PAssert.That(() => new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"}.Equals(result));
\r
127 timer.ElapseTime(1000);
\r
128 PAssert.That(() => result == null);
\r
129 timer.ElapseTime(1000);
\r
130 PAssert.That(() => new Message {Title = "疲労が回復しました", Body = "第二艦隊", Name = "疲労回復"}.Equals(result));
\r
131 timer.ElapseTime(2000);
\r
132 PAssert.That(() => !timer.Enabled);
\r
136 /// 一つ目の通知の一秒後に投入された通知は一秒ずらす
\r
139 public void TwoNotification1SecDelay()
\r
141 var timer = new MockTimer();
\r
142 Message result = null;
\r
144 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, timer);
\r
145 manager.Enqueue("建造完了", 0, "");
\r
147 PAssert.That(() => new Message {Title = "建造が終わりました", Body = "第一ドック", Name = "建造完了"}.Equals(result));
\r
148 timer.ElapseTime(1000);
\r
149 manager.Enqueue("建造完了", 1, "");
\r
151 timer.ElapseTime(1000);
\r
152 PAssert.That(() => new Message {Title = "建造が終わりました", Body = "第二ドック", Name = "建造完了"}.Equals(result));
\r
159 public void SingleRepeatableNotification()
\r
161 var timer = new MockTimer();
\r
162 Message result = null;
\r
164 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, timer);
\r
165 var expected = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};
\r
168 switch (timer.Elapsed)
\r
171 manager.Enqueue("遠征終了", 1, "防空射撃演習", 2);
\r
173 PAssert.That(() => expected.Equals(result));
\r
176 PAssert.That(() => expected.Repeat.Equals(result));
\r
179 PAssert.That(() => expected.Repeat.Equals(result));
\r
182 PAssert.That(() => result == null, timer.Elapsed.ToString());
\r
186 timer.ElapseTime(1000);
\r
194 public void TwoRepeatableNotofication()
\r
196 var timer = new MockTimer();
\r
197 Message result = null;
\r
199 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, timer);
\r
200 var ensei = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};
\r
201 var hakuchi = new Message {Title = "泊地修理 第一艦隊", Body = "20分経過しました。", Name = "泊地修理20分経過"};
\r
204 switch (timer.Elapsed)
\r
207 manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);
\r
209 PAssert.That(() => ensei.Equals(result));
\r
212 manager.Enqueue("泊地修理20分経過", 0, "", 5);
\r
214 PAssert.That(() => hakuchi.Equals(result));
\r
217 PAssert.That(() => hakuchi.Repeat.Equals(result), "泊地修理2回目");
\r
220 PAssert.That(() => ensei.Repeat.Equals(result), "遠征終了2回目");
\r
223 PAssert.That(() => result == null, timer.Elapsed.ToString());
\r
227 timer.ElapseTime(1000);
\r
232 /// スケジュールがぶつかる二つの通知をリピートさせる
\r
235 public void TwoRepeatableNotification1SecDelay()
\r
237 var timer = new MockTimer();
\r
238 Message result = null;
\r
240 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, timer);
\r
241 var ensei = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};
\r
242 var hakuchi = new Message {Title = "泊地修理 第一艦隊", Body = "20分経過しました。", Name = "泊地修理20分経過"};
\r
245 switch (timer.Elapsed)
\r
248 manager.Enqueue("遠征終了", 1, "防空射撃演習", 3);
\r
250 PAssert.That(() => ensei.Equals(result));
\r
253 manager.Enqueue("泊地修理20分経過", 0, "", 2);
\r
257 PAssert.That(() => hakuchi.Equals(result));
\r
260 PAssert.That(() => ensei.Repeat.Equals(result), "遠征終了2回目");
\r
263 PAssert.That(() => hakuchi.Repeat.Equals(result), "泊地修理2回目");
\r
266 PAssert.That(() => result == null, timer.Elapsed.ToString());
\r
270 timer.ElapseTime(1000);
\r
278 public void RemoveRepeatableNotification()
\r
280 var timer = new MockTimer();
\r
281 Message result = null;
\r
283 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, timer);
\r
284 var ensei = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};
\r
285 var nyukyo = new Message {Title = "入渠が終わりました", Body = "第一ドック 綾波改二", Name = "入渠終了"};
\r
288 switch (timer.Elapsed)
\r
291 manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);
\r
293 PAssert.That(() => ensei.Equals(result));
\r
296 manager.Enqueue("入渠終了", 0, "綾波改二", 5);
\r
298 PAssert.That(() => nyukyo.Equals(result));
\r
301 manager.StopRepeat("入渠終了");
\r
304 PAssert.That(() => result == null, "入渠終了2回目はない");
\r
307 PAssert.That(() => ensei.Repeat.Equals(result), "遠征終了2回目");
\r
310 PAssert.That(() => result == null, timer.Elapsed.ToString());
\r
314 timer.ElapseTime(1000);
\r
322 public void SuspendRepeat()
\r
324 var timer = new MockTimer();
\r
325 Message result = null;
\r
327 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, timer);
\r
328 var expected = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};
\r
331 switch (timer.Elapsed)
\r
334 manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);
\r
336 PAssert.That(() => expected.Equals(result));
\r
339 manager.SuspendRepeat();
\r
342 manager.ResumeRepeat();
\r
345 PAssert.That(() => expected.Repeat.Equals(result));
\r
348 PAssert.That(() => result == null, timer.Elapsed.ToString());
\r
352 timer.ElapseTime(1000);
\r
357 /// リピート中の特定の通知を止める
\r
360 public void StopSpecificRepeatingNotification()
\r
362 var timer = new MockTimer();
\r
363 Message result = null;
\r
365 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, timer);
\r
366 var expected1 = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};
\r
367 var expected2 = new Message {Title = "遠征が終わりました", Body = "第三艦隊 海上護衛任務", Name = "遠征終了"};
\r
370 switch (timer.Elapsed)
\r
373 manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);
\r
375 PAssert.That(() => expected1.Equals(result));
\r
378 manager.Enqueue("遠征終了", 2, "海上護衛任務", 10);
\r
382 PAssert.That(() => expected2.Equals(result));
\r
385 manager.StopRepeat("遠征終了", 1);
\r
388 PAssert.That(() => expected2.Repeat.Equals(result));
\r
391 PAssert.That(() => result == null, timer.Elapsed.ToString());
\r
395 timer.ElapseTime(1000);
\r
400 /// 継続中のリピートは艦隊やドックの番号だけ通知する
\r
403 public void ContinueRepeatWithoutSubject()
\r
405 var timer = new MockTimer();
\r
406 Message result = null;
\r
408 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, timer);
\r
409 var expected1 = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};
\r
410 var expected2 = new Message {Title = "遠征が終わりました", Body = "第二艦隊 ", Name = "遠征終了"};
\r
413 switch (timer.Elapsed)
\r
416 manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);
\r
418 PAssert.That(() => expected1.Equals(result));
\r
421 manager.StopRepeat("遠征終了", true);
\r
424 PAssert.That(() => expected2.Cont.Equals(result));
\r
427 manager.StopRepeat("遠征終了", 1);
\r
432 PAssert.That(() => result == null, timer.Elapsed.ToString());
\r
436 timer.ElapseTime(1000);
\r
444 public void PreliminaryNotification()
\r
446 var timer = new MockTimer();
\r
447 Message result = null;
\r
449 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, timer);
\r
450 var expected = new Message {Title = "[予告] 遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};
\r
451 manager.Enqueue("遠征終了", 1, "防空射撃演習", 0, true);
\r
453 PAssert.That(() => expected.Equals(result));
\r
457 /// 同時に通知されるタイトルが同じ通知をマージする
\r
460 public void MergeTwoNotificationsWithSameTitle()
\r
462 var timer = new MockTimer();
\r
463 Message result = null;
\r
465 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, timer);
\r
466 manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);
\r
467 manager.Enqueue("遠征終了", 2, "海上護衛任務", 10);
\r
470 new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習\r\n第三艦隊 海上護衛任務", Name = "遠征終了"}.Equals(result));
\r
474 /// マージされた二つの通知の一方を止める
\r
477 public void StopOneOfMergedNotifications()
\r
479 var timer = new MockTimer();
\r
480 Message result = null;
\r
482 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, timer);
\r
483 var expected1 = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習\r\n第三艦隊 海上護衛任務", Name = "遠征終了"};
\r
484 var expected2 = new Message {Title = "遠征が終わりました", Body = "第三艦隊 海上護衛任務", Name = "遠征終了"};
\r
487 switch (timer.Elapsed)
\r
490 manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);
\r
491 manager.Enqueue("遠征終了", 2, "海上護衛任務", 10);
\r
493 PAssert.That(() => expected1.Equals(result));
\r
496 manager.StopRepeat("遠征終了", 1);
\r
499 PAssert.That(() => expected2.Repeat.Equals(result));
\r
502 PAssert.That(() => result == null, timer.Elapsed.ToString());
\r
506 timer.ElapseTime(1000);
\r