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

This commit is contained in:
Tig
2024-11-16 11:25:53 -07:00
parent ddce5a4f78
commit 49e0cd8ccd
4 changed files with 153 additions and 3 deletions

View File

@@ -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.

View File

@@ -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;
}

View File

@@ -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);
}
}

View File

@@ -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)]