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
98 public void SingleNotification()
\r
100 var timer = new MockTimer();
\r
101 Message result = null;
\r
103 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, timer);
\r
104 manager.Enqueue("遠征終了", "防空射撃演習");
\r
105 PAssert.That(() => new Message {Title = "遠征が終わりました", Body = "第一艦隊 防空射撃演習", Name = "遠征終了"}.Equals(result));
\r
109 /// 連続した通知の間隔を二秒空ける
\r
112 public void TwoNotificationAtSameTime()
\r
114 var timer = new MockTimer();
\r
115 Message result = null;
\r
117 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, timer);
\r
118 manager.Enqueue("疲労回復40", 0, "cond40");
\r
119 manager.Enqueue("疲労回復49", 1, "cond49");
\r
120 PAssert.That(() => new Message {Title = "疲労が回復しました", Body = "第一艦隊 残り9分", Name = "疲労回復"}.Equals(result));
\r
122 timer.ElapseTime(1000);
\r
123 PAssert.That(() => result == null);
\r
124 timer.ElapseTime(1000);
\r
125 PAssert.That(() => new Message {Title = "疲労が回復しました", Body = "第二艦隊", Name = "疲労回復"}.Equals(result));
\r
126 timer.ElapseTime(2000);
\r
127 PAssert.That(() => !timer.Enabled);
\r
131 /// 一つ目の通知の一秒後に投入された通知は一秒ずらす
\r
134 public void TwoNotification1SecDelay()
\r
136 var timer = new MockTimer();
\r
137 Message result = null;
\r
139 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, timer);
\r
140 manager.Enqueue("建造完了", 0, "");
\r
141 PAssert.That(() => new Message {Title = "建造が終わりました", Body = "第一ドック", Name = "建造完了"}.Equals(result));
\r
142 timer.ElapseTime(1000);
\r
143 manager.Enqueue("建造完了", 1, "");
\r
144 timer.ElapseTime(1000);
\r
145 PAssert.That(() => new Message {Title = "建造が終わりました", Body = "第二ドック", Name = "建造完了"}.Equals(result));
\r
152 public void SingleRepeatableNotification()
\r
154 var timer = new MockTimer();
\r
155 Message result = null;
\r
157 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, timer);
\r
158 var expected = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};
\r
161 switch (timer.Elapsed)
\r
164 manager.Enqueue("遠征終了", 1, "防空射撃演習", 2);
\r
165 PAssert.That(() => expected.Equals(result));
\r
168 PAssert.That(() => expected.Equals(result));
\r
171 PAssert.That(() => expected.Equals(result));
\r
174 PAssert.That(() => result == null, timer.Elapsed.ToString());
\r
178 timer.ElapseTime(1000);
\r
186 public void TwoRepeatableNotofication()
\r
188 var timer = new MockTimer();
\r
189 Message result = null;
\r
191 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, timer);
\r
192 var ensei = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};
\r
193 var hakuchi = new Message {Title = "泊地修理 第一艦隊", Body = "20分経過しました。", Name = "泊地修理20分経過"};
\r
196 switch (timer.Elapsed)
\r
199 manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);
\r
200 PAssert.That(() => ensei.Equals(result));
\r
203 manager.Enqueue("泊地修理20分経過", 0, "", 5);
\r
204 PAssert.That(() => hakuchi.Equals(result));
\r
207 PAssert.That(() => hakuchi.Equals(result), "泊地修理2回目");
\r
210 PAssert.That(() => ensei.Equals(result), "遠征終了2回目");
\r
213 PAssert.That(() => result == null, timer.Elapsed.ToString());
\r
217 timer.ElapseTime(1000);
\r
222 /// スケジュールがぶつかる二つの通知をリピートさせる
\r
225 public void TwoRepeatableNotification1SecDelay()
\r
227 var timer = new MockTimer();
\r
228 Message result = null;
\r
230 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, timer);
\r
231 var ensei = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};
\r
232 var hakuchi = new Message {Title = "泊地修理 第一艦隊", Body = "20分経過しました。", Name = "泊地修理20分経過"};
\r
235 switch (timer.Elapsed)
\r
238 manager.Enqueue("遠征終了", 1, "防空射撃演習", 3);
\r
239 PAssert.That(() => ensei.Equals(result));
\r
242 manager.Enqueue("泊地修理20分経過", 0, "", 2);
\r
245 PAssert.That(() => hakuchi.Equals(result));
\r
248 PAssert.That(() => ensei.Equals(result), "遠征終了2回目");
\r
251 PAssert.That(() => hakuchi.Equals(result), "泊地修理2回目");
\r
254 PAssert.That(() => result == null, timer.Elapsed.ToString());
\r
258 timer.ElapseTime(1000);
\r
266 public void RemoveRepeatableNotification()
\r
268 var timer = new MockTimer();
\r
269 Message result = null;
\r
271 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, timer);
\r
272 var ensei = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};
\r
273 var nyukyo = new Message {Title = "入渠が終わりました", Body = "第一ドック 綾波改二", Name = "入渠終了"};
\r
276 switch (timer.Elapsed)
\r
279 manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);
\r
280 PAssert.That(() => ensei.Equals(result));
\r
283 manager.Enqueue("入渠終了", 0, "綾波改二", 5);
\r
284 PAssert.That(() => nyukyo.Equals(result));
\r
287 manager.StopRepeat("入渠終了");
\r
290 PAssert.That(() => result == null, "入渠終了2回目はない");
\r
293 PAssert.That(() => ensei.Equals(result), "遠征終了2回目");
\r
296 PAssert.That(() => result == null, timer.Elapsed.ToString());
\r
300 timer.ElapseTime(1000);
\r
308 public void SuspendRepeat()
\r
310 var timer = new MockTimer();
\r
311 Message result = null;
\r
313 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, timer);
\r
314 var expected = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};
\r
317 switch (timer.Elapsed)
\r
320 manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);
\r
321 PAssert.That(() => expected.Equals(result));
\r
324 manager.SuspendRepeat();
\r
327 manager.ResumeRepeat();
\r
330 PAssert.That(() => expected.Equals(result));
\r
333 PAssert.That(() => result == null, timer.Elapsed.ToString());
\r
337 timer.ElapseTime(1000);
\r
342 /// リピート中の特定の通知を止める
\r
345 public void StopSpecificRepeatingNotification()
\r
347 var timer = new MockTimer();
\r
348 Message result = null;
\r
350 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, timer);
\r
351 var expected1 = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};
\r
352 var expected2 = new Message {Title = "遠征が終わりました", Body = "第三艦隊 海上護衛任務", Name = "遠征終了"};
\r
355 switch (timer.Elapsed)
\r
358 manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);
\r
359 manager.Enqueue("遠征終了", 2, "海上護衛任務", 10);
\r
360 PAssert.That(() => expected1.Equals(result));
\r
363 PAssert.That(() => expected2.Equals(result));
\r
366 manager.StopRepeat("遠征終了", 1);
\r
369 PAssert.That(() => expected2.Equals(result));
\r
372 PAssert.That(() => result == null, timer.Elapsed.ToString());
\r
377 timer.ElapseTime(1000);
\r
382 /// 継続中のリピートは艦隊やドックの番号だけ通知する
\r
385 public void ContinueRepeatWithoutSubject()
\r
387 var timer = new MockTimer();
\r
388 Message result = null;
\r
390 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, timer);
\r
391 var expected1 = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};
\r
392 var expected2 = new Message {Title = "遠征が終わりました", Body = "第二艦隊 ", Name = "遠征終了"};
\r
395 switch (timer.Elapsed)
\r
398 manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);
\r
399 PAssert.That(() => expected1.Equals(result));
\r
402 manager.StopRepeat("遠征終了", true);
\r
405 PAssert.That(() => expected2.Equals(result));
\r
408 manager.StopRepeat("遠征終了", 1);
\r
413 PAssert.That(() => result == null, timer.Elapsed.ToString());
\r
418 timer.ElapseTime(1000);
\r