예제 #1
0
        public async Task IntegrationTestGetCards()
        {
            // Arrange
            NationRepository  repository        = new NationRepository(DevelopmentStorageAccountConnectionString);
            SessionRepository sessionRepository = new SessionRepository(DevelopmentStorageAccountConnectionString);
            Guid   validGuid        = new Guid("03ECAE31-CB33-4537-9E22-FE1A68BFFA08");
            Guid   dummyRegionAGuid = new Guid("FD28529F-011D-42F5-B9B2-0F7AEA80CB8A");
            Guid   dummyRegionBGuid = new Guid("A05EBB51-1BAA-4E4E-B43E-7E30EB89F5C7");
            Guid   dummyRegionCGuid = new Guid("21B47511-8376-44F1-835D-41FF3BD1A860");
            String dummyUserId      = "DummyUserId";
            await sessionRepository.SetupSession(validGuid, dummyUserId);

            CardTableEntry ownedCard = await sessionRepository.SetupAddCard(validGuid, dummyRegionAGuid, CardTableEntry.State.Owned, dummyUserId, 3);

            await sessionRepository.SetupAddCard(validGuid, dummyRegionBGuid, CardTableEntry.State.Unowned, String.Empty, 5);

            await sessionRepository.SetupAddCard(validGuid, dummyRegionCGuid, CardTableEntry.State.Discarded, dummyUserId, 7);

            // Act
            IEnumerable <ICardData> ownedCards = await repository.GetCards(validGuid, dummyUserId);

            // Assert
            Assert.IsNotNull(ownedCards);
            Assert.AreEqual(1, ownedCards.Count());
            Assert.AreEqual(dummyUserId, ownedCards.First().OwnerId);
            Assert.AreEqual(dummyRegionAGuid, ownedCards.First().RegionId);
            Assert.AreEqual(3U, ownedCards.First().Value);
            Assert.AreEqual(ownedCard.ETag, ownedCards.First().CurrentEtag);
        }
예제 #2
0
        public async Task <IEnumerable <ICard> > GetCards(Guid sessionId)
        {
            ISession session = await SessionRepository.GetSessionOrThrow(sessionId)
                               .IsUserIdJoinedOrThrow(NationRepository, User.Identity.GetUserId());

            IEnumerable <ICardData> playerCards = await NationRepository.GetCards(sessionId, User.Identity.GetUserId());

            return(playerCards.Select(card => new Card(card)));
        }
예제 #3
0
        public async Task PostCards(Guid sessionId, IEnumerable <Guid> cards)
        {
            ISession session = await SessionRepository.GetSessionOrThrow(sessionId)
                               .IsUserIdJoinedOrThrow(NationRepository, User.Identity.GetUserId())
                               .IsPhaseTypeOrThrow(SessionPhase.Reinforcements);

            Task <INationData> nationDataTask = NationRepository.GetNationOrThrow(sessionId, User.Identity.GetUserId());
            Task <IEnumerable <ICardData> > playerCardsTask = NationRepository.GetCards(sessionId, User.Identity.GetUserId());

            if (cards == null)
            {
                throw new HttpResponseException(new HttpResponseMessage {
                    StatusCode = HttpStatusCode.BadRequest, ReasonPhrase = "Invalid card(s) specified"
                });
            }

            HashSet <Guid> cardRegionIds = new HashSet <Guid>();

            foreach (Guid cardRegionId in cards)
            {
                if (cardRegionIds.Contains(cardRegionId))
                {
                    throw new HttpResponseException(new HttpResponseMessage {
                        StatusCode = HttpStatusCode.BadRequest, ReasonPhrase = "Duplicate card(s) specified"
                    });
                }
                else if (cardRegionIds.Count >= 3)
                {
                    throw new HttpResponseException(new HttpResponseMessage {
                        StatusCode = HttpStatusCode.BadRequest, ReasonPhrase = "Too many card(s) specified"
                    });
                }
                else
                {
                    cardRegionIds.Add(cardRegionId);
                }
            }

            if (cardRegionIds.Count != 3)
            {
                throw new HttpResponseException(new HttpResponseMessage {
                    StatusCode = HttpStatusCode.BadRequest, ReasonPhrase = "Too few card(s) specified"
                });
            }

            using (IBatchOperationHandle batchOperation = SessionRepository.StartBatchOperation(sessionId))
            {
                IEnumerable <ICardData> playerCards = await playerCardsTask;
                HashSet <UInt32>        seenValues  = new HashSet <UInt32>();
                foreach (ICardData card in playerCards)
                {
                    if (cardRegionIds.Contains(card.RegionId))
                    {
                        NationRepository.SetCardDiscarded(batchOperation, sessionId, card.RegionId, card.CurrentEtag);
                        seenValues.Add(card.Value);
                    }
                }

                UInt32 additionalReinforcements = 0;
                if (seenValues.Count == 1)
                {
                    additionalReinforcements = seenValues.First();
                }
                else if (seenValues.Count == 3)
                {
                    additionalReinforcements = 9;
                }
                else
                {
                    await batchOperation.Abort();

                    throw new HttpResponseException(new HttpResponseMessage {
                        StatusCode = HttpStatusCode.BadRequest, ReasonPhrase = "Invalid combination of card(s) specified"
                    });
                }

                INationData nation = await nationDataTask;
                NationRepository.SetAvailableReinforcements(batchOperation, sessionId, nation.UserId, nation.CurrentEtag, nation.AvailableReinforcements + additionalReinforcements);
                await batchOperation.CommitBatch();
            }
        }