committed by
Nelson Carrillo
2 changed files with 237 additions and 13 deletions
@ -0,0 +1,179 @@ |
|||
using System; |
|||
using System.Windows.Input; |
|||
using Avalonia.Controls.Primitives; |
|||
using Avalonia.Data; |
|||
using Avalonia.Input; |
|||
using Avalonia.Markup.Data; |
|||
using Avalonia.Platform; |
|||
using Avalonia.UnitTests; |
|||
using Moq; |
|||
using Xunit; |
|||
|
|||
namespace Avalonia.Controls.UnitTests |
|||
{ |
|||
public class ContextMenuTests |
|||
{ |
|||
private Mock<IPopupImpl> popupImpl; |
|||
|
|||
[Fact] |
|||
public void Clicking_On_Control_Toggles_ContextMenu() |
|||
{ |
|||
using (Application()) |
|||
{ |
|||
popupImpl.Setup(x => x.Show()).Verifiable(); |
|||
popupImpl.Setup(x => x.Hide()).Verifiable(); |
|||
|
|||
var sut = new ContextMenu(); |
|||
var target = new Panel |
|||
{ |
|||
ContextMenu = sut |
|||
}; |
|||
|
|||
new Window { Content = target }; |
|||
|
|||
target.RaiseEvent(new PointerReleasedEventArgs |
|||
{ |
|||
RoutedEvent = InputElement.PointerReleasedEvent, |
|||
MouseButton = MouseButton.Right |
|||
}); |
|||
|
|||
Assert.True(sut.IsOpen); |
|||
|
|||
target.RaiseEvent(new PointerReleasedEventArgs |
|||
{ |
|||
RoutedEvent = InputElement.PointerReleasedEvent, |
|||
MouseButton = MouseButton.None |
|||
}); |
|||
|
|||
Assert.False(sut.IsOpen); |
|||
popupImpl.Verify(x => x.Show(), Times.Once); |
|||
popupImpl.Verify(x => x.Hide(), Times.Once); |
|||
} |
|||
} |
|||
|
|||
[Fact] |
|||
public void Right_Clicking_On_Control_Twice_Re_Opens_ContextMenu() |
|||
{ |
|||
using (Application()) |
|||
{ |
|||
popupImpl.Setup(x => x.Show()).Verifiable(); |
|||
popupImpl.Setup(x => x.Hide()).Verifiable(); |
|||
|
|||
var sut = new ContextMenu(); |
|||
var target = new Panel |
|||
{ |
|||
ContextMenu = sut |
|||
}; |
|||
new Window { Content = target }; |
|||
|
|||
target.RaiseEvent(new PointerReleasedEventArgs |
|||
{ |
|||
RoutedEvent = InputElement.PointerReleasedEvent, |
|||
MouseButton = MouseButton.Right |
|||
}); |
|||
|
|||
Assert.True(sut.IsOpen); |
|||
|
|||
target.RaiseEvent(new PointerReleasedEventArgs |
|||
{ |
|||
RoutedEvent = InputElement.PointerReleasedEvent, |
|||
MouseButton = MouseButton.Right |
|||
}); |
|||
|
|||
Assert.True(sut.IsOpen); |
|||
popupImpl.Verify(x => x.Hide(), Times.Once); |
|||
popupImpl.Verify(x => x.Show(), Times.Exactly(2)); |
|||
} |
|||
} |
|||
|
|||
[Fact] |
|||
public void Cancelling_Opening_Does_Not_Show_ContextMenu() |
|||
{ |
|||
using (Application()) |
|||
{ |
|||
popupImpl.Setup(x => x.Show()).Verifiable(); |
|||
|
|||
bool eventCalled = false; |
|||
var sut = new ContextMenu(); |
|||
var target = new Panel |
|||
{ |
|||
ContextMenu = sut |
|||
}; |
|||
new Window { Content = target }; |
|||
|
|||
sut.ContextMenuOpening += (c, e) => { eventCalled = true; e.Cancel = true; }; |
|||
|
|||
target.RaiseEvent(new PointerReleasedEventArgs |
|||
{ |
|||
RoutedEvent = InputElement.PointerReleasedEvent, |
|||
MouseButton = MouseButton.Right |
|||
}); |
|||
|
|||
Assert.True(eventCalled); |
|||
Assert.False(sut.IsOpen); |
|||
popupImpl.Verify(x => x.Show(), Times.Never); |
|||
} |
|||
} |
|||
|
|||
[Fact] |
|||
public void Cancelling_Closing_Leaves_ContextMenuOpen() |
|||
{ |
|||
using (Application()) |
|||
{ |
|||
popupImpl.Setup(x => x.Show()).Verifiable(); |
|||
popupImpl.Setup(x => x.Hide()).Verifiable(); |
|||
|
|||
bool eventCalled = false; |
|||
var sut = new ContextMenu(); |
|||
var target = new Panel |
|||
{ |
|||
ContextMenu = sut |
|||
}; |
|||
new Window { Content = target }; |
|||
|
|||
sut.ContextMenuClosing += (c, e) => { eventCalled = true; e.Cancel = true; }; |
|||
|
|||
target.RaiseEvent(new PointerReleasedEventArgs |
|||
{ |
|||
RoutedEvent = InputElement.PointerReleasedEvent, |
|||
MouseButton = MouseButton.Right |
|||
}); |
|||
|
|||
Assert.True(sut.IsOpen); |
|||
|
|||
target.RaiseEvent(new PointerReleasedEventArgs |
|||
{ |
|||
RoutedEvent = InputElement.PointerReleasedEvent, |
|||
MouseButton = MouseButton.None |
|||
}); |
|||
|
|||
Assert.True(eventCalled); |
|||
Assert.True(sut.IsOpen); |
|||
|
|||
popupImpl.Verify(x => x.Show(), Times.Once()); |
|||
popupImpl.Verify(x => x.Hide(), Times.Never); |
|||
} |
|||
} |
|||
|
|||
private IDisposable Application() |
|||
{ |
|||
var screen = new Rect(new Point(), new Size(100, 100)); |
|||
var screenImpl = new Mock<IScreenImpl>(); |
|||
screenImpl.Setup(x => x.ScreenCount).Returns(1); |
|||
screenImpl.Setup(X => X.AllScreens).Returns( new[] { new Screen(screen, screen, true) }); |
|||
|
|||
var windowImpl = new Mock<IWindowImpl>(); |
|||
windowImpl.Setup(x => x.Screen).Returns(screenImpl.Object); |
|||
|
|||
popupImpl = new Mock<IPopupImpl>(); |
|||
popupImpl.SetupGet(x => x.Scaling).Returns(1); |
|||
|
|||
var services = TestServices.StyledWindow.With( |
|||
inputManager: new InputManager(), |
|||
windowImpl: windowImpl.Object, |
|||
windowingPlatform: new MockWindowingPlatform(() => windowImpl.Object, () => popupImpl.Object)); |
|||
|
|||
return UnitTestApplication.Start(services); |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue