OSDN Git Service

NotificationManagerでリピートを中断できるようにする
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Thu, 9 Nov 2017 14:30:00 +0000 (23:30 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Sat, 27 Jan 2018 08:33:49 +0000 (17:33 +0900)
KancolleSniffer.Test/NotificationManagerTest.cs
KancolleSniffer/NotificationManager.cs

index c23afcd..506d914 100644 (file)
@@ -300,5 +300,42 @@ namespace KancolleSniffer.Test
                 timer.ElapseTime(1000);\r
             }\r
         }\r
+\r
+        /// <summary>\r
+        /// リピートを中断・再開する\r
+        /// </summary>\r
+        [TestMethod]\r
+        public void SuspendRepeat()\r
+        {\r
+            var timer = new MockTimer();\r
+            Message result = null;\r
+            var manager =\r
+                new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, timer);\r
+            var expected = new Message {Title = "遠征が終わりました", Body = "防空射撃演習", Name = "遠征終了"};\r
+            while (true)\r
+            {\r
+                switch (timer.Elapsed)\r
+                {\r
+                    case 0:\r
+                        manager.Enqueue("遠征終了", "防空射撃演習", 10);\r
+                        PAssert.That(() => expected.Equals(result));\r
+                        break;\r
+                    case 1000:\r
+                        manager.SuspendRepeat();\r
+                        break;\r
+                    case 11000:\r
+                        manager.ResumeRepeat();\r
+                        break;\r
+                    case 12000:\r
+                        PAssert.That(() => expected.Equals(result));\r
+                        return;\r
+                    default:\r
+                        PAssert.That(() => result == null, timer.Elapsed.ToString());\r
+                        break;\r
+                }\r
+                result = null;\r
+                timer.ElapseTime(1000);\r
+            }\r
+        }\r
     }\r
 }
\ No newline at end of file
index 56fc0cd..ee1431d 100644 (file)
@@ -59,6 +59,16 @@ namespace KancolleSniffer
             _notificationQueue.StopRepeat(key);\r
         }\r
 \r
+        public void SuspendRepeat()\r
+        {\r
+            _notificationQueue.SuspendRepeat();\r
+        }\r
+\r
+        public void ResumeRepeat()\r
+        {\r
+            _notificationQueue.ResumeRepeat();\r
+        }\r
+\r
         public string KeyToName(string key) => NotificationConfig.KeyToName(key);\r
 \r
         private class NotificationConfig\r
@@ -284,6 +294,7 @@ namespace KancolleSniffer
             private readonly ITimer _timer;\r
             private readonly NotificationConfig _notificationConfig = new NotificationConfig();\r
             private DateTime _lastRing;\r
+            private bool _suspend;\r
 \r
             public NotificationQueue(Action<string, string, string> ring, ITimer timer = null)\r
             {\r
@@ -316,12 +327,23 @@ namespace KancolleSniffer
                 _queue.RemoveAll(n => n.Key.Substring(0, 4) == key.Substring(0, 4) && n.Schedule != default);\r
             }\r
 \r
+            public void SuspendRepeat()\r
+            {\r
+                _suspend = true;\r
+            }\r
+\r
+            public void ResumeRepeat()\r
+            {\r
+                _suspend = false;\r
+            }\r
+\r
             private void Ring()\r
             {\r
                 var now = _timer.Now;\r
                 if (now - _lastRing < TimeSpan.FromSeconds(2))\r
                     return;\r
-                var notification = _queue.FirstOrDefault(n => n.Schedule.CompareTo(now) <= 0);\r
+                var notification = _queue.FirstOrDefault(n => n.Schedule.CompareTo(now) <= 0 &&\r
+                                                              !(_suspend && n.Schedule != default));\r
                 if (notification == null)\r
                     return;\r
                 if (notification.Repeat == 0)\r