using System.Threading.Tasks; using Godot; namespace Movementtests.tests; using GdUnit4; using static GdUnit4.Assertions; [TestSuite, RequireGodotRuntime] public class PlayerMovementTest { private ISceneRunner _runner; private Node _scene; private PlayerController _player; private readonly float _tolerance = 0.01f; private readonly Vector3 _vectorTolerance = new Vector3(0.01f, 0.01f, 0.01f); [Before] public void Setup() {} [After] public void Cleanup() {} [BeforeTest] public void SetupTest() { _runner = ISceneRunner.Load("res://tests/player_movement/player_movement_scene.tscn"); _scene = _runner.Scene()!; var player = _scene.FindChild("Player") as PlayerController; _player = player!; } [AfterTest] public void CleanupTest() {} [TestCase("BaseLocation")] public async Task PlayerMoveForward(string markerName) { var marker = _scene.FindChild(markerName) as Marker3D; AssertObject(marker).IsNotNull(); _player.GlobalPosition = marker!.GlobalPosition; await _runner.AwaitIdleFrame(); var startPos = _player.GlobalPosition; _runner.SimulateKeyPress(Key.W); await _runner.AwaitMillis(300); _runner.SimulateKeyRelease(Key.W); var endPos = _player.GlobalPosition; var direction = startPos.DirectionTo(endPos); AssertVector(direction).IsEqualApprox(Vector3.Forward, _vectorTolerance); } [TestCase("BaseLocation")] public async Task PlayerJump(string markerName) { var marker = _scene.FindChild(markerName) as Marker3D; AssertObject(marker).IsNotNull(); _player.GlobalPosition = marker!.GlobalPosition; await _runner.AwaitIdleFrame(); var startPos = _player.GlobalPosition; _runner.SimulateKeyPress(Key.Space); await _runner.AwaitMillis(100); _runner.SimulateKeyRelease(Key.Space); var endPos = _player.GlobalPosition; var direction = startPos.DirectionTo(endPos); AssertVector(direction).IsEqualApprox(Vector3.Up, _vectorTolerance); AssertVector(_player.Velocity.Normalized()).IsEqualApprox(Vector3.Up, _vectorTolerance); await _runner.AwaitMillis(500); endPos = _player.GlobalPosition; AssertVector(endPos - startPos).IsEqualApprox(Vector3.Zero, _vectorTolerance); } [TestCase("MantleLocation1")] public async Task PlayerMantle(string markerName) { var marker = _scene.FindChild(markerName) as Marker3D; AssertObject(marker).IsNotNull(); _player.GlobalPosition = marker!.GlobalPosition; await _runner.AwaitMillis(100); var startPos = _player.GlobalPosition; _runner.SimulateKeyPress(Key.Space); await _runner.AwaitMillis(100); _runner.SimulateKeyRelease(Key.Space); await _runner.AwaitMillis(300); var endPos = _player.GlobalPosition; AssertFloat((endPos - startPos).Length()).IsGreater(0.0f); AssertFloat(endPos.Y).IsEqualApprox(1.0f, _tolerance); } }