2020-09-24 13:46: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.
using System.Linq ;
using NUnit.Framework ;
using osu.Framework.Testing ;
2020-09-24 15:22:47 +08:00
using osu.Framework.Utils ;
2020-09-24 13:46:03 +08:00
using osu.Game.Beatmaps ;
using osu.Game.Rulesets.Osu.Objects ;
using osu.Game.Rulesets.Osu.UI ;
using osu.Game.Tests.Beatmaps ;
using osuTK ;
using osuTK.Input ;
namespace osu.Game.Rulesets.Osu.Tests.Editor
{
[TestFixture]
public class TestSceneObjectObjectSnap : TestSceneOsuEditor
{
private OsuPlayfield playfield ;
protected override IBeatmap CreateBeatmap ( RulesetInfo ruleset ) = > new TestBeatmap ( Ruleset . Value , false ) ;
public override void SetUpSteps ( )
{
base . SetUpSteps ( ) ;
AddStep ( "get playfield" , ( ) = > playfield = Editor . ChildrenOfType < OsuPlayfield > ( ) . First ( ) ) ;
}
2020-09-24 15:31:30 +08:00
[TestCase(true)]
[TestCase(false)]
public void TestHitCircleSnapsToOtherHitCircle ( bool distanceSnapEnabled )
2020-09-24 13:46:03 +08:00
{
AddStep ( "move mouse to centre" , ( ) = > InputManager . MoveMouseTo ( playfield . ScreenSpaceDrawQuad . Centre ) ) ;
2020-09-24 15:31:30 +08:00
if ( ! distanceSnapEnabled )
2020-09-25 11:16:50 +08:00
AddStep ( "disable distance snap" , ( ) = > InputManager . Key ( Key . Q ) ) ;
AddStep ( "enter placement mode" , ( ) = > InputManager . Key ( Key . Number2 ) ) ;
2020-09-24 13:46:03 +08:00
AddStep ( "place first object" , ( ) = > InputManager . Click ( MouseButton . Left ) ) ;
2020-09-24 15:37:08 +08:00
AddStep ( "move mouse slightly" , ( ) = > InputManager . MoveMouseTo ( playfield . ScreenSpaceDrawQuad . Centre + new Vector2 ( playfield . ScreenSpaceDrawQuad . Width * 0.02f , 0 ) ) ) ;
2020-09-24 13:46:03 +08:00
AddStep ( "place second object" , ( ) = > InputManager . Click ( MouseButton . Left ) ) ;
AddAssert ( "both objects at same location" , ( ) = >
{
var objects = EditorBeatmap . HitObjects ;
var first = ( OsuHitObject ) objects . First ( ) ;
var second = ( OsuHitObject ) objects . Last ( ) ;
return first . Position = = second . Position ;
} ) ;
2020-09-24 15:22:47 +08:00
}
[Test]
public void TestHitCircleSnapsToSliderEnd ( )
{
AddStep ( "move mouse to centre" , ( ) = > InputManager . MoveMouseTo ( playfield . ScreenSpaceDrawQuad . Centre ) ) ;
2020-09-25 11:16:50 +08:00
AddStep ( "disable distance snap" , ( ) = > InputManager . Key ( Key . Q ) ) ;
2020-09-24 15:22:47 +08:00
2020-09-25 11:16:50 +08:00
AddStep ( "enter slider placement mode" , ( ) = > InputManager . Key ( Key . Number3 ) ) ;
2020-09-24 15:22:47 +08:00
AddStep ( "start slider placement" , ( ) = > InputManager . Click ( MouseButton . Left ) ) ;
2020-09-24 15:37:08 +08:00
AddStep ( "move to place end" , ( ) = > InputManager . MoveMouseTo ( playfield . ScreenSpaceDrawQuad . Centre + new Vector2 ( playfield . ScreenSpaceDrawQuad . Width * 0.185f , 0 ) ) ) ;
2020-09-24 13:46:03 +08:00
2020-09-24 15:22:47 +08:00
AddStep ( "end slider placement" , ( ) = > InputManager . Click ( MouseButton . Right ) ) ;
2020-09-25 11:16:50 +08:00
AddStep ( "enter circle placement mode" , ( ) = > InputManager . Key ( Key . Number2 ) ) ;
2020-09-24 15:22:47 +08:00
2020-09-24 15:37:08 +08:00
AddStep ( "move mouse slightly" , ( ) = > InputManager . MoveMouseTo ( playfield . ScreenSpaceDrawQuad . Centre + new Vector2 ( playfield . ScreenSpaceDrawQuad . Width * 0.20f , 0 ) ) ) ;
2020-09-24 15:22:47 +08:00
AddStep ( "place second object" , ( ) = > InputManager . Click ( MouseButton . Left ) ) ;
AddAssert ( "circle is at slider's end" , ( ) = >
{
var objects = EditorBeatmap . HitObjects ;
var first = ( Slider ) objects . First ( ) ;
var second = ( OsuHitObject ) objects . Last ( ) ;
return Precision . AlmostEquals ( first . EndPosition , second . Position ) ;
} ) ;
2020-09-24 13:46:03 +08:00
}
}
}