Exemple #1
0
        public void ResolveNextStep_ActorWasDisplacedToPositionNeighboringLastStepAndNextStep_ReturnsInProgressWithMovementToNextStepAndStackIsEmpty()
        {
            var               currentPosition  = new Position(1, 1);
            var               lastStepPosition = new Position(1, 0);
            var               nextPosition     = new Position(2, 0);
            IPathfinder       pathfinder       = Mock.Of <IPathfinder>();
            IGridInfoProvider gridInfoProvider = Mock.Of <IGridInfoProvider>(p => p.IsWalkable(It.IsAny <Position>()) == true);
            var               bresenham        = new BresenhamLineCreator();
            var               navigator        = new Navigator(pathfinder, gridInfoProvider, new NaturalLineCalculator(bresenham), bresenham,
                                                               Mock.Of <IUiFacade>());
            var navigationData = new NavigationData
            {
                RemainingStepsInCurrentSegment = new Stack <Position>(new[] { nextPosition }),
                Destination    = nextPosition,
                RemainingNodes = new[] { nextPosition }.ToList(),
                LastStep = lastStepPosition
            };

            Position         nextStep;
            NavigationResult result = navigator.ResolveNextStep(navigationData, currentPosition, out nextStep);

            result.Should().Be(NavigationResult.InProgress);
            nextStep.Should().Be(nextPosition);
            navigationData.RemainingStepsInCurrentSegment.
            Should().BeEmpty();
        }
Exemple #2
0
        public void ResolveNextStep_ActorWasDisplacedToPositionNeighboringLastStepButNotNextStep_ReturnsInProgressWithMovementToLastStepAndStackIsCorrect()
        {
            var               currentPosition  = new Position(-1, 1);
            var               lastStepPosition = new Position(0, 1);
            var               nextPosition     = new Position(1, 1);
            IPathfinder       pathfinder       = Mock.Of <IPathfinder>();
            IGridInfoProvider gridInfoProvider = Mock.Of <IGridInfoProvider>(p => p.IsWalkable(It.IsAny <Position>()) == true);
            var               navigator        = new Navigator(pathfinder, gridInfoProvider, Mock.Of <INaturalLineCalculator>(), Mock.Of <IRasterLineCreator>(),
                                                               Mock.Of <IUiFacade>());
            var navigationData = new NavigationData
            {
                RemainingStepsInCurrentSegment = new Stack <Position>(new[] { nextPosition, lastStepPosition }),
                Destination    = nextPosition,
                LastStep       = lastStepPosition,
                RemainingNodes = new [] { nextPosition }.ToList()
            };

            Position         nextStep;
            NavigationResult result = navigator.ResolveNextStep(navigationData, currentPosition, out nextStep);

            result.Should().Be(NavigationResult.InProgress);
            nextStep.Should().Be(lastStepPosition);
            var expectedSteps = new Stack <Position>(new[] { nextPosition });

            navigationData.RemainingStepsInCurrentSegment.
            Should().BeEquivalentTo(expectedSteps, options => options.WithStrictOrderingFor(position => position));
        }
Exemple #3
0
        public void ResolveNextStep_NextStepIsNextNode_ReturnsInProgressWithNextStepAndNavigationDataIsCorrect()
        {
            var               currentPosition  = new Position(2, 2);
            var               nextNode         = new Position(3, 2);
            IPathfinder       pathfinder       = Mock.Of <IPathfinder>();
            IGridInfoProvider gridInfoProvider = Mock.Of <IGridInfoProvider>(p => p.IsWalkable(It.IsAny <Position>()) == true);
            var               navigator        = new Navigator(pathfinder, gridInfoProvider, Mock.Of <INaturalLineCalculator>(), Mock.Of <IRasterLineCreator>(),
                                                               Mock.Of <IUiFacade>());
            var nodesToVisit   = new[] { nextNode, new Position(213, 34254), };
            var navigationData = new NavigationData
            {
                RemainingNodes = nodesToVisit.ToList(),
                RemainingStepsInCurrentSegment = new Stack <Position>(new[] { nextNode }),
                Destination = new Position(4, 2),
                LastStep    = currentPosition
            };

            Position         nextStep;
            NavigationResult result = navigator.ResolveNextStep(navigationData, currentPosition, out nextStep);

            result.Should().Be(NavigationResult.InProgress);
            nextStep.Should().Be(nextNode);
            navigationData.RemainingStepsInCurrentSegment.Should().BeEmpty();
            navigationData.RemainingNodes.Should().BeEquivalentTo(nodesToVisit.Skip(1));
        }
Exemple #4
0
        public void ResolveNextStep_NextStepIsWalkableDestination_ReturnsInProgressWithNextStepAndUpcomingStepsAreCorrect()
        {
            var               currentPosition  = new Position(2, 2);
            var               destination      = new Position(3, 2);
            IPathfinder       pathfinder       = Mock.Of <IPathfinder>();
            IGridInfoProvider gridInfoProvider = Mock.Of <IGridInfoProvider>(p => p.IsWalkable(It.IsAny <Position>()) == true);
            var               navigator        = new Navigator(pathfinder, gridInfoProvider, Mock.Of <INaturalLineCalculator>(), Mock.Of <IRasterLineCreator>(),
                                                               Mock.Of <IUiFacade>());
            var navigationData = new NavigationData
            {
                Destination = destination,
                RemainingStepsInCurrentSegment = new Stack <Position>(new[] { destination }),
                RemainingNodes = new List <Position> {
                    destination
                },
                LastStep = currentPosition
            };

            Position         nextStep;
            NavigationResult result = navigator.ResolveNextStep(navigationData, currentPosition, out nextStep);

            result.Should().Be(NavigationResult.InProgress);
            nextStep.Should().Be(destination);
            navigationData.RemainingStepsInCurrentSegment.Should().BeEmpty();
            navigationData.LastStep.Should().Be(destination);
            navigationData.RemainingNodes.Should().BeEmpty();
        }
Exemple #5
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 #6
0
        public void ResolveNextStep_IsAtDestination_ReturnsSuccess()
        {
            var               currentPosition  = new Position(2, 2);
            IPathfinder       pathfinder       = Mock.Of <IPathfinder>();
            IGridInfoProvider gridInfoProvider = Mock.Of <IGridInfoProvider>(p => p.IsWalkable(It.IsAny <Position>()) == true);
            var               navigator        = new Navigator(pathfinder, gridInfoProvider, Mock.Of <INaturalLineCalculator>(), Mock.Of <IRasterLineCreator>(),
                                                               Mock.Of <IUiFacade>());
            var navigationData = new NavigationData
            {
                Destination = currentPosition
            };

            Position         nextStep;
            NavigationResult result = navigator.ResolveNextStep(navigationData, currentPosition, out nextStep);

            result.Should().Be(NavigationResult.Finished);
        }
Exemple #7
0
        public void ResolveNextStep_NextStepIsDestinationButUnwalkable_ReturnsUnreachable()
        {
            var               currentPosition  = new Position(2, 2);
            var               destination      = new Position(3, 2);
            IPathfinder       pathfinder       = Mock.Of <IPathfinder>();
            IGridInfoProvider gridInfoProvider = Mock.Of <IGridInfoProvider>(p => p.IsWalkable(destination) == false);
            var               navigator        = new Navigator(pathfinder, gridInfoProvider, Mock.Of <INaturalLineCalculator>(), Mock.Of <IRasterLineCreator>(),
                                                               Mock.Of <IUiFacade>());
            var navigationData = new NavigationData
            {
                Destination = destination,
                RemainingStepsInCurrentSegment = new Stack <Position>(new[] { destination, currentPosition })
            };

            Position         nextStep;
            NavigationResult result = navigator.ResolveNextStep(navigationData, currentPosition, out nextStep);

            result.Should().Be(NavigationResult.Unreachable);
        }
Exemple #8
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));
        }
Exemple #9
0
        public void ResolveNextStep_NextStepIsUnwalkableAndRecalculatingFails_ReturnsUnreachable(bool nextStepIsDestination)
        {
            var               currentPosition  = new Position(2, 2);
            var               destination      = new Position(4, 2);
            Position          plannedNextStep  = nextStepIsDestination ? destination : new Position(3, 2);
            IPathfinder       pathfinder       = Mock.Of <IPathfinder>();
            var               bresenham        = new BresenhamLineCreator();
            IGridInfoProvider gridInfoProvider = Mock.Of <IGridInfoProvider>(p => p.IsWalkable(plannedNextStep) == false);
            var               navigator        = new Navigator(pathfinder, gridInfoProvider, new NaturalLineCalculator(bresenham), bresenham,
                                                               Mock.Of <IUiFacade>());
            var navigationData = new NavigationData
            {
                Destination = destination,
                RemainingStepsInCurrentSegment = new Stack <Position>(new[] { plannedNextStep, currentPosition })
            };

            Position         nextStep;
            NavigationResult result = navigator.ResolveNextStep(navigationData, currentPosition, out nextStep);

            result.Should().Be(NavigationResult.Unreachable);
        }