Esempio n. 1
0
        public void GetCurrentTask_StartOnSideOnRoute3_ActorWalkThroughRount()
        {
            // ARRANGE


            _factActorNode = _map.Nodes.OfType <HexNode>().SelectBy(2, 6);

            _map.HoldNode(_factActorNode, _actor);

            var tacticalActUsageService = CreateTacticalActUsageService();

            var logic = new PatrolLogic(_actor,
                                        _patrolRoute3Points,
                                        _map,
                                        _actorList,
                                        _decisionSource,
                                        tacticalActUsageService);

            const int expectedStepsToPatrolPoint_3_5 = 2;
            var       expectedNode = _patrolRoute3Points.Points[2]; // третья точка маршрута



            // ACT
            for (var round = 0; round < expectedStepsToPatrolPoint_3_5; round++)
            {
                var task = logic.GetCurrentTask();

                task.Execute();
            }



            // ASSERT
            var factHexNode     = (HexNode)_factActorNode;
            var expectedHexNode = (HexNode)expectedNode;

            factHexNode.OffsetX.Should().Be(expectedHexNode.OffsetX);
            factHexNode.OffsetY.Should().Be(expectedHexNode.OffsetY);
        }
        public void GetCurrentTask_2PointsDiagonal_ReturningToStartPoint()
        {
            // ARRANGE

            const int expectedStepsToSecondPoint = 10;
            const int expectedWaiting            = 1;
            const int expectedReturningStep      = expectedStepsToSecondPoint +
                                                   expectedWaiting + 1;

            var expectedSecondPoint = _patrolRoute2DiagonalPoints.Points.Last();

            _factActorNode = _map.Nodes.OfType <HexNode>().SelectBy(0, 0);

            _map.HoldNode(_factActorNode, _actor);

            var tacticalActUsageService = CreateTacticalActUsageService();

            var logic = new PatrolLogic(_actor,
                                        _patrolRoute3Points,
                                        _map,
                                        _actorList,
                                        _decisionSource,
                                        tacticalActUsageService);



            // ACT
            for (var round = 0; round < expectedReturningStep; round++)
            {
                var task = logic.GetCurrentTask();

                task.Execute();
            }

            _factActorNode.Should().NotBe(expectedSecondPoint);
        }
        public void GetCurrentTask_2TurnWaiting_ContinueBypassAfterWaiting()
        {
            // ARRANGE

            const int doudleIdleDuration = 2;

            _factActorNode = _map.Nodes.OfType <HexNode>().SelectBy(1, 1);

            _map.HoldNode(_factActorNode, _actor);

            var expectedActorPositions = new IMapNode[] {
                _map.Nodes.OfType <HexNode>().SelectBy(2, 2),
                _map.Nodes.OfType <HexNode>().SelectBy(2, 3),
                _map.Nodes.OfType <HexNode>().SelectBy(3, 3),
                _map.Nodes.OfType <HexNode>().SelectBy(4, 3),
                _map.Nodes.OfType <HexNode>().SelectBy(5, 3),

                _map.Nodes.OfType <HexNode>().SelectBy(5, 3),
                _map.Nodes.OfType <HexNode>().SelectBy(5, 3),

                _map.Nodes.OfType <HexNode>().SelectBy(4, 3),
                _map.Nodes.OfType <HexNode>().SelectBy(4, 4),
                _map.Nodes.OfType <HexNode>().SelectBy(3, 5),

                _map.Nodes.OfType <HexNode>().SelectBy(3, 5),
                _map.Nodes.OfType <HexNode>().SelectBy(3, 5),

                _map.Nodes.OfType <HexNode>().SelectBy(3, 4),
                _map.Nodes.OfType <HexNode>().SelectBy(2, 3),
                _map.Nodes.OfType <HexNode>().SelectBy(2, 2),
                _map.Nodes.OfType <HexNode>().SelectBy(1, 1),

                _map.Nodes.OfType <HexNode>().SelectBy(1, 1),
                _map.Nodes.OfType <HexNode>().SelectBy(1, 1),
            };

            var tacticalActUsageService = CreateTacticalActUsageService();

            var decisionSourceMock = new Mock <IDecisionSource>();

            decisionSourceMock.Setup(x => x.SelectIdleDuration(It.IsAny <int>(), It.IsAny <int>()))
            .Returns(doudleIdleDuration);
            _decisionSource = decisionSourceMock.Object;

            var logic = new PatrolLogic(_actor,
                                        _patrolRoute3Points,
                                        _map,
                                        _actorList,
                                        _decisionSource,
                                        tacticalActUsageService);



            // ACT
            for (var round = 0; round < expectedActorPositions.Length + 1; round++)
            {
                var task = logic.GetCurrentTask();


                // ASSERT
                task.Should().NotBeNull();
                switch (round)
                {
                case 5:
                case 6:
                case 10:
                case 11:
                case 16:
                case 17:
                    task.Should().BeOfType <IdleTask>($"На {round} итерации ожидается задача на простой.");
                    break;

                default:
                    task.Should().BeOfType <MoveTask>($"На {round} итерации ожидается задача на перемещение.");
                    break;
                }

                task.Execute();

                if (round < expectedActorPositions.Length)
                {
                    _factActorNode.Should().Be(expectedActorPositions[round],
                                               $"На {round} итерации неожиданные координаты актёра.");
                }
                else
                {
                    _factActorNode.Should().Be(expectedActorPositions[0],
                                               $"На {round} итерации актёр должен начать маршрут заново.");
                }
            }
        }
        public void GetCurrentTask_StartOnFirstPoint_ActorWalkThroughRound()
        {
            // ARRANGE


            _factActorNode = _map.Nodes.OfType <HexNode>().SelectBy(1, 1);

            _map.HoldNode(_factActorNode, _actor);

            var expectedActorPositions = new IMapNode[] {
                _map.Nodes.OfType <HexNode>().SelectBy(2, 2),
                _map.Nodes.OfType <HexNode>().SelectBy(2, 3),
                _map.Nodes.OfType <HexNode>().SelectBy(3, 3),
                _map.Nodes.OfType <HexNode>().SelectBy(4, 3),
                _map.Nodes.OfType <HexNode>().SelectBy(5, 3),

                _map.Nodes.OfType <HexNode>().SelectBy(5, 3),

                _map.Nodes.OfType <HexNode>().SelectBy(4, 3),
                _map.Nodes.OfType <HexNode>().SelectBy(4, 4),
                _map.Nodes.OfType <HexNode>().SelectBy(3, 5),

                _map.Nodes.OfType <HexNode>().SelectBy(3, 5),

                _map.Nodes.OfType <HexNode>().SelectBy(3, 4),
                _map.Nodes.OfType <HexNode>().SelectBy(2, 3),
                _map.Nodes.OfType <HexNode>().SelectBy(2, 2),
                _map.Nodes.OfType <HexNode>().SelectBy(1, 1),

                _map.Nodes.OfType <HexNode>().SelectBy(1, 1),
            };

            var tacticalActUsageService = CreateTacticalActUsageService();

            var logic = new PatrolLogic(_actor,
                                        _patrolRoute3Points,
                                        _map,
                                        _actorList,
                                        _decisionSource,
                                        tacticalActUsageService);



            // ACT
            for (var round = 0; round < expectedActorPositions.Length + 1; round++)
            {
                var task = logic.GetCurrentTask();


                // ASSERT
                task.Should().NotBeNull();
                switch (round)
                {
                case 5:
                case 9:
                case 14:
                    task.Should().BeOfType <IdleTask>($"На {round} итерации ожидается задача на простой.");
                    break;

                default:
                    task.Should().BeOfType <MoveTask>($"На {round} итерации ожидается задача на перемещение.");
                    break;
                }

                task.Execute();

                if (round < expectedActorPositions.Length)
                {
                    _factActorNode.Should().Be(expectedActorPositions[round],
                                               $"На {round} итерации неожиданные координаты актёра.");
                }
                else
                {
                    _factActorNode.Should().Be(expectedActorPositions[0],
                                               $"На {round} итерации актёр должен начать маршрут заново.");
                }
            }
        }