コード例 #1
0
        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();
        }