2019-01-24 16:43:03 +08:00
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
2018-04-13 17:19:50 +08:00
2018-03-20 19:09:55 +08:00
using System ;
2022-02-28 02:23:02 +08:00
using System.Diagnostics ;
2020-03-19 05:23:06 +08:00
using System.Linq ;
2020-03-19 03:04:38 +08:00
using NUnit.Framework ;
2022-05-24 15:50:16 +08:00
using osu.Framework.Allocation ;
2018-03-19 18:46:26 +08:00
using osu.Framework.Graphics ;
2022-02-13 23:27:12 +08:00
using osu.Framework.Graphics.Cursor ;
2020-03-19 05:23:06 +08:00
using osu.Framework.Graphics.Shapes ;
using osu.Framework.Graphics.UserInterface ;
using osu.Framework.Testing ;
2022-05-24 15:50:16 +08:00
using osu.Game.Overlays ;
2018-11-06 17:28:22 +08:00
using osu.Game.Screens.Edit ;
using osu.Game.Screens.Edit.Compose.Components ;
2018-11-20 15:51:59 +08:00
using osuTK ;
2020-03-19 04:55:35 +08:00
using osuTK.Input ;
2018-04-13 17:19:50 +08:00
2020-04-23 16:07:55 +08:00
namespace osu.Game.Tests.Visual.Editing
2018-03-19 18:46:26 +08:00
{
2020-03-23 09:01:33 +08:00
public partial class TestSceneBeatDivisorControl : OsuManualInputManagerTestScene
2018-03-19 18:46:26 +08:00
{
2023-06-01 15:28:47 +08:00
private BeatDivisorControl beatDivisorControl = null ! ;
private BindableBeatDivisor bindableBeatDivisor = null ! ;
2018-04-13 17:19:50 +08:00
2022-02-13 22:50:40 +08:00
private SliderBar < int > tickSliderBar = > beatDivisorControl . ChildrenOfType < SliderBar < int > > ( ) . Single ( ) ;
2022-05-24 17:38:08 +08:00
private Triangle tickMarkerHead = > tickSliderBar . ChildrenOfType < Triangle > ( ) . Single ( ) ;
2020-03-19 05:23:06 +08:00
2022-05-24 15:50:16 +08:00
[Cached]
2022-05-24 16:36:43 +08:00
private readonly OverlayColourProvider overlayColour = new OverlayColourProvider ( OverlayColourScheme . Aquamarine ) ;
2022-05-24 15:50:16 +08:00
2020-03-19 04:54:17 +08:00
[SetUp]
public void SetUp ( ) = > Schedule ( ( ) = >
2018-03-19 18:46:26 +08:00
{
2022-02-13 23:27:12 +08:00
Child = new PopoverContainer
2018-03-19 18:46:26 +08:00
{
2022-02-13 23:27:12 +08:00
RelativeSizeAxes = Axes . Both ,
Child = beatDivisorControl = new BeatDivisorControl ( bindableBeatDivisor = new BindableBeatDivisor ( 16 ) )
{
Anchor = Anchor . Centre ,
Origin = Anchor . Centre ,
2023-05-17 15:33:58 +08:00
Size = new Vector2 ( 90 , 90 ) ,
Scale = new Vector2 ( 3 ) ,
2022-02-13 23:27:12 +08:00
}
2018-03-19 18:46:26 +08:00
} ;
2020-03-19 04:54:17 +08:00
} ) ;
2020-03-19 03:04:38 +08:00
[Test]
public void TestBindableBeatDivisor ( )
{
2022-02-28 03:13:44 +08:00
AddRepeatStep ( "move previous" , ( ) = > bindableBeatDivisor . Previous ( ) , 2 ) ;
2020-03-19 05:23:06 +08:00
AddAssert ( "divisor is 4" , ( ) = > bindableBeatDivisor . Value = = 4 ) ;
2022-02-28 03:13:44 +08:00
AddRepeatStep ( "move next" , ( ) = > bindableBeatDivisor . Next ( ) , 1 ) ;
AddAssert ( "divisor is 12" , ( ) = > bindableBeatDivisor . Value = = 8 ) ;
2020-03-19 03:04:38 +08:00
}
[Test]
public void TestMouseInput ( )
{
2020-03-19 05:23:06 +08:00
AddStep ( "hold marker" , ( ) = >
2020-03-19 03:04:38 +08:00
{
2020-03-19 05:23:06 +08:00
InputManager . MoveMouseTo ( tickMarkerHead . ScreenSpaceDrawQuad . Centre ) ;
2020-03-19 04:55:35 +08:00
InputManager . PressButton ( MouseButton . Left ) ;
2020-03-19 03:04:38 +08:00
} ) ;
2023-05-23 22:46:08 +08:00
AddStep ( "move to 1" , ( ) = > InputManager . MoveMouseTo ( getPositionForDivisor ( 1 ) ) ) ;
AddStep ( "move to 16 and release" , ( ) = >
2020-03-19 03:04:38 +08:00
{
2023-05-23 22:46:08 +08:00
InputManager . MoveMouseTo ( getPositionForDivisor ( 16 ) ) ;
2020-03-19 04:55:35 +08:00
InputManager . ReleaseButton ( MouseButton . Left ) ;
2020-03-19 03:04:38 +08:00
} ) ;
2023-05-23 22:46:08 +08:00
AddAssert ( "divisor is 16" , ( ) = > bindableBeatDivisor . Value = = 16 ) ;
2020-03-19 05:23:06 +08:00
AddStep ( "hold marker" , ( ) = > InputManager . PressButton ( MouseButton . Left ) ) ;
2023-05-23 22:46:08 +08:00
AddStep ( "move to ~6 and release" , ( ) = >
{
InputManager . MoveMouseTo ( getPositionForDivisor ( 6 ) ) ;
InputManager . ReleaseButton ( MouseButton . Left ) ;
} ) ;
AddAssert ( "divisor clamped to 8" , ( ) = > bindableBeatDivisor . Value = = 8 ) ;
AddStep ( "move to ~10 and click" , ( ) = >
2020-03-19 03:04:38 +08:00
{
2020-03-19 05:23:06 +08:00
InputManager . MoveMouseTo ( getPositionForDivisor ( 10 ) ) ;
2023-05-23 22:46:08 +08:00
InputManager . PressButton ( MouseButton . Left ) ;
2020-03-19 04:55:35 +08:00
InputManager . ReleaseButton ( MouseButton . Left ) ;
2020-03-19 03:04:38 +08:00
} ) ;
2020-03-19 05:23:06 +08:00
AddAssert ( "divisor clamped to 8" , ( ) = > bindableBeatDivisor . Value = = 8 ) ;
}
private Vector2 getPositionForDivisor ( int divisor )
{
2023-05-23 23:59:07 +08:00
float localX = ( 1 - 1 / ( float ) divisor ) * tickSliderBar . UsableWidth + tickSliderBar . RangePadding ;
2023-05-23 22:46:40 +08:00
return tickSliderBar . ToScreenSpace ( new Vector2 (
localX ,
2023-05-23 23:59:07 +08:00
tickSliderBar . DrawHeight / 2
2023-05-23 22:46:40 +08:00
) ) ;
2020-03-19 03:04:38 +08:00
}
2022-02-28 02:23:02 +08:00
[Test]
public void TestBeatChevronNavigation ( )
{
switchBeatSnap ( 1 ) ;
assertBeatSnap ( 1 ) ;
switchBeatSnap ( 3 ) ;
assertBeatSnap ( 8 ) ;
switchBeatSnap ( - 1 ) ;
assertBeatSnap ( 4 ) ;
switchBeatSnap ( - 3 ) ;
assertBeatSnap ( 16 ) ;
}
2022-10-25 10:51:31 +08:00
[Test]
public void TestKeyboardNavigation ( )
{
pressKey ( 1 ) ;
assertBeatSnap ( 1 ) ;
assertPreset ( BeatDivisorType . Common ) ;
pressKey ( 2 ) ;
assertBeatSnap ( 2 ) ;
assertPreset ( BeatDivisorType . Common ) ;
pressKey ( 3 ) ;
assertBeatSnap ( 3 ) ;
assertPreset ( BeatDivisorType . Triplets ) ;
pressKey ( 4 ) ;
assertBeatSnap ( 4 ) ;
assertPreset ( BeatDivisorType . Common ) ;
pressKey ( 5 ) ;
assertBeatSnap ( 5 ) ;
assertPreset ( BeatDivisorType . Custom , 5 ) ;
pressKey ( 6 ) ;
assertBeatSnap ( 6 ) ;
assertPreset ( BeatDivisorType . Triplets ) ;
pressKey ( 7 ) ;
assertBeatSnap ( 7 ) ;
assertPreset ( BeatDivisorType . Custom , 7 ) ;
pressKey ( 8 ) ;
assertBeatSnap ( 8 ) ;
assertPreset ( BeatDivisorType . Common ) ;
void pressKey ( int key ) = > AddStep ( $"press shift+{key}" , ( ) = >
{
InputManager . PressKey ( Key . ShiftLeft ) ;
InputManager . Key ( Key . Number0 + key ) ;
InputManager . ReleaseKey ( Key . ShiftLeft ) ;
} ) ;
}
2022-02-28 02:23:02 +08:00
[Test]
public void TestBeatPresetNavigation ( )
{
assertPreset ( BeatDivisorType . Common ) ;
switchPresets ( 1 ) ;
assertPreset ( BeatDivisorType . Triplets ) ;
2023-06-01 16:12:00 +08:00
assertBeatSnap ( 6 ) ;
2022-02-28 02:23:02 +08:00
switchPresets ( 1 ) ;
assertPreset ( BeatDivisorType . Common ) ;
2023-06-01 16:12:00 +08:00
assertBeatSnap ( 4 ) ;
2022-02-28 02:23:02 +08:00
switchPresets ( - 1 ) ;
assertPreset ( BeatDivisorType . Triplets ) ;
switchPresets ( - 1 ) ;
assertPreset ( BeatDivisorType . Common ) ;
setDivisorViaInput ( 3 ) ;
assertPreset ( BeatDivisorType . Triplets ) ;
setDivisorViaInput ( 8 ) ;
assertPreset ( BeatDivisorType . Common ) ;
setDivisorViaInput ( 15 ) ;
assertPreset ( BeatDivisorType . Custom , 15 ) ;
2023-06-01 16:12:00 +08:00
assertBeatSnap ( 15 ) ;
2022-02-28 02:23:02 +08:00
switchBeatSnap ( - 1 ) ;
assertBeatSnap ( 5 ) ;
switchBeatSnap ( - 1 ) ;
assertBeatSnap ( 3 ) ;
setDivisorViaInput ( 5 ) ;
assertPreset ( BeatDivisorType . Custom , 15 ) ;
2023-06-01 16:12:00 +08:00
assertBeatSnap ( 5 ) ;
2022-02-28 02:23:02 +08:00
switchPresets ( 1 ) ;
assertPreset ( BeatDivisorType . Common ) ;
switchPresets ( - 1 ) ;
2023-06-01 16:12:00 +08:00
assertPreset ( BeatDivisorType . Custom , 15 ) ;
assertBeatSnap ( 15 ) ;
2022-02-28 02:23:02 +08:00
}
private void switchBeatSnap ( int direction ) = > AddRepeatStep ( $"move snap {(direction > 0 ? " forward " : " backward ")}" , ( ) = >
{
int chevronIndex = direction > 0 ? 1 : 0 ;
var chevronButton = beatDivisorControl . ChildrenOfType < BeatDivisorControl . ChevronButton > ( ) . ElementAt ( chevronIndex ) ;
InputManager . MoveMouseTo ( chevronButton ) ;
InputManager . Click ( MouseButton . Left ) ;
} , Math . Abs ( direction ) ) ;
private void assertBeatSnap ( int expected ) = > AddAssert ( $"beat snap is {expected}" ,
( ) = > bindableBeatDivisor . Value = = expected ) ;
private void switchPresets ( int direction ) = > AddRepeatStep ( $"move presets {(direction > 0 ? " forward " : " backward ")}" , ( ) = >
{
int chevronIndex = direction > 0 ? 3 : 2 ;
var chevronButton = beatDivisorControl . ChildrenOfType < BeatDivisorControl . ChevronButton > ( ) . ElementAt ( chevronIndex ) ;
InputManager . MoveMouseTo ( chevronButton ) ;
InputManager . Click ( MouseButton . Left ) ;
} , Math . Abs ( direction ) ) ;
private void assertPreset ( BeatDivisorType type , int? maxDivisor = null )
{
2023-06-01 16:12:00 +08:00
AddAssert ( $"preset is {type}" , ( ) = > bindableBeatDivisor . ValidDivisors . Value . Type , ( ) = > Is . EqualTo ( type ) ) ;
2022-02-28 02:23:02 +08:00
if ( type = = BeatDivisorType . Custom )
{
Debug . Assert ( maxDivisor ! = null ) ;
AddAssert ( $"max divisor is {maxDivisor}" , ( ) = > bindableBeatDivisor . ValidDivisors . Value . Presets . Max ( ) = = maxDivisor . Value ) ;
}
}
private void setDivisorViaInput ( int divisor )
{
AddStep ( "open divisor input popover" , ( ) = >
{
var button = beatDivisorControl . ChildrenOfType < BeatDivisorControl . DivisorDisplay > ( ) . Single ( ) ;
InputManager . MoveMouseTo ( button ) ;
InputManager . Click ( MouseButton . Left ) ;
} ) ;
2023-06-01 15:28:47 +08:00
BeatDivisorControl . CustomDivisorPopover ? popover = null ;
2022-02-28 02:23:02 +08:00
AddUntilStep ( "wait for popover" , ( ) = > ( popover = this . ChildrenOfType < BeatDivisorControl . CustomDivisorPopover > ( ) . SingleOrDefault ( ) ) ! = null & & popover . IsLoaded ) ;
AddStep ( $"set divisor to {divisor}" , ( ) = >
{
var textBox = popover . ChildrenOfType < TextBox > ( ) . Single ( ) ;
InputManager . MoveMouseTo ( textBox ) ;
InputManager . Click ( MouseButton . Left ) ;
textBox . Text = divisor . ToString ( ) ;
InputManager . Key ( Key . Enter ) ;
} ) ;
AddUntilStep ( "wait for dismiss" , ( ) = > ! this . ChildrenOfType < BeatDivisorControl . CustomDivisorPopover > ( ) . Any ( ) ) ;
}
2018-03-19 18:46:26 +08:00
}
}