Exemple #1
0
        public void GetNavigationData_TargetIsUnwalkable_ReturnsNull()
        {
            var               target           = new Position(2, 2);
            IPathfinder       pathfinder       = Mock.Of <IPathfinder>();
            IGridInfoProvider gridInfoProvider = Mock.Of <IGridInfoProvider>(gip => gip.IsWalkable(target) == false);
            var               navigator        = new Navigator(pathfinder, gridInfoProvider, Mock.Of <INaturalLineCalculator>(), Mock.Of <IRasterLineCreator>(),
                                                               Mock.Of <IUiFacade>());

            NavigationData result = navigator.GetNavigationData(new Position(0, 0), target);

            result.Should().BeNull();
        }
Exemple #2
0
        public void ResolveNextStep_NextStepIsUnwalkable_RecalculatesNavigationDataAndReturnsResultForNewPath()
        {
            var               currentPosition     = new Position(2, 2);
            var               nextStepOnStack     = new Position(3, 2);
            var               alternativeNextStep = new Position(3, 3);
            var               destination         = new Position(4, 2);
            IPathfinder       pathfinder          = Mock.Of <IPathfinder>();
            IGridInfoProvider gridInfoProvider    = Mock.Of <IGridInfoProvider>(p =>
                                                                                p.IsWalkable(It.IsAny <Position>()) == true &&
                                                                                p.IsWalkable(nextStepOnStack) == false
                                                                                );
            var bresenham         = new BresenhamLineCreator();
            var navigatorMockReal = new Mock <Navigator>(pathfinder, gridInfoProvider, new NaturalLineCalculator(bresenham),
                                                         bresenham, Mock.Of <IUiFacade>())
            {
                CallBase = true
            };
            var currentNavigationData = new NavigationData
            {
                Destination = destination,
                RemainingStepsInCurrentSegment = new Stack <Position>(new[] { destination, nextStepOnStack })
            };
            var recalculatedNavigationData = new NavigationData
            {
                Destination    = destination,
                RemainingNodes = new[] { alternativeNextStep, destination }.ToList(),
                RemainingStepsInCurrentSegment = new Stack <Position>(new [] { alternativeNextStep }),
                LastStep = currentPosition
            };

            navigatorMockReal.Setup(n => n.GetNavigationData(currentPosition, destination)).Returns(recalculatedNavigationData);

            Position         nextStep;
            NavigationResult result = navigatorMockReal.Object.ResolveNextStep(currentNavigationData, currentPosition, out nextStep);

            result.Should().Be(NavigationResult.InProgressWithRecalculation);
            var expectedNavigationData = new NavigationData
            {
                Destination    = destination,
                RemainingNodes = new[] { destination }.ToList(),
                RemainingStepsInCurrentSegment = new Stack <Position>(),
                LastStep = alternativeNextStep
            };

            currentNavigationData.Should().BeEquivalentTo(expectedNavigationData);
            nextStep.Should().Be(alternativeNextStep);
        }
Exemple #3
0
        public void GetNavigationData_TargetIsNotReachableByStraightLineNorByPathfinding_ReturnsNull()
        {
            var start          = new Position(0, 0);
            var target         = new Position(3, 3);
            var pathfinderMock = new Mock <IPathfinder>();
            IGridInfoProvider gridInfoProvider = Mock.Of <IGridInfoProvider>(gip =>
                                                                             gip.IsWalkable(It.IsAny <Position>()) == true &&
                                                                             gip.IsWalkable(new Position(1, 1)) == false &&
                                                                             gip.IsWalkable(new Position(1, 2)) == false);
            var bresenham = new BresenhamLineCreator();
            var navigator = new Navigator(pathfinderMock.Object, gridInfoProvider, new NaturalLineCalculator(bresenham), bresenham, Mock.Of <IUiFacade>());

            NavigationData result = navigator.GetNavigationData(start, target);

            pathfinderMock.Verify(p => p.FindJumpPointsWithJps(It.IsAny <Position>(), It.IsAny <Position>(), It.IsAny <JpsMode>()), Times.Once);
            result.Should().BeNull();
        }
Exemple #4
0
        public void ResolveNextStep_NavigationDataIsCorrupted_RecalculationIsUsed(NavigationData inputNavigationData)
        {
            IPathfinder       pathfinder       = Mock.Of <IPathfinder>();
            IGridInfoProvider gridInfoProvider = Mock.Of <IGridInfoProvider>(p =>
                                                                             p.IsWalkable(It.IsAny <Position>()) == true &&
                                                                             p.IsWalkable(new Position(2, 2)) == false &&
                                                                             p.IsWalkable(new Position(3, 2)) == false // two walls, so that no recalculated nodes are skipped
                                                                             );
            var bresenham         = new BresenhamLineCreator();
            var navigatorMockReal = new Mock <Navigator>(pathfinder, gridInfoProvider, new NaturalLineCalculator(bresenham),
                                                         bresenham, Mock.Of <IUiFacade>())
            {
                CallBase = true
            };
            Position        currentPosition = new Position(1, 1);
            List <Position> recalculatedRemainingNodes = new[] { new Position(3, 1), new Position(4, 3) }.ToList();
            var             recalculatedNavigationData = new NavigationData
            {
                Destination    = recalculatedRemainingNodes[1],
                RemainingNodes = recalculatedRemainingNodes,
                RemainingStepsInCurrentSegment = new Stack <Position>(),
                LastStep = currentPosition
            };

            navigatorMockReal.Setup(n => n.GetNavigationData(currentPosition, recalculatedRemainingNodes[1]))
            .Returns(recalculatedNavigationData);

            Position         nextStep;
            NavigationResult result = navigatorMockReal.Object.ResolveNextStep(inputNavigationData, currentPosition, out nextStep);

            result.Should().Be(NavigationResult.InProgressWithRecalculation);
            var expectedNavigationData = new NavigationData
            {
                Destination    = recalculatedRemainingNodes[1],
                RemainingNodes = recalculatedRemainingNodes,
                RemainingStepsInCurrentSegment = new Stack <Position>(new[] { recalculatedRemainingNodes[0] }),
                LastStep = new Position(2, 1)
            };

            inputNavigationData.Should().BeEquivalentTo(expectedNavigationData);
            nextStep.Should().Be(new Position(2, 1));
        }