Beispiel #1
0
        public void IntentOpenContainer_SetContainerAndMethod_ReturnsTask()
        {
            //ARRANGE
            var map = new TestGridGenMap();

            var startNode = map.Nodes.Cast <HexNode>().SelectBy(0, 0);

            var actor = CreateActor(map, startNode);

            var taskSource = InitTaskSource(actor);

            var actorManager = CreateActorManager(actor);

            var containerMock = new Mock <IPropContainer>();
            var container     = containerMock.Object;

            var methodMock = new Mock <IOpenContainerMethod>();
            var method     = methodMock.Object;

            var intention = new Intention <OpenContainerTask>(a => new OpenContainerTask(a, container, method));



            // ACT
            var tasks = SetHumanIntention(actor, taskSource, intention);



            // ASSERT
            tasks.Should().NotBeNullOrEmpty();
            tasks[0].Should().BeOfType <OpenContainerTask>();
        }
Beispiel #2
0
        public void Intent_TargetToStartPoint_GenerateMoveCommand()
        {
            // ARRANGE

            var map = new TestGridGenMap();

            var startNode = map.Nodes.Cast <HexNode>().SelectBy(3, 3);

            var actor = CreateActor(map, startNode);

            var taskSource = InitTaskSource(actor);

            var moveIntention = new MoveIntention(startNode, map);



            // ACT
            var tasks = SetHumanIntention(actor, taskSource, moveIntention);



            // ASSERT
            tasks.Should().NotBeNullOrEmpty();
            tasks[0].Should().BeOfType <MoveTask>();
        }
Beispiel #3
0
        public void Execute_ValidLength_ActorOpenedContainer()
        {
            // ARRANGE
            var map = new TestGridGenMap();

            var actorNode = map.Nodes.Cast <HexNode>().SelectBy(0, 0);

            var actorMock = new Mock <IActor>();

            actorMock.SetupGet(x => x.Node).Returns(actorNode);
            var actor = actorMock.Object;

            var containerNode = map.Nodes.Cast <HexNode>().SelectBy(1, 0);

            var container = CreateContainer(containerNode);

            var method = CreateMethod();

            var task = new OpenContainerTask(actor, container, method);



            // ACT
            task.Execute();



            // ASSERT
            actorMock.Verify(x => x.OpenContainer(It.IsAny <IPropContainer>(), It.IsAny <IOpenContainerMethod>()));
        }
Beispiel #4
0
        public void IntentAttack_SetTarget_ReturnsAttackTask()
        {
            //ARRANGE
            var usageService = _container.GetInstance <ITacticalActUsageService>();

            var map = new TestGridGenMap();

            var attackerStartNode = map.Nodes.Cast <HexNode>().SelectBy(3, 3);
            var targetStartNode   = map.Nodes.Cast <HexNode>().SelectBy(2, 3);


            var attackerActor = CreateActor(map, attackerStartNode);
            var targetActor   = CreateActor(map, targetStartNode);

            var taskSource = InitTaskSource(attackerActor);

            var actorManager = CreateActorManager(attackerActor, targetActor);

            var attackIntention = new Intention <AttackTask>(a => new AttackTask(a, targetActor, usageService));



            // ACT
            var tasks = SetHumanIntention(attackerActor, taskSource, attackIntention);



            // ASSERT
            tasks.Should().NotBeNullOrEmpty();
            tasks[0].Should().BeOfType <AttackTask>();
        }
Beispiel #5
0
        public void CreateSector(int mapSize)
        {
            var map = new TestGridGenMap(mapSize);

            Container.Register <IMap>(factory => map, new PerContainerLifetime());
            Container.Register <ISector, Sector>(new PerContainerLifetime());

            // Это нужно для того, чтобы объкт был создан и выполнился код из конструктора.
            // Там обработка на события внутренних сервисов.
            var sector = Container.GetInstance <ISector>();
        }
Beispiel #6
0
        public void Intent_AssignAfterTaskComplete_NoNullCommand()
        {
            // ARRANGE

            var map = new TestGridGenMap();

            var startNode   = map.Nodes.Cast <HexNode>().SelectBy(3, 3);
            var finishNode  = map.Nodes.Cast <HexNode>().SelectBy(1, 5);
            var finishNode2 = map.Nodes.Cast <HexNode>().SelectBy(3, 2);

            var actor = CreateActor(map, startNode);

            var taskSource = InitTaskSource(actor);

            var actorManager = CreateActorManager(actor);

            var moveIntention  = new MoveIntention(finishNode, map);
            var moveIntention2 = new MoveIntention(finishNode2, map);

            // ACT


            // 1. Ждём, пока задача на перемещение не отработает.
            // В конце текущая задача актёра будет IsComplete.
            var tasks = SetHumanIntention(actor, taskSource, moveIntention);

            for (var i = 0; i < 3; i++)
            {
                foreach (var task in tasks)
                {
                    task.Execute();
                }
            }

            foreach (var task in tasks)
            {
                task.IsComplete.Should().Be(true);
            }


            // 2. Указываем намерение на ещё одну задачу.
            var factTasks = SetHumanIntention(actor, taskSource, moveIntention2);



            // ASSERT
            factTasks.Should().NotBeNullOrEmpty();
        }
Beispiel #7
0
        public void Intent_AssignTaskBeforeCurrentTaskComplete_NoNullCommand()
        {
            // ARRANGE

            var map = new TestGridGenMap();

            var startNode   = map.Nodes.Cast <HexNode>().SelectBy(3, 3);
            var finishNode  = map.Nodes.Cast <HexNode>().SelectBy(1, 5);
            var finishNode2 = map.Nodes.Cast <HexNode>().SelectBy(3, 2);

            var actor = CreateActor(map, startNode);

            var taskSource = InitTaskSource(actor);

            var actorManager = CreateActorManager(actor);

            var moveIntention  = new MoveIntention(finishNode, map);
            var moveIntention2 = new MoveIntention(finishNode2, map);


            // ACT

            // 1. Продвигаем выполнение текущего намерения. НО НЕ ДО ОКОНЧАНИЯ.
            var tasks = SetHumanIntention(actor, taskSource, moveIntention);

            for (var i = 0; i < 1; i++)
            {
                foreach (var task in tasks)
                {
                    task.Execute();
                }
            }

            foreach (var task in tasks)
            {
                task.IsComplete.Should().Be(false);
            }


            // 2. Указываем другое намерение до того, как текущая задача на перемещение выполнена до конца.
            var factTasks = SetHumanIntention(actor, taskSource, moveIntention2);



            // ASSERT
            factTasks.Should().NotBeNullOrEmpty();
        }
Beispiel #8
0
        public void ExecuteTest_OpenGridMap_ActorReachPointAndTaskComplete()
        {
            // ARRANGE
            var map = new TestGridGenMap();

            var startNode  = map.Nodes.Cast <HexNode>().SelectBy(3, 3);
            var finishNode = map.Nodes.Cast <HexNode>().SelectBy(1, 5);

            var expectedPath = new[] {
                map.Nodes.Cast <HexNode>().SelectBy(2, 3),
                map.Nodes.Cast <HexNode>().SelectBy(2, 4),
                finishNode
            };

            var actor = CreateActor(map, startNode);

            var task = new MoveTask(actor, finishNode, map);


            // ACT
            for (var step = 1; step <= expectedPath.Count(); step++)
            {
                task.Execute();



                // ASSERT
                var expectedIsComplete = step >= 3;
                task.IsComplete.Should().Be(expectedIsComplete);


                actor.Node.Should().Be(expectedPath[step - 1]);
            }



            // ASSERT

            task.IsComplete.Should().Be(true);
            actor.Node.Should().Be(finishNode);
        }
Beispiel #9
0
        public void Intent_SetNullTarget_ThrownException()
        {
            // ARRANGE

            var map = new TestGridGenMap();

            var startNode = map.Nodes.Cast <HexNode>().SelectBy(3, 3);

            var actor = CreateActor(map, startNode);

            var taskSource = InitTaskSource(actor);



            // ACT
            Action act = () => { taskSource.Intent(null); };



            // ASSERT
            act.Should().Throw <ArgumentException>();
        }
Beispiel #10
0
        public void AttackTaskTest()
        {
            // ARRANGE
            // Подготовка. Два актёра через клетку. Радиус действия 1-2, достаёт.
            var testMap = new TestGridGenMap(3);

            var actMock = new Mock <ITacticalAct>();

            actMock.SetupGet(x => x.Stats).Returns(new TacticalActStatsSubScheme
            {
                Range = new Range <int>(1, 2)
            });
            var act = actMock.Object;

            var actCarrierMock = new Mock <ITacticalActCarrier>();

            actCarrierMock.SetupGet(x => x.Acts)
            .Returns(new ITacticalAct[] { act });
            var actCarrier = actCarrierMock.Object;

            var personMock = new Mock <IPerson>();

            personMock.SetupGet(x => x.TacticalActCarrier).Returns(actCarrier);
            var person = personMock.Object;

            var actorMock = new Mock <IActor>();
            var actorNode = testMap.Nodes.OfType <HexNode>().SelectBy(0, 0);

            actorMock.SetupGet(x => x.Node).Returns(actorNode);
            actorMock.SetupGet(x => x.Person).Returns(person);
            actorMock.Setup(x => x.UseAct(It.IsAny <IAttackTarget>(), It.IsAny <ITacticalAct>()))
            .Raises <IAttackTarget, ITacticalAct>(x => x.UsedAct += null, (target1, act1) => new UsedActEventArgs(target1, act1));
            var actor = actorMock.Object;


            var targetMock = new Mock <IActor>();
            var targetNode = testMap.Nodes.OfType <HexNode>().SelectBy(2, 0);

            targetMock.Setup(x => x.CanBeDamaged()).Returns(true);
            targetMock.SetupGet(x => x.Node).Returns(targetNode);
            var target = targetMock.Object;

            var actServiceMock = new Mock <ITacticalActUsageService>();
            var actService     = actServiceMock.Object;


            // Создаём саму команду
            var attackTask = new AttackTask(actor, target, actService);


            using (var monitor = actor.Monitor())
            {
                // ACT
                attackTask.Execute();



                // ASSERT
                monitor.Should().Raise(nameof(IActor.UsedAct));
            }
        }
Beispiel #11
0
        public void SetUp()
        {
            _container = new ServiceContainer();

            var testMap = new TestGridGenMap(3);

            var sectorMock = new Mock <ISector>();

            sectorMock.SetupGet(x => x.Map).Returns(testMap);
            var sector = sectorMock.Object;

            var sectorManagerMock = new Mock <ISectorManager>();

            sectorManagerMock.SetupProperty(x => x.CurrentSector, sector);
            var sectorManager = sectorManagerMock.Object;

            var actMock = new Mock <ITacticalAct>();

            actMock.SetupGet(x => x.Stats).Returns(new TacticalActStatsSubScheme
            {
                Range = new Range <int>(1, 2)
            });
            var act = actMock.Object;

            var actCarrierMock = new Mock <ITacticalActCarrier>();

            actCarrierMock.SetupGet(x => x.Acts)
            .Returns(new[] { act });
            var actCarrier = actCarrierMock.Object;

            var equipmentCarrierMock = new Mock <IEquipmentCarrier>();

            equipmentCarrierMock.SetupGet(x => x.Slots).Returns(new[] { new PersonSlotSubScheme {
                                                                            Types = EquipmentSlotTypes.Hand
                                                                        } });
            var equipmentCarrier = equipmentCarrierMock.Object;

            var personMock = new Mock <IPerson>();

            personMock.SetupGet(x => x.TacticalActCarrier).Returns(actCarrier);
            personMock.SetupGet(x => x.EquipmentCarrier).Returns(equipmentCarrier);
            var person = personMock.Object;

            var actorMock = new Mock <IActor>();
            var actorNode = testMap.Nodes.OfType <HexNode>().SelectBy(0, 0);

            actorMock.SetupGet(x => x.Node).Returns(actorNode);
            actorMock.SetupGet(x => x.Person).Returns(person);
            var actor = actorMock.Object;

            var actorVmMock = new Mock <IActorViewModel>();

            actorVmMock.SetupProperty(x => x.Actor, actor);
            var actorVm = actorVmMock.Object;

            var humanTaskSourceMock = new Mock <IHumanActorTaskSource>();
            var humanTaskSource     = humanTaskSourceMock.Object;

            var playerStateMock = new Mock <IPlayerState>();

            playerStateMock.SetupProperty(x => x.ActiveActor, actorVm);
            playerStateMock.SetupProperty(x => x.TaskSource, humanTaskSource);
            var playerState = playerStateMock.Object;

            var gameLoopMock = new Mock <IGameLoop>();
            var gameLoop     = gameLoopMock.Object;

            var usageServiceMock = new Mock <ITacticalActUsageService>();
            var usageService     = usageServiceMock.Object;

            _container.Register(factory => sectorManager, new PerContainerLifetime());
            _container.Register(factory => humanTaskSourceMock, new PerContainerLifetime());
            _container.Register(factory => playerState, new PerContainerLifetime());
            _container.Register(factory => gameLoop, new PerContainerLifetime());
            _container.Register(factory => usageService, new PerContainerLifetime());

            RegisterSpecificServices(testMap, playerStateMock);
        }