private async Task RunAsyncTests() { // Wait for start method to be called while (controllerA.Character == null) { await Script.NextFrame(); } // Wait for controllers to be on the ground while (!controllerA.Character.IsGrounded || !controllerB.Character.IsGrounded) { await Script.NextFrame(); } controllerA.UpdateSpawnPosition(); controllerB.UpdateSpawnPosition(); // Enabled a wall that blocks A and B RecursiveToggle(filterAB, true); RecursiveToggle(filterB, false); var buildResult = await dynamicNavigation.Rebuild(); Assert.True(buildResult.Success); Assert.Equal(2, buildResult.UpdatedLayers.Count); await Task.WhenAll(controllerA.TryMove(targetPosition).ContinueWith(x => { Assert.False(x.Result.Success); }), controllerB.TryMove(targetPosition).ContinueWith(x => { Assert.False(x.Result.Success); })); await Reset(); // Enabled a wall that only blocks B RecursiveToggle(filterAB, false); RecursiveToggle(filterB, true); buildResult = await dynamicNavigation.Rebuild(); Assert.True(buildResult.Success); await Task.WhenAll(controllerA.TryMove(targetPosition).ContinueWith(x => { Assert.True(x.Result.Success); }), controllerB.TryMove(targetPosition).ContinueWith(x => { Assert.False(x.Result.Success); })); await Reset(); // Disable both walls RecursiveToggle(filterAB, false); RecursiveToggle(filterB, false); buildResult = await dynamicNavigation.Rebuild(); Assert.True(buildResult.Success); await Task.WhenAll(controllerA.TryMove(targetPosition).ContinueWith(x => { Assert.True(x.Result.Success); }), controllerB.TryMove(targetPosition).ContinueWith(x => { Assert.True(x.Result.Success); })); // Walk back to spawn with only letting A pass RecursiveToggle(filterAB, false); RecursiveToggle(filterB, true); buildResult = await dynamicNavigation.Rebuild(); Assert.True(buildResult.Success); await Task.WhenAll(controllerA.TryMove(controllerA.SpawnPosition).ContinueWith(x => { Assert.True(x.Result.Success); }), controllerB.TryMove(controllerB.SpawnPosition).ContinueWith(x => { Assert.False(x.Result.Success); })); Exit(); }