using System.Threading.Tasks; using Godot; using GodotStateCharts; namespace Movementtests.tests; using GdUnit4; using static GdUnit4.Assertions; [TestSuite, RequireGodotRuntime] public class PlayerInteractionsTest { 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); [BeforeTest] public void SetupTest() { _runner = ISceneRunner.Load("res://tests/player/interactions/player_interactions_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); } }