Răsfoiți Sursa

Added unit tests for Viewport/FrameChanged events. Fixed bugs.

Tig 8 luni în urmă
părinte
comite
49e0cd8ccd

+ 10 - 3
Terminal.Gui/View/View.Content.cs

@@ -313,7 +313,7 @@ public partial class View
                 //SetSubViewNeedsDraw();
             }
 
-            OnViewportChanged (new (IsInitialized ? Viewport : Rectangle.Empty, oldViewport));
+            RaiseViewportChangedEvent (oldViewport);
 
             return;
         }
@@ -326,7 +326,7 @@ public partial class View
             Size = newSize
         };
 
-        OnViewportChanged (new (IsInitialized ? Viewport : Rectangle.Empty, oldViewport));
+        // Note, setting the Frame will cause ViewportChanged to be raised.
 
         return;
 
@@ -368,6 +368,13 @@ public partial class View
         }
     }
 
+    private void RaiseViewportChangedEvent (Rectangle oldViewport)
+    {
+        var args = new DrawEventArgs (IsInitialized ? Viewport : Rectangle.Empty, oldViewport);
+        OnViewportChanged (args);
+        ViewportChanged?.Invoke (this, args);
+    }
+
     /// <summary>
     ///     Fired when the <see cref="Viewport"/> changes. This event is fired after the <see cref="Viewport"/> has been
     ///     updated.
@@ -378,7 +385,7 @@ public partial class View
     ///     Called when the <see cref="Viewport"/> changes. Invokes the <see cref="ViewportChanged"/> event.
     /// </summary>
     /// <param name="e"></param>
-    protected virtual void OnViewportChanged (DrawEventArgs e) { ViewportChanged?.Invoke (this, e); }
+    protected virtual void OnViewportChanged (DrawEventArgs e) { }
 
     /// <summary>
     ///     Converts a <see cref="Viewport"/>-relative location and size to a screen-relative location and size.

+ 5 - 0
Terminal.Gui/View/View.Layout.cs

@@ -98,6 +98,11 @@ public partial class View // Layout APIs
         // BUGBUG: When SetFrame is called from Frame_set, this event gets raised BEFORE OnResizeNeeded. Is that OK?
         OnFrameChanged (in frame);
         FrameChanged?.Invoke (this, new (in frame));
+
+        if (oldViewport != Viewport)
+        {
+            RaiseViewportChangedEvent (oldViewport);
+        }
         return true;
     }
 

+ 51 - 0
UnitTests/View/Layout/FrameTests.cs

@@ -259,4 +259,55 @@ public class FrameTests (ITestOutputHelper output)
         Assert.Equal (Dim.Absolute (40), v.Height);
         v.Dispose ();
     }
+
+    private class TestFrameEventsView : View
+    {
+        public int OnFrameChangedCallCount { get; private set; }
+        public int FrameChangedEventCallCount { get; private set; }
+
+        public TestFrameEventsView ()
+        {
+            FrameChanged += (sender, args) => FrameChangedEventCallCount++;
+        }
+
+        protected override void OnFrameChanged (in Rectangle frame)
+        {
+            OnFrameChangedCallCount++;
+            base.OnFrameChanged (frame);
+        }
+    }
+
+    [Fact]
+    public void OnFrameChanged_Called_When_Frame_Changes ()
+    {
+        // Arrange
+        var view = new TestFrameEventsView ();
+        var initialFrame = new Rectangle (0, 0, 10, 10);
+        var newFrame = new Rectangle (0, 0, 20, 20);
+        view.Frame = initialFrame;
+        Assert.Equal (1, view.OnFrameChangedCallCount);
+
+        // Act
+        view.Frame = newFrame;
+
+        // Assert
+        Assert.Equal (2, view.OnFrameChangedCallCount);
+    }
+
+    [Fact]
+    public void FrameChanged_Event_Raised_When_Frame_Changes ()
+    {
+        // Arrange
+        var view = new TestFrameEventsView ();
+        var initialFrame = new Rectangle (0, 0, 10, 10);
+        var newFrame = new Rectangle (0, 0, 20, 20);
+        view.Frame = initialFrame;
+        Assert.Equal (1, view.FrameChangedEventCallCount);
+
+        // Act
+        view.Frame = newFrame;
+
+        // Assert
+        Assert.Equal (2, view.FrameChangedEventCallCount);
+    }
 }

+ 87 - 0
UnitTests/View/Layout/ViewportTests.cs

@@ -387,6 +387,93 @@ public class ViewportTests (ITestOutputHelper output)
         Assert.NotEqual (view.Viewport.Size, view.GetContentSize ());
     }
 
+    private class TestViewportEventsView : View
+    {
+        public int OnViewportChangedCallCount { get; private set; }
+        public int ViewportChangedEventCallCount { get; private set; }
+
+        public TestViewportEventsView ()
+        {
+            ViewportChanged += (sender, args) => ViewportChangedEventCallCount++;
+        }
+
+        protected override void OnViewportChanged (DrawEventArgs e)
+        {
+            OnViewportChangedCallCount++;
+            base.OnViewportChanged (e);
+        }
+    }
+
+    [Fact]
+    public void OnViewportChanged_Called_When_Viewport_Changes ()
+    {
+        // Arrange
+        var view = new TestViewportEventsView ();
+        var initialViewport = new Rectangle (0, 0, 10, 10);
+        var newViewport = new Rectangle (0, 0, 20, 20);
+        Assert.Equal (0, view.OnViewportChangedCallCount);
+        view.Viewport = initialViewport;
+        Assert.Equal (1, view.OnViewportChangedCallCount);
+
+        // Act
+        view.Viewport = newViewport;
+
+        // Assert
+        Assert.Equal (2, view.OnViewportChangedCallCount);
+    }
+
+    [Fact]
+    public void ViewportChanged_Event_Raised_When_Viewport_Changes ()
+    {
+        // Arrange
+        var view = new TestViewportEventsView ();
+        var initialViewport = new Rectangle (0, 0, 10, 10);
+        var newViewport = new Rectangle (0, 0, 20, 20);
+        view.Viewport = initialViewport;
+        Assert.Equal (1, view.ViewportChangedEventCallCount);
+
+        // Act
+        view.Viewport = newViewport;
+
+        // Assert
+        Assert.Equal (2, view.ViewportChangedEventCallCount);
+    }
+
+    [Fact]
+    public void OnViewportChanged_Called_When_Frame_Changes ()
+    {
+        // Arrange
+        var view = new TestViewportEventsView ();
+        var initialFrame = new Rectangle (0, 0, 10, 10);
+        var newFrame = new Rectangle (0, 0, 20, 20);
+        Assert.Equal (0, view.OnViewportChangedCallCount);
+        view.Frame = initialFrame;
+        Assert.Equal (1, view.OnViewportChangedCallCount);
+
+        // Act
+        view.Frame = newFrame;
+
+        // Assert
+        Assert.Equal (2, view.OnViewportChangedCallCount);
+    }
+
+    [Fact]
+    public void ViewportChanged_Event_Raised_When_Frame_Changes ()
+    {
+        // Arrange
+        var view = new TestViewportEventsView ();
+        var initialFrame = new Rectangle (0, 0, 10, 10);
+        var newFrame = new Rectangle (0, 0, 20, 20);
+        view.Frame = initialFrame;
+        Assert.Equal (1, view.ViewportChangedEventCallCount);
+
+        // Act
+        view.Frame = newFrame;
+
+        // Assert
+        Assert.Equal (2, view.ViewportChangedEventCallCount);
+    }
+
     //[Theory]
     //[InlineData (0, 0, true)]
     //[InlineData (-1, 0, true)]