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 TimeProvider
\r
26 private DateTime _now = new DateTime(2017, 11, 1);
\r
28 public DateTime GetNow()
\r
31 _now += TimeSpan.FromSeconds(1);
\r
36 private class Message
\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
42 public bool Equals(Message other) =>
\r
43 other != null && Title == other.Title && Body == other.Body && Name == other.Name;
\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
53 public void SingleNotification()
\r
55 var time = new TimeProvider();
\r
56 Message result = null;
\r
58 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, time.GetNow);
\r
59 manager.Enqueue("遠征終了", 1, "防空射撃演習");
\r
61 PAssert.That(() => new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"}.Equals(result));
\r
68 public void TwoNotificationAtSameTime()
\r
70 var time = new TimeProvider();
\r
71 Message result = null;
\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
77 PAssert.That(() => new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"}.Equals(result));
\r
80 PAssert.That(() => result == null);
\r
82 PAssert.That(() => new Message {Title = "疲労が回復しました", Body = "第二艦隊", Name = "疲労回復"}.Equals(result));
\r
86 /// 一つ目の通知の一秒後に投入された通知は一秒ずらす
\r
89 public void TwoNotification1SecDelay()
\r
91 var time = new TimeProvider();
\r
92 Message result = null;
\r
94 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, time.GetNow);
\r
95 manager.Enqueue("建造完了", 0, "");
\r
97 PAssert.That(() => new Message {Title = "建造が終わりました", Body = "第一ドック", Name = "建造完了"}.Equals(result));
\r
99 manager.Enqueue("建造完了", 1, "");
\r
101 PAssert.That(() => new Message {Title = "建造が終わりました", Body = "第二ドック", Name = "建造完了"}.Equals(result));
\r
108 public void SingleRepeatableNotification()
\r
110 var time = new TimeProvider();
\r
111 Message result = null;
\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
121 manager.Enqueue("遠征終了", 1, "防空射撃演習", 2);
\r
123 PAssert.That(() => expected.Equals(result));
\r
127 PAssert.That(() => expected.Repeat.Equals(result));
\r
131 PAssert.That(() => expected.Repeat.Equals(result));
\r
135 PAssert.That(() => result == null, elapsed.ToString());
\r
147 public void TwoRepeatableNotofication()
\r
149 var time = new TimeProvider();
\r
150 Message result = null;
\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
161 manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);
\r
163 PAssert.That(() => ensei.Equals(result));
\r
166 manager.Enqueue("泊地修理20分経過", 0, "", 5);
\r
168 PAssert.That(() => hakuchi.Equals(result));
\r
172 PAssert.That(() => hakuchi.Repeat.Equals(result), "泊地修理2回目");
\r
176 PAssert.That(() => ensei.Repeat.Equals(result), "遠征終了2回目");
\r
180 PAssert.That(() => result == null, elapsed.ToString());
\r
189 /// スケジュールがぶつかる二つの通知をリピートさせる
\r
192 public void TwoRepeatableNotification1SecDelay()
\r
194 var time = new TimeProvider();
\r
195 Message result = null;
\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
206 manager.Enqueue("遠征終了", 1, "防空射撃演習", 3);
\r
208 PAssert.That(() => ensei.Equals(result));
\r
211 manager.Enqueue("泊地修理20分経過", 0, "", 2);
\r
216 PAssert.That(() => hakuchi.Equals(result));
\r
220 PAssert.That(() => ensei.Repeat.Equals(result), "遠征終了2回目");
\r
224 PAssert.That(() => hakuchi.Repeat.Equals(result), "泊地修理2回目");
\r
228 PAssert.That(() => result == null, elapsed.ToString());
\r
240 public void RemoveRepeatableNotification()
\r
242 var time = new TimeProvider();
\r
243 Message result = null;
\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
254 manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);
\r
256 PAssert.That(() => ensei.Equals(result));
\r
259 manager.Enqueue("入渠終了", 0, "綾波改二", 5);
\r
261 PAssert.That(() => nyukyo.Equals(result));
\r
264 manager.StopRepeat("入渠終了");
\r
269 PAssert.That(() => result == null, "入渠終了2回目はない");
\r
273 PAssert.That(() => ensei.Repeat.Equals(result), "遠征終了2回目");
\r
277 PAssert.That(() => result == null, elapsed.ToString());
\r
289 public void SuspendRepeat()
\r
291 var time = new TimeProvider();
\r
292 Message result = null;
\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
302 manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);
\r
304 PAssert.That(() => expected.Equals(result));
\r
308 manager.SuspendRepeat();
\r
312 manager.ResumeRepeat();
\r
316 PAssert.That(() => expected.Repeat.Equals(result));
\r
320 PAssert.That(() => result == null, elapsed.ToString());
\r
329 /// リピート中の特定の通知を止める
\r
332 public void StopSpecificRepeatingNotification()
\r
334 var time = new TimeProvider();
\r
335 Message result = null;
\r
337 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, time.GetNow);
\r
338 var expected1 = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};
\r
339 var expected2 = new Message {Title = "遠征が終わりました", Body = "第三艦隊 海上護衛任務", Name = "遠征終了"};
\r
346 manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);
\r
348 PAssert.That(() => expected1.Equals(result));
\r
351 manager.Enqueue("遠征終了", 2, "海上護衛任務", 10);
\r
356 PAssert.That(() => expected2.Equals(result));
\r
360 manager.StopRepeat("遠征終了", 1);
\r
364 PAssert.That(() => expected2.Repeat.Equals(result));
\r
368 PAssert.That(() => result == null, elapsed.ToString());
\r
377 /// 継続中のリピートは艦隊やドックの番号だけ通知する
\r
380 public void ContinueRepeatWithoutSubject()
\r
382 var time = new TimeProvider();
\r
383 Message result = null;
\r
385 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, time.GetNow);
\r
386 var expected1 = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};
\r
387 var expected2 = new Message {Title = "遠征が終わりました", Body = "第二艦隊 ", Name = "遠征終了"};
\r
394 manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);
\r
396 PAssert.That(() => expected1.Equals(result));
\r
400 manager.StopRepeat("遠征終了", true);
\r
404 PAssert.That(() => expected2.Cont.Equals(result));
\r
408 manager.StopRepeat("遠征終了", 1);
\r
415 PAssert.That(() => result == null, elapsed.ToString());
\r
427 public void PreliminaryNotification()
\r
429 var time = new TimeProvider();
\r
430 Message result = null;
\r
432 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, time.GetNow);
\r
433 var expected = new Message {Title = "[予告] 遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};
\r
434 manager.Enqueue("遠征終了", 1, "防空射撃演習", 0, true);
\r
436 PAssert.That(() => expected.Equals(result));
\r
440 /// 同時に通知されるタイトルが同じ通知をマージする
\r
443 public void MergeTwoNotificationsWithSameTitle()
\r
445 var time = new TimeProvider();
\r
446 Message result = null;
\r
448 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, time.GetNow);
\r
449 manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);
\r
450 manager.Enqueue("遠征終了", 2, "海上護衛任務", 10);
\r
453 new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習\r\n第三艦隊 海上護衛任務", Name = "遠征終了"}.Equals(result));
\r
457 /// マージされた二つの通知の一方を止める
\r
460 public void StopOneOfMergedNotifications()
\r
462 var time = new TimeProvider();
\r
463 Message result = null;
\r
465 new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, time.GetNow);
\r
466 var expected1 = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習\r\n第三艦隊 海上護衛任務", Name = "遠征終了"};
\r
467 var expected2 = new Message {Title = "遠征が終わりました", Body = "第三艦隊 海上護衛任務", Name = "遠征終了"};
\r
474 manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);
\r
475 manager.Enqueue("遠征終了", 2, "海上護衛任務", 10);
\r
477 PAssert.That(() => expected1.Equals(result));
\r
481 manager.StopRepeat("遠征終了", 1);
\r
485 PAssert.That(() => expected2.Repeat.Equals(result));
\r
489 PAssert.That(() => result == null, elapsed.ToString());
\r