// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using System.Linq; using NUnit.Framework; using osu.Framework.Graphics; using osu.Framework.Input; using osu.Framework.Input.States; using osu.Framework.Testing; using osu.Framework.Testing.Input; using osuTK; using osuTK.Input; namespace osu.Framework.Tests.Visual { public class TestCasePassThroughInputManager : ManualInputManagerTestCase { public TestCasePassThroughInputManager() { RelativeSizeAxes = Axes.Both; } private TestInputManager testInputManager; private InputState state; private ButtonStates mouse; private ButtonStates keyboard; private ButtonStates joystick; private void addTestInputManagerStep() { AddStep("Add InputManager", () => { testInputManager = new TestInputManager(); Add(testInputManager); state = testInputManager.CurrentState; mouse = state.Mouse.Buttons; keyboard = state.Keyboard.Keys; joystick = state.Joystick.Buttons; }); } [SetUp] public override void SetUp() => Schedule(() => { base.SetUp(); ChildrenEnumerable = Enumerable.Empty(); }); [Test] public void ReceiveInitialState() { AddStep("Press mouse left", () => InputManager.PressButton(MouseButton.Left)); AddStep("Press A", () => InputManager.PressKey(Key.A)); AddStep("Press Joystick", () => InputManager.PressJoystickButton(JoystickButton.Button1)); addTestInputManagerStep(); AddAssert("mouse left not pressed", () => !mouse.IsPressed(MouseButton.Left)); AddAssert("A pressed", () => keyboard.IsPressed(Key.A)); AddAssert("Joystick pressed", () => joystick.IsPressed(JoystickButton.Button1)); AddStep("Release", () => { InputManager.ReleaseButton(MouseButton.Left); InputManager.ReleaseKey(Key.A); InputManager.ReleaseJoystickButton(JoystickButton.Button1); }); AddAssert("All released", () => !mouse.HasAnyButtonPressed && !keyboard.HasAnyButtonPressed && !joystick.HasAnyButtonPressed); } [Test] public void UseParentInputChange() { addTestInputManagerStep(); AddStep("Press buttons", () => { InputManager.PressButton(MouseButton.Left); InputManager.PressKey(Key.A); InputManager.PressJoystickButton(JoystickButton.Button1); }); AddAssert("pressed", () => mouse.IsPressed(MouseButton.Left) && keyboard.IsPressed(Key.A) && joystick.IsPressed(JoystickButton.Button1)); AddStep("UseParentInput = false", () => testInputManager.UseParentInput = false); AddAssert("still pressed", () => mouse.IsPressed(MouseButton.Left) && keyboard.IsPressed(Key.A) && joystick.IsPressed(JoystickButton.Button1)); AddStep("Release on parent", () => { InputManager.ReleaseButton(MouseButton.Left); InputManager.ReleaseKey(Key.A); InputManager.ReleaseJoystickButton(JoystickButton.Button1); }); AddAssert("doen't affect child", () => mouse.IsPressed(MouseButton.Left) && keyboard.IsPressed(Key.A) && joystick.IsPressed(JoystickButton.Button1)); AddStep("UseParentInput = true", () => testInputManager.UseParentInput = true); AddAssert("all synced", () => !mouse.IsPressed(MouseButton.Left) && !keyboard.IsPressed(Key.A) && !joystick.IsPressed(JoystickButton.Button1)); } [Test] public void MouseDownNoSync() { addTestInputManagerStep(); AddStep("UseParentInput = false", () => testInputManager.UseParentInput = false); AddStep("Press left", () => InputManager.PressButton(MouseButton.Left)); AddStep("UseParentInput = true", () => testInputManager.UseParentInput = true); AddAssert("not pressed", () => !mouse.IsPressed(MouseButton.Left)); } [Test] public void NoMouseUp() { addTestInputManagerStep(); AddStep("Press left", () => InputManager.PressButton(MouseButton.Left)); AddStep("UseParentInput = false", () => testInputManager.UseParentInput = false); AddStep("Release and press", () => { InputManager.ReleaseButton(MouseButton.Left); InputManager.PressButton(MouseButton.Left); }); AddStep("UseParentInput = true", () => testInputManager.UseParentInput = true); AddAssert("pressed", () => mouse.IsPressed(MouseButton.Left)); AddAssert("mouse up count == 0", () => testInputManager.Status.MouseUpCount == 0); } public class TestInputManager : ManualInputManager { public readonly TestCaseInputManager.ContainingInputManagerStatusText Status; public TestInputManager() { Size = new Vector2(0.8f); Origin = Anchor.Centre; Anchor = Anchor.Centre; Child = Status = new TestCaseInputManager.ContainingInputManagerStatusText(); } } } }