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(); }
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)); }
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)); }
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(); }
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); }
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); }
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); }
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)); }
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); }