2022-11-05 02:45:36 +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.
using System ;
using System.Linq ;
using NUnit.Framework ;
using osu.Framework.Graphics.Cursor ;
using osu.Framework.Graphics.UserInterface ;
using osu.Framework.Testing ;
using osu.Game.Beatmaps ;
using osu.Game.Graphics.UserInterface ;
using osu.Game.Rulesets.Objects ;
using osu.Game.Rulesets.Osu.Edit.Blueprints.HitCircles.Components ;
using osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components ;
using osu.Game.Rulesets.Osu.Objects ;
using osu.Game.Screens.Edit.Compose.Components ;
using osu.Game.Tests.Beatmaps ;
using osuTK ;
using osuTK.Input ;
namespace osu.Game.Rulesets.Osu.Tests.Editor
{
[TestFixture]
2022-11-24 13:32:20 +08:00
public partial class TestSceneOsuComposerSelection : TestSceneOsuEditor
2022-11-05 02:45:36 +08:00
{
protected override IBeatmap CreateBeatmap ( RulesetInfo ruleset ) = > new TestBeatmap ( ruleset , false ) ;
2023-07-19 13:58:45 +08:00
[Test]
public void TestSelectAfterFadedOut ( )
{
var slider = new Slider
{
StartTime = 0 ,
Position = new Vector2 ( 100 , 100 ) ,
Path = new SliderPath
{
ControlPoints =
{
new PathControlPoint ( ) ,
new PathControlPoint ( new Vector2 ( 100 ) )
}
}
} ;
AddStep ( "add slider" , ( ) = > EditorBeatmap . Add ( slider ) ) ;
moveMouseToObject ( ( ) = > slider ) ;
AddStep ( "seek after end" , ( ) = > EditorClock . Seek ( 750 ) ) ;
AddStep ( "left click" , ( ) = > InputManager . Click ( MouseButton . Left ) ) ;
AddAssert ( "slider not selected" , ( ) = > EditorBeatmap . SelectedHitObjects . Count = = 0 ) ;
AddStep ( "seek to visible" , ( ) = > EditorClock . Seek ( 650 ) ) ;
AddStep ( "left click" , ( ) = > InputManager . Click ( MouseButton . Left ) ) ;
AddUntilStep ( "slider selected" , ( ) = > EditorBeatmap . SelectedHitObjects . Single ( ) = = slider ) ;
}
2022-11-05 02:45:36 +08:00
[Test]
public void TestContextMenuShownCorrectlyForSelectedSlider ( )
{
var slider = new Slider
{
StartTime = 0 ,
Position = new Vector2 ( 100 , 100 ) ,
Path = new SliderPath
{
ControlPoints =
{
new PathControlPoint ( ) ,
new PathControlPoint ( new Vector2 ( 100 ) )
}
}
} ;
AddStep ( "add slider" , ( ) = > EditorBeatmap . Add ( slider ) ) ;
moveMouseToObject ( ( ) = > slider ) ;
AddStep ( "left click" , ( ) = > InputManager . Click ( MouseButton . Left ) ) ;
AddUntilStep ( "slider selected" , ( ) = > EditorBeatmap . SelectedHitObjects . Single ( ) = = slider ) ;
AddStep ( "move mouse to centre" , ( ) = > InputManager . MoveMouseTo ( blueprintContainer . ChildrenOfType < SliderBodyPiece > ( ) . Single ( ) . ScreenSpaceDrawQuad . Centre ) ) ;
AddStep ( "right click" , ( ) = > InputManager . Click ( MouseButton . Right ) ) ;
AddUntilStep ( "context menu is visible" , ( ) = > contextMenuContainer . ChildrenOfType < OsuContextMenu > ( ) . Single ( ) . State = = MenuState . Open ) ;
}
[Test]
public void TestSelectionIncludingSliderPreservedOnClick ( )
{
var firstSlider = new Slider
{
StartTime = 0 ,
Position = new Vector2 ( 0 , 0 ) ,
Path = new SliderPath
{
ControlPoints =
{
new PathControlPoint ( ) ,
new PathControlPoint ( new Vector2 ( 100 ) )
}
}
} ;
var secondSlider = new Slider
{
StartTime = 1000 ,
Position = new Vector2 ( 100 , 100 ) ,
Path = new SliderPath
{
ControlPoints =
{
new PathControlPoint ( ) ,
new PathControlPoint ( new Vector2 ( 100 , - 100 ) )
}
}
} ;
var hitCircle = new HitCircle
{
StartTime = 200 ,
Position = new Vector2 ( 300 , 0 )
} ;
AddStep ( "add objects" , ( ) = > EditorBeatmap . AddRange ( new HitObject [ ] { firstSlider , secondSlider , hitCircle } ) ) ;
AddStep ( "select last 2 objects" , ( ) = > EditorBeatmap . SelectedHitObjects . AddRange ( new HitObject [ ] { secondSlider , hitCircle } ) ) ;
moveMouseToObject ( ( ) = > secondSlider ) ;
AddStep ( "click left mouse" , ( ) = > InputManager . Click ( MouseButton . Left ) ) ;
AddAssert ( "selection preserved" , ( ) = > EditorBeatmap . SelectedHitObjects . Count = = 2 ) ;
}
2024-02-10 22:34:12 +08:00
[Test]
public void TestControlClickAddsControlPointsIfSingleSliderSelected ( )
{
var firstSlider = new Slider
{
StartTime = 0 ,
Position = new Vector2 ( 0 , 0 ) ,
Path = new SliderPath
{
ControlPoints =
{
new PathControlPoint ( ) ,
new PathControlPoint ( new Vector2 ( 100 ) )
}
}
} ;
var secondSlider = new Slider
{
StartTime = 1000 ,
Position = new Vector2 ( 200 , 200 ) ,
Path = new SliderPath
{
ControlPoints =
{
new PathControlPoint ( ) ,
new PathControlPoint ( new Vector2 ( 100 , - 100 ) )
}
}
} ;
AddStep ( "add objects" , ( ) = > EditorBeatmap . AddRange ( new HitObject [ ] { firstSlider , secondSlider } ) ) ;
AddStep ( "select first slider" , ( ) = > EditorBeatmap . SelectedHitObjects . AddRange ( new HitObject [ ] { secondSlider } ) ) ;
AddStep ( "move mouse to middle of slider" , ( ) = >
{
var pos = blueprintContainer . SelectionBlueprints
. First ( s = > s . Item = = secondSlider )
. ChildrenOfType < SliderBodyPiece > ( ) . First ( )
. ScreenSpaceDrawQuad . Centre ;
InputManager . MoveMouseTo ( pos ) ;
} ) ;
AddStep ( "control-click left mouse" , ( ) = >
{
InputManager . PressKey ( Key . ControlLeft ) ;
InputManager . Click ( MouseButton . Left ) ;
InputManager . ReleaseKey ( Key . ControlLeft ) ;
} ) ;
AddAssert ( "selection preserved" , ( ) = > EditorBeatmap . SelectedHitObjects . Count , ( ) = > Is . EqualTo ( 1 ) ) ;
AddAssert ( "slider has 3 anchors" , ( ) = > secondSlider . Path . ControlPoints . Count , ( ) = > Is . EqualTo ( 3 ) ) ;
}
[Test]
public void TestControlClickDoesNotAddSliderControlPointsIfMultipleObjectsSelected ( )
{
var firstSlider = new Slider
{
StartTime = 0 ,
Position = new Vector2 ( 0 , 0 ) ,
Path = new SliderPath
{
ControlPoints =
{
new PathControlPoint ( ) ,
new PathControlPoint ( new Vector2 ( 100 ) )
}
}
} ;
var secondSlider = new Slider
{
StartTime = 1000 ,
Position = new Vector2 ( 200 , 200 ) ,
Path = new SliderPath
{
ControlPoints =
{
new PathControlPoint ( ) ,
new PathControlPoint ( new Vector2 ( 100 , - 100 ) )
}
}
} ;
AddStep ( "add objects" , ( ) = > EditorBeatmap . AddRange ( new HitObject [ ] { firstSlider , secondSlider } ) ) ;
AddStep ( "select first slider" , ( ) = > EditorBeatmap . SelectedHitObjects . AddRange ( new HitObject [ ] { firstSlider , secondSlider } ) ) ;
AddStep ( "move mouse to middle of slider" , ( ) = >
{
var pos = blueprintContainer . SelectionBlueprints
. First ( s = > s . Item = = secondSlider )
. ChildrenOfType < SliderBodyPiece > ( ) . First ( )
. ScreenSpaceDrawQuad . Centre ;
InputManager . MoveMouseTo ( pos ) ;
} ) ;
AddStep ( "control-click left mouse" , ( ) = >
{
InputManager . PressKey ( Key . ControlLeft ) ;
InputManager . Click ( MouseButton . Left ) ;
InputManager . ReleaseKey ( Key . ControlLeft ) ;
} ) ;
AddAssert ( "selection not preserved" , ( ) = > EditorBeatmap . SelectedHitObjects . Count , ( ) = > Is . EqualTo ( 1 ) ) ;
AddAssert ( "second slider not selected" ,
( ) = > blueprintContainer . SelectionBlueprints . First ( s = > s . Item = = secondSlider ) . IsSelected ,
( ) = > Is . False ) ;
AddAssert ( "slider still has 2 anchors" , ( ) = > secondSlider . Path . ControlPoints . Count , ( ) = > Is . EqualTo ( 2 ) ) ;
}
2022-11-05 02:45:36 +08:00
private ComposeBlueprintContainer blueprintContainer
= > Editor . ChildrenOfType < ComposeBlueprintContainer > ( ) . First ( ) ;
private ContextMenuContainer contextMenuContainer
= > Editor . ChildrenOfType < ContextMenuContainer > ( ) . First ( ) ;
private void moveMouseToObject ( Func < HitObject > targetFunc )
{
AddStep ( "move mouse to object" , ( ) = >
{
var pos = blueprintContainer . SelectionBlueprints
. First ( s = > s . Item = = targetFunc ( ) )
. ChildrenOfType < HitCirclePiece > ( )
. First ( ) . ScreenSpaceDrawQuad . Centre ;
InputManager . MoveMouseTo ( pos ) ;
} ) ;
}
}
}