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("遠征終了", "防空射撃演習");
\r
108 PAssert.That(() => new Message {Title = "遠征が終わりました", Body = "第一艦隊 防空射撃演習", Name = "遠征終了"}.Equals(result));
\r
112 /// 連続した通知の間隔を二秒空ける
\r
115 public void TwoNotificationAtSameTime()
\r
117 var timer = new MockTimer();
\r
118 Message result = null;
\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
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
134 /// 一つ目の通知の一秒後に投入された通知は一秒ずらす
\r
137 public void TwoNotification1SecDelay()
\r
139 var timer = new MockTimer();
\r
140 Message result = null;
\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
155 public void SingleRepeatableNotification()
\r
157 var timer = new MockTimer();
\r
158 Message result = null;
\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
164 switch (timer.Elapsed)
\r
167 manager.Enqueue("遠征終了", 1, "防空射撃演習", 2);
\r
168 PAssert.That(() => expected.Equals(result));
\r
171 PAssert.That(() => expected.Repeat.Equals(result));
\r
174 PAssert.That(() => expected.Repeat.Equals(result));
\r
177 PAssert.That(() => result == null, timer.Elapsed.ToString());
\r
181 timer.ElapseTime(1000);
\r
189 public void TwoRepeatableNotofication()
\r
191 var timer = new MockTimer();
\r
192 Message result = null;
\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
199 switch (timer.Elapsed)
\r
202 manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);
\r
203 PAssert.That(() => ensei.Equals(result));
\r
206 manager.Enqueue("泊地修理20分経過", 0, "", 5);
\r
207 PAssert.That(() => hakuchi.Equals(result));
\r
210 PAssert.That(() => hakuchi.Repeat.Equals(result), "泊地修理2回目");
\r
213 PAssert.That(() => ensei.Repeat.Equals(result), "遠征終了2回目");
\r
216 PAssert.That(() => result == null, timer.Elapsed.ToString());
\r
220 timer.ElapseTime(1000);
\r
225 /// スケジュールがぶつかる二つの通知をリピートさせる
\r
228 public void TwoRepeatableNotification1SecDelay()
\r
230 var timer = new MockTimer();
\r
231 Message result = null;
\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
238 switch (timer.Elapsed)
\r
241 manager.Enqueue("遠征終了", 1, "防空射撃演習", 3);
\r
242 PAssert.That(() => ensei.Equals(result));
\r
245 manager.Enqueue("泊地修理20分経過", 0, "", 2);
\r
248 PAssert.That(() => hakuchi.Equals(result));
\r
251 PAssert.That(() => ensei.Repeat.Equals(result), "遠征終了2回目");
\r
254 PAssert.That(() => hakuchi.Repeat.Equals(result), "泊地修理2回目");
\r
257 PAssert.That(() => result == null, timer.Elapsed.ToString());
\r
261 timer.ElapseTime(1000);
\r
269 public void RemoveRepeatableNotification()
\r
271 var timer = new MockTimer();
\r
272 Message result = null;
\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
279 switch (timer.Elapsed)
\r
282 manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);
\r
283 PAssert.That(() => ensei.Equals(result));
\r
286 manager.Enqueue("入渠終了", 0, "綾波改二", 5);
\r
287 PAssert.That(() => nyukyo.Equals(result));
\r
290 manager.StopRepeat("入渠終了");
\r
293 PAssert.That(() => result == null, "入渠終了2回目はない");
\r
296 PAssert.That(() => ensei.Repeat.Equals(result), "遠征終了2回目");
\r
299 PAssert.That(() => result == null, timer.Elapsed.ToString());
\r
303 timer.ElapseTime(1000);
\r
311 public void SuspendRepeat()
\r
313 var timer = new MockTimer();
\r
314 Message result = null;
\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
320 switch (timer.Elapsed)
\r
323 manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);
\r
324 PAssert.That(() => expected.Equals(result));
\r
327 manager.SuspendRepeat();
\r
330 manager.ResumeRepeat();
\r
333 PAssert.That(() => expected.Repeat.Equals(result));
\r
336 PAssert.That(() => result == null, timer.Elapsed.ToString());
\r
340 timer.ElapseTime(1000);
\r
345 /// リピート中の特定の通知を止める
\r
348 public void StopSpecificRepeatingNotification()
\r
350 var timer = new MockTimer();
\r
351 Message result = null;
\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
358 switch (timer.Elapsed)
\r
361 manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);
\r
362 manager.Enqueue("遠征終了", 2, "海上護衛任務", 10);
\r
363 PAssert.That(() => expected1.Equals(result));
\r
366 PAssert.That(() => expected2.Equals(result));
\r
369 manager.StopRepeat("遠征終了", 1);
\r
372 PAssert.That(() => expected2.Repeat.Equals(result));
\r
375 PAssert.That(() => result == null, timer.Elapsed.ToString());
\r
380 timer.ElapseTime(1000);
\r
385 /// 継続中のリピートは艦隊やドックの番号だけ通知する
\r
388 public void ContinueRepeatWithoutSubject()
\r
390 var timer = new MockTimer();
\r
391 Message result = null;
\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
398 switch (timer.Elapsed)
\r
401 manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);
\r
402 PAssert.That(() => expected1.Equals(result));
\r
405 manager.StopRepeat("遠征終了", true);
\r
408 PAssert.That(() => expected2.Cont.Equals(result));
\r
411 manager.StopRepeat("遠征終了", 1);
\r
416 PAssert.That(() => result == null, timer.Elapsed.ToString());
\r
421 timer.ElapseTime(1000);
\r
429 public void PreliminaryNotification()
\r
431 var timer = new MockTimer();
\r
432 Message result = null;
\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