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