OSDN Git Service

イベントのテストにAssert.Raisesを使用する
authorKimura Youichi <kim.upsilon@bucyou.net>
Fri, 24 Feb 2017 17:01:04 +0000 (02:01 +0900)
committerKimura Youichi <kim.upsilon@bucyou.net>
Fri, 24 Feb 2017 17:53:06 +0000 (02:53 +0900)
Assert.Raises は xUnit.net 2.2 から追加されたメソッド

OpenTween.Tests/Api/TwitterApiStatusTest.cs
OpenTween.Tests/MediaSelectorTest.cs
OpenTween.Tests/TestUtils.cs
OpenTween.Tests/TweetThumbnailTest.cs
OpenTween/MediaSelector.cs
OpenTween/Tween.Designer.cs
OpenTween/TweetThumbnail.cs

index c5ba36c..9121133 100644 (file)
@@ -173,9 +173,6 @@ namespace OpenTween.Api
         {
             var status = new TwitterApiStatus();
 
-            var eventCalled = false;
-            status.AccessLimitUpdated += (s, e) => eventCalled = true;
-
             var header = new Dictionary<string, string>
             {
                 ["X-Rate-Limit-Limit"] = "150",
@@ -187,7 +184,11 @@ namespace OpenTween.Api
                 ["X-Access-Level"] = "read-write-directmessages",
             };
 
-            status.UpdateFromHeader(header, "/statuses/home_timeline");
+            Assert.Raises<TwitterApiStatus.AccessLimitUpdatedEventArgs>(
+                x => status.AccessLimitUpdated += x,
+                x => status.AccessLimitUpdated -= x,
+                () => status.UpdateFromHeader(header, "/statuses/home_timeline")
+            );
 
             var rateLimit = status.AccessLimit["/statuses/home_timeline"];
             Assert.Equal(150, rateLimit.AccessLimitCount);
@@ -200,8 +201,6 @@ namespace OpenTween.Api
             Assert.Equal(new DateTime(2013, 1, 2, 0, 0, 0, DateTimeKind.Utc).ToLocalTime(), mediaLimit.AccessLimitResetDate);
 
             Assert.Equal(TwitterApiAccessLevel.ReadWriteAndDirectMessage, status.AccessLevel);
-
-            Assert.True(eventCalled);
         }
 
         [Fact]
@@ -209,9 +208,6 @@ namespace OpenTween.Api
         {
             var status = new TwitterApiStatus();
 
-            var eventCalled = false;
-            status.AccessLimitUpdated += (s, e) => eventCalled = true;
-
             var response = new HttpResponseMessage
             {
                 Headers =
@@ -226,7 +222,11 @@ namespace OpenTween.Api
                 },
             };
 
-            status.UpdateFromHeader(response.Headers, "/statuses/home_timeline");
+            Assert.Raises<TwitterApiStatus.AccessLimitUpdatedEventArgs>(
+                x => status.AccessLimitUpdated += x,
+                x => status.AccessLimitUpdated -= x,
+                () => status.UpdateFromHeader(response.Headers, "/statuses/home_timeline")
+            );
 
             var rateLimit = status.AccessLimit["/statuses/home_timeline"];
             Assert.Equal(150, rateLimit.AccessLimitCount);
@@ -239,26 +239,24 @@ namespace OpenTween.Api
             Assert.Equal(new DateTime(2013, 1, 2, 0, 0, 0, DateTimeKind.Utc).ToLocalTime(), mediaLimit.AccessLimitResetDate);
 
             Assert.Equal(TwitterApiAccessLevel.ReadWriteAndDirectMessage, status.AccessLevel);
-
-            Assert.True(eventCalled);
         }
 
         public void UpdateFromJsonTest()
         {
             var status = new TwitterApiStatus();
 
-            var eventCalled = false;
-            status.AccessLimitUpdated += (s, e) => eventCalled = true;
-
             var json = "{\"resources\":{\"statuses\":{\"/statuses/home_timeline\":{\"limit\":150,\"remaining\":100,\"reset\":1356998400}}}}";
-            status.UpdateFromJson(TwitterRateLimits.ParseJson(json));
+
+            Assert.Raises<TwitterApiStatus.AccessLimitUpdatedEventArgs>(
+                x => status.AccessLimitUpdated += x,
+                x => status.AccessLimitUpdated -= x,
+                () => status.UpdateFromJson(TwitterRateLimits.ParseJson(json))
+            );
 
             var rateLimit = status.AccessLimit["/statuses/home_timeline"];
             Assert.Equal(150, rateLimit.AccessLimitCount);
             Assert.Equal(100, rateLimit.AccessLimitRemain);
             Assert.Equal(new DateTime(2013, 1, 1, 0, 0, 0, DateTimeKind.Utc).ToLocalTime(), rateLimit.AccessLimitResetDate);
-
-            Assert.True(eventCalled);
         }
 
         [Fact]
@@ -266,16 +264,17 @@ namespace OpenTween.Api
         {
             var apiStatus = new TwitterApiStatus();
 
-            var eventCount = 0;
-            apiStatus.AccessLimitUpdated += (s, e) => eventCount++;
-
-            Assert.Equal(0, eventCount);
-
-            apiStatus.AccessLimit["/statuses/home_timeline"] = new ApiLimit(150, 100, new DateTime(2013, 1, 1, 0, 0, 0));
-            Assert.Equal(1, eventCount);
-
-            apiStatus.Reset();
-            Assert.Equal(2, eventCount);
+            Assert.Raises<TwitterApiStatus.AccessLimitUpdatedEventArgs>(
+                x => apiStatus.AccessLimitUpdated += x,
+                x => apiStatus.AccessLimitUpdated -= x,
+                () => apiStatus.AccessLimit["/statuses/home_timeline"] = new ApiLimit(150, 100, new DateTime(2013, 1, 1, 0, 0, 0))
+            );
+
+            Assert.Raises<TwitterApiStatus.AccessLimitUpdatedEventArgs>(
+                x => apiStatus.AccessLimitUpdated += x,
+                x => apiStatus.AccessLimitUpdated -= x,
+                () => apiStatus.Reset()
+            );
         }
     }
 }
index 46c5c60..a2edced 100644 (file)
@@ -82,12 +82,11 @@ namespace OpenTween
                 twitter.Initialize("", "", "", 0L);
                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
 
-                var eventCalled = false;
-                mediaSelector.BeginSelecting += (o, e) => eventCalled = true;
-
-                mediaSelector.BeginSelection();
-
-                Assert.True(eventCalled);
+                Assert.Raises<EventArgs>(
+                    x => mediaSelector.BeginSelecting += x,
+                    x => mediaSelector.BeginSelecting -= x,
+                    () => mediaSelector.BeginSelection()
+                );
 
                 Assert.True(mediaSelector.Visible);
                 Assert.True(mediaSelector.Enabled);
@@ -112,13 +111,13 @@ namespace OpenTween
                 twitter.Initialize("", "", "", 0L);
                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
 
-                var eventCalled = false;
-                mediaSelector.BeginSelecting += (o, e) => eventCalled = true;
-
                 var images = new[] { "Resources/re.gif" };
-                mediaSelector.BeginSelection(images);
 
-                Assert.True(eventCalled);
+                Assert.Raises<EventArgs>(
+                    x => mediaSelector.BeginSelecting += x,
+                    x => mediaSelector.BeginSelecting -= x,
+                    () => mediaSelector.BeginSelection(images)
+                );
 
                 Assert.True(mediaSelector.Visible);
                 Assert.True(mediaSelector.Enabled);
@@ -148,16 +147,15 @@ namespace OpenTween
                 twitter.Initialize("", "", "", 0L);
                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
 
-                var eventCalled = false;
-                mediaSelector.BeginSelecting += (o, e) => eventCalled = true;
-
                 using (var bitmap = new Bitmap(width: 200, height: 200))
                 {
-                    mediaSelector.BeginSelection(bitmap);
+                    Assert.Raises<EventArgs>(
+                        x => mediaSelector.BeginSelecting += x,
+                        x => mediaSelector.BeginSelecting -= x,
+                        () => mediaSelector.BeginSelection(bitmap)
+                    );
                 }
 
-                Assert.True(eventCalled);
-
                 Assert.True(mediaSelector.Visible);
                 Assert.True(mediaSelector.Enabled);
 
@@ -217,12 +215,11 @@ namespace OpenTween
 
                 var displayImage = mediaSelector.ImageSelectedPicture.Image; // 表示中の画像
 
-                var eventCalled = false;
-                mediaSelector.EndSelecting += (o, e) => eventCalled = true;
-
-                mediaSelector.EndSelection();
-
-                Assert.True(eventCalled);
+                Assert.Raises<EventArgs>(
+                    x => mediaSelector.EndSelecting += x,
+                    x => mediaSelector.EndSelecting -= x,
+                    () => mediaSelector.EndSelection()
+                );
 
                 Assert.False(mediaSelector.Visible);
                 Assert.False(mediaSelector.Enabled);
@@ -461,14 +458,13 @@ namespace OpenTween
                 Assert.Equal(new[] { "1", "2", "3" }, pages.Cast<object>().Select(x => x.ToString()));
                 Assert.True(mediaSelector.ImagePageCombo.Enabled);
 
-                var eventCalled = false;
-                mediaSelector.SelectedServiceChanged += (o, e) => eventCalled = true;
-
                 // 投稿先を yfrog に変更
-                mediaSelector.ImageServiceCombo.SelectedIndex =
-                    mediaSelector.ImageServiceCombo.Items.IndexOf("yfrog");
-
-                Assert.True(eventCalled); // SelectedServiceChanged イベントが呼ばれる
+                var yfrogIndex = mediaSelector.ImageServiceCombo.Items.IndexOf("yfrog");
+                Assert.Raises<EventArgs>(
+                    x => mediaSelector.SelectedServiceChanged += x,
+                    x => mediaSelector.SelectedServiceChanged -= x,
+                    () => mediaSelector.ImageServiceCombo.SelectedIndex = yfrogIndex
+                );
 
                 // 1 ページ目のみ選択可能な状態 (Disabled)
                 pages = mediaSelector.ImagePageCombo.Items;
index d776369..7ec9fef 100644 (file)
@@ -54,6 +54,26 @@ namespace OpenTween
             }
         }
 
+        public static async Task NotRaisesAsync<T>(Action<EventHandler<T>> attach, Action<EventHandler<T>> detach, Func<Task> testCode)
+            where T : EventArgs
+        {
+            T raisedEvent = null;
+            EventHandler<T> handler = (s, e) => raisedEvent = e;
+
+            try
+            {
+                attach(handler);
+                await testCode().ConfigureAwait(false);
+
+                if (raisedEvent != null)
+                    throw new Xunit.Sdk.RaisesException(typeof(void), raisedEvent.GetType());
+            }
+            finally
+            {
+                detach(handler);
+            }
+        }
+
         public static MemoryImage CreateDummyImage()
         {
             using (var bitmap = new Bitmap(100, 100))
index 15f564c..3fd0dcc 100644 (file)
@@ -261,10 +261,6 @@ namespace OpenTween
             {
                 SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
 
-                bool eventCalled;
-                thumbbox.ThumbnailLoading +=
-                    (s, e) => { eventCalled = true; };
-
                 var post = new PostClass
                 {
                     TextFromApi = "てすと",
@@ -272,10 +268,11 @@ namespace OpenTween
                     {
                     },
                 };
-                eventCalled = false;
-                await thumbbox.ShowThumbnailAsync(post);
-
-                Assert.False(eventCalled);
+                await TestUtils.NotRaisesAsync<EventArgs>(
+                    x => thumbbox.ThumbnailLoading += x,
+                    x => thumbbox.ThumbnailLoading -= x,
+                    () => thumbbox.ShowThumbnailAsync(post)
+                );
 
                 SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
 
@@ -287,10 +284,12 @@ namespace OpenTween
                         new MediaInfo("http://foo.example.com/abcd"),
                     },
                 };
-                eventCalled = false;
-                await thumbbox.ShowThumbnailAsync(post2);
 
-                Assert.True(eventCalled);
+                await Assert.RaisesAsync<EventArgs>(
+                    x => thumbbox.ThumbnailLoading += x,
+                    x => thumbbox.ThumbnailLoading -= x,
+                    () => thumbbox.ShowThumbnailAsync(post2)
+                );
             }
         }
 
index 623791f..240dce2 100644 (file)
@@ -36,13 +36,13 @@ namespace OpenTween
 {
     public partial class MediaSelector : UserControl
     {
-        public event EventHandler BeginSelecting;
-        public event EventHandler EndSelecting;
+        public event EventHandler<EventArgs> BeginSelecting;
+        public event EventHandler<EventArgs> EndSelecting;
 
-        public event EventHandler FilePickDialogOpening;
-        public event EventHandler FilePickDialogClosed;
+        public event EventHandler<EventArgs> FilePickDialogOpening;
+        public event EventHandler<EventArgs> FilePickDialogClosed;
 
-        public event EventHandler SelectedServiceChanged;
+        public event EventHandler<EventArgs> SelectedServiceChanged;
 
         [Browsable(false)]
         [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
index 597d9cc..8307d3e 100644 (file)
             // 
             resources.ApplyResources(this.ImageSelector, "ImageSelector");
             this.ImageSelector.Name = "ImageSelector";
-            this.ImageSelector.BeginSelecting += new System.EventHandler(this.ImageSelector_BeginSelecting);
-            this.ImageSelector.EndSelecting += new System.EventHandler(this.ImageSelector_EndSelecting);
-            this.ImageSelector.FilePickDialogOpening += new System.EventHandler(this.ImageSelector_FilePickDialogOpening);
-            this.ImageSelector.FilePickDialogClosed += new System.EventHandler(this.ImageSelector_FilePickDialogClosed);
-            this.ImageSelector.SelectedServiceChanged += new System.EventHandler(this.ImageSelector_SelectedServiceChanged);
+            this.ImageSelector.BeginSelecting += new System.EventHandler<System.EventArgs>(this.ImageSelector_BeginSelecting);
+            this.ImageSelector.EndSelecting += new System.EventHandler<System.EventArgs>(this.ImageSelector_EndSelecting);
+            this.ImageSelector.FilePickDialogOpening += new System.EventHandler<System.EventArgs>(this.ImageSelector_FilePickDialogOpening);
+            this.ImageSelector.FilePickDialogClosed += new System.EventHandler<System.EventArgs>(this.ImageSelector_FilePickDialogClosed);
+            this.ImageSelector.SelectedServiceChanged += new System.EventHandler<System.EventArgs>(this.ImageSelector_SelectedServiceChanged);
             this.ImageSelector.VisibleChanged += new System.EventHandler(this.ImageSelector_VisibleChanged);
             // 
             // ProfilePanel
             resources.ApplyResources(this.tweetThumbnail1, "tweetThumbnail1");
             this.tweetThumbnail1.Name = "tweetThumbnail1";
             this.tweetThumbnail1.TabStop = false;
-            this.tweetThumbnail1.ThumbnailLoading += new System.EventHandler(this.tweetThumbnail1_ThumbnailLoading);
+            this.tweetThumbnail1.ThumbnailLoading += new System.EventHandler<System.EventArgs>(this.tweetThumbnail1_ThumbnailLoading);
             this.tweetThumbnail1.ThumbnailDoubleClick += new System.EventHandler<OpenTween.ThumbnailDoubleClickEventArgs>(this.tweetThumbnail1_ThumbnailDoubleClick);
             this.tweetThumbnail1.ThumbnailImageSearchClick += new System.EventHandler<OpenTween.ThumbnailImageSearchEventArgs>(this.tweetThumbnail1_ThumbnailImageSearchClick);
             // 
index c4d5077..3c62a8e 100644 (file)
@@ -43,7 +43,7 @@ namespace OpenTween
         protected internal List<OTPictureBox> pictureBox = new List<OTPictureBox>();
         protected MouseWheelMessageFilter filter = new MouseWheelMessageFilter();
 
-        public event EventHandler ThumbnailLoading;
+        public event EventHandler<EventArgs> ThumbnailLoading;
         public event EventHandler<ThumbnailDoubleClickEventArgs> ThumbnailDoubleClick;
         public event EventHandler<ThumbnailImageSearchEventArgs> ThumbnailImageSearchClick;