Browse Source
Some failing: tests are chosen to match UWP behavior, not WPF (which hides key press events for access keys).pull/11794/head
1 changed files with 205 additions and 0 deletions
@ -0,0 +1,205 @@ |
|||||
|
using System.Collections.Generic; |
||||
|
using Avalonia.Controls; |
||||
|
using Avalonia.Input; |
||||
|
using Avalonia.UnitTests; |
||||
|
using Moq; |
||||
|
using Xunit; |
||||
|
|
||||
|
namespace Avalonia.Base.UnitTests.Input |
||||
|
{ |
||||
|
public class AccessKeyHandlerTests |
||||
|
{ |
||||
|
[Fact] |
||||
|
public void Should_Raise_Key_Events_For_Unregistered_Access_Key() |
||||
|
{ |
||||
|
var root = new TestRoot(); |
||||
|
var target = new AccessKeyHandler(); |
||||
|
var events = new List<string>(); |
||||
|
|
||||
|
target.SetOwner(root); |
||||
|
root.KeyDown += (s, e) => events.Add($"KeyDown {e.Key}"); |
||||
|
root.KeyUp += (s, e) => events.Add($"KeyUp {e.Key}"); |
||||
|
|
||||
|
KeyDown(root, Key.LeftAlt); |
||||
|
KeyDown(root, Key.A, KeyModifiers.Alt); |
||||
|
KeyUp(root, Key.A, KeyModifiers.Alt); |
||||
|
KeyUp(root, Key.LeftAlt); |
||||
|
|
||||
|
Assert.Equal(new[] |
||||
|
{ |
||||
|
"KeyDown LeftAlt", |
||||
|
"KeyDown A", |
||||
|
"KeyUp A", |
||||
|
"KeyUp LeftAlt", |
||||
|
}, events); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Should_Raise_Key_Events_For_Unregistered_Access_Key_With_MainMenu() |
||||
|
{ |
||||
|
var root = new TestRoot(); |
||||
|
var target = new AccessKeyHandler(); |
||||
|
var menu = Mock.Of<IMainMenu>(); |
||||
|
var events = new List<string>(); |
||||
|
|
||||
|
target.SetOwner(root); |
||||
|
target.MainMenu = menu; |
||||
|
root.KeyDown += (s, e) => events.Add($"KeyDown {e.Key}"); |
||||
|
root.KeyUp += (s, e) => events.Add($"KeyUp {e.Key}"); |
||||
|
|
||||
|
KeyDown(root, Key.LeftAlt); |
||||
|
KeyDown(root, Key.A, KeyModifiers.Alt); |
||||
|
KeyUp(root, Key.A, KeyModifiers.Alt); |
||||
|
KeyUp(root, Key.LeftAlt); |
||||
|
|
||||
|
Assert.Equal(new[] |
||||
|
{ |
||||
|
"KeyDown LeftAlt", |
||||
|
"KeyDown A", |
||||
|
"KeyUp A", |
||||
|
"KeyUp LeftAlt", |
||||
|
}, events); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Should_Raise_Key_Events_For_Alt_Key() |
||||
|
{ |
||||
|
var root = new TestRoot(); |
||||
|
var target = new AccessKeyHandler(); |
||||
|
var events = new List<string>(); |
||||
|
|
||||
|
target.SetOwner(root); |
||||
|
root.KeyDown += (s, e) => events.Add($"KeyDown {e.Key}"); |
||||
|
root.KeyUp += (s, e) => events.Add($"KeyUp {e.Key}"); |
||||
|
|
||||
|
KeyDown(root, Key.LeftAlt); |
||||
|
KeyUp(root, Key.LeftAlt); |
||||
|
|
||||
|
Assert.Equal(new[] |
||||
|
{ |
||||
|
"KeyDown LeftAlt", |
||||
|
"KeyUp LeftAlt", |
||||
|
}, events); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Should_Raise_Key_Events_For_Alt_Key_With_MainMenu() |
||||
|
{ |
||||
|
var root = new TestRoot(); |
||||
|
var target = new AccessKeyHandler(); |
||||
|
var menu = new Mock<IMainMenu>(); |
||||
|
var events = new List<string>(); |
||||
|
|
||||
|
menu.SetupAllProperties(); |
||||
|
menu.Setup(x => x.Open()).Callback(() => menu.Setup(x => x.IsOpen).Returns(true)); |
||||
|
|
||||
|
target.SetOwner(root); |
||||
|
target.MainMenu = menu.Object; |
||||
|
|
||||
|
root.KeyDown += (s, e) => events.Add($"KeyDown {e.Key}"); |
||||
|
root.KeyUp += (s, e) => events.Add($"KeyUp {e.Key}"); |
||||
|
|
||||
|
KeyDown(root, Key.LeftAlt); |
||||
|
KeyUp(root, Key.LeftAlt); |
||||
|
KeyDown(root, Key.LeftAlt); |
||||
|
KeyUp(root, Key.LeftAlt); |
||||
|
|
||||
|
Assert.Equal(new[] |
||||
|
{ |
||||
|
"KeyDown LeftAlt", |
||||
|
"KeyUp LeftAlt", |
||||
|
"KeyDown LeftAlt", |
||||
|
"KeyUp LeftAlt", |
||||
|
}, events); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Should_Raise_Key_Events_For_Registered_Access_Key() |
||||
|
{ |
||||
|
var button = new Button(); |
||||
|
var root = new TestRoot(button); |
||||
|
var target = new AccessKeyHandler(); |
||||
|
var events = new List<string>(); |
||||
|
|
||||
|
target.SetOwner(root); |
||||
|
target.Register('A', button); |
||||
|
root.KeyDown += (s, e) => events.Add($"KeyDown {e.Key}"); |
||||
|
root.KeyUp += (s, e) => events.Add($"KeyUp {e.Key}"); |
||||
|
|
||||
|
KeyDown(root, Key.LeftAlt); |
||||
|
KeyDown(root, Key.A, KeyModifiers.Alt); |
||||
|
KeyUp(root, Key.A, KeyModifiers.Alt); |
||||
|
KeyUp(root, Key.LeftAlt); |
||||
|
|
||||
|
// This differs from WPF which doesn't raise the `A` key event, but matches UWP.
|
||||
|
Assert.Equal(new[] |
||||
|
{ |
||||
|
"KeyDown LeftAlt", |
||||
|
"KeyDown A", |
||||
|
"KeyUp A", |
||||
|
"KeyUp LeftAlt", |
||||
|
}, events); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Should_Raise_AccessKeyPressed_For_Registered_Access_Key() |
||||
|
{ |
||||
|
var button = new Button(); |
||||
|
var root = new TestRoot(button); |
||||
|
var target = new AccessKeyHandler(); |
||||
|
var raised = 0; |
||||
|
|
||||
|
target.SetOwner(root); |
||||
|
target.Register('A', button); |
||||
|
button.AddHandler(AccessKeyHandler.AccessKeyPressedEvent, (s, e) => ++raised); |
||||
|
|
||||
|
KeyDown(root, Key.LeftAlt); |
||||
|
Assert.Equal(0, raised); |
||||
|
|
||||
|
KeyDown(root, Key.A, KeyModifiers.Alt); |
||||
|
Assert.Equal(1, raised); |
||||
|
|
||||
|
KeyUp(root, Key.A, KeyModifiers.Alt); |
||||
|
KeyUp(root, Key.LeftAlt); |
||||
|
|
||||
|
Assert.Equal(1, raised); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Should_Open_MainMenu_On_Alt_KeyUp() |
||||
|
{ |
||||
|
var root = new TestRoot(); |
||||
|
var target = new AccessKeyHandler(); |
||||
|
var menu = new Mock<IMainMenu>(); |
||||
|
|
||||
|
target.SetOwner(root); |
||||
|
target.MainMenu = menu.Object; |
||||
|
|
||||
|
KeyDown(root, Key.LeftAlt); |
||||
|
menu.Verify(x => x.Open(), Times.Never); |
||||
|
|
||||
|
KeyUp(root, Key.LeftAlt); |
||||
|
menu.Verify(x => x.Open(), Times.Once); |
||||
|
} |
||||
|
|
||||
|
private static void KeyDown(IInputElement target, Key key, KeyModifiers modifiers = KeyModifiers.None) |
||||
|
{ |
||||
|
target.RaiseEvent(new KeyEventArgs |
||||
|
{ |
||||
|
RoutedEvent = InputElement.KeyDownEvent, |
||||
|
Key = key, |
||||
|
KeyModifiers = modifiers, |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
private static void KeyUp(IInputElement target, Key key, KeyModifiers modifiers = KeyModifiers.None) |
||||
|
{ |
||||
|
target.RaiseEvent(new KeyEventArgs |
||||
|
{ |
||||
|
RoutedEvent = InputElement.KeyUpEvent, |
||||
|
Key = key, |
||||
|
KeyModifiers = modifiers, |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue