public void GetNextPredictedCards_SortedByProbability() { AddMetaDeck("Hunter", new List <string> { "Alleycat" }); AddMetaDeck("Hunter", new List <string> { "Deadly Shot", "Bear Trap", "Alleycat" }); _metaDecks[1].Cards[0].Count = 40; _metaDecks[1].Cards[1].Count = 40; AddMetaDeck("Hunter", new List <string> { "Deadly Shot", "Alleycat", }); _metaDecks[2].Cards[0].Count = 40; var opponent = new MockOpponent("Hunter"); opponent.Mana = 1; var predictor = new Predictor(opponent, _metaDecks.AsReadOnly()); var nextPredictedCards = predictor.GetNextPredictedCards(50); Assert.AreEqual("Deadly Shot", nextPredictedCards.ElementAt(0).Card.Name); Assert.AreEqual("Deadly Shot", nextPredictedCards.ElementAt(1).Card.Name); Assert.AreEqual("Bear Trap", nextPredictedCards.ElementAt(40).Card.Name); }
public void SeparateEntriesForCreatedCards() { var opponent = new MockOpponent("Hunter"); AddMetaDeck("Hunter", new List <string> { "Alleycat" }); var controller = new PredictionController(opponent, _metaDecks.AsReadOnly()); opponent.KnownCards = CardList(new List <string> { "Alleycat" }); opponent.KnownCards[0].IsCreated = true; var info = GetPredictionInfo(controller); Assert.AreEqual(2, info.PredictedCards.Count); var originalCardInfo = info.PredictedCards[0]; Assert.AreEqual(0, originalCardInfo.NumPlayed); Assert.AreEqual(1, originalCardInfo.Card.Count); Assert.IsFalse(originalCardInfo.Card.IsCreated); var createdCardInfo = info.PredictedCards[1]; Assert.AreEqual(1, createdCardInfo.NumPlayed); Assert.AreEqual(1, createdCardInfo.Card.Count); Assert.IsTrue(createdCardInfo.Card.IsCreated); }
public void CardPlayabilityAboveAvailableManaForNextTurn() { var opponent = new MockOpponent("Hunter"); AddMetaDeck("Hunter", new List <string> { "Deadly Shot" }); var controller = new PredictionController(opponent, _metaDecks.AsReadOnly()); var info = GetPredictionInfo(controller); Assert.AreEqual(PlayableType.AboveAvailableMana, info.PredictedCards[0].Playability); }
public void UpdatesWithNoDeckIfClassMismatch() { var opponent = new MockOpponent("Hunter"); AddMetaDeck("Mage", new List <string> { }); var controller = new PredictionController(opponent, _metaDecks.AsReadOnly()); var info = GetPredictionInfo(controller); Assert.AreEqual(0, info.NumPossibleDecks); }
public void CardPlayedNotInMetaDecksIsMarkedOffMeta() { var opponent = new MockOpponent("Hunter"); opponent.KnownCards = CardList(new List <string> { "Alleycat" }); var controller = new PredictionController(opponent, _metaDecks.AsReadOnly()); var info = GetPredictionInfo(controller); Assert.IsTrue(info.PredictedCards[0].OffMeta); }
public void OnOpponentHandDiscard_CallsOnPredictionUpdate() { var opponent = new MockOpponent("Hunter"); var controller = new PredictionController(opponent, _metaDecks.AsReadOnly()); bool called = false; controller.OnPredictionUpdate.Add(prediction => called = true); controller.OnOpponentHandDiscard(null); Assert.IsTrue(called); }
public void UpdatesWithMetaDeck() { var opponent = new MockOpponent("Hunter"); AddMetaDeck("Hunter", new List <string> { "Deadly Shot" }); var controller = new PredictionController(opponent, _metaDecks.AsReadOnly()); var info = GetPredictionInfo(controller); Assert.AreEqual(1, info.NumPossibleDecks); }
public void GetPossibleDecks_MissingNonCollectibleCardDoesNotFilter() { var opponent = new MockOpponent("Hunter"); AddMetaDeck("Hunter"); var predictor = new Predictor(opponent, _metaDecks.AsReadOnly()); var hunterCard = Database.GetCardFromName("Greater Emerald Spellstone"); opponent.KnownCards.Add(hunterCard); predictor.CheckOpponentCards(); Assert.AreEqual(1, predictor.PossibleDecks.Count); }
public void OnOpponentDraw_SecondTimeDoesNotCallOnPredictionUpdate() { var opponent = new MockOpponent("Hunter"); var controller = new PredictionController(opponent, _metaDecks.AsReadOnly()); controller.OnOpponentDraw(); bool called = false; controller.OnPredictionUpdate.Add(prediction => called = true); controller.OnOpponentDraw(); Assert.IsFalse(called); }
public void JoustedCardCanBeOffMeta() { var opponent = new MockOpponent("Hunter"); AddMetaDeck("Hunter", new List <string> { }); opponent.KnownCards = CardList(new List <string> { "Alleycat" }); opponent.KnownCards[0].Jousted = true; var controller = new PredictionController(opponent, _metaDecks.AsReadOnly()); var info = GetPredictionInfo(controller); Assert.IsTrue(info.PredictedCards[0].OffMeta); }
public void GetPossibleDecks_IgnoresOffMetaCard() { var opponent = new MockOpponent("Hunter"); AddMetaDeck("Hunter", new List <string> { "Deadly Shot" }); var predictor = new Predictor(opponent, _metaDecks.AsReadOnly()); opponent.KnownCards = CardList(new List <string> { "Deadly Shot", "Alleycat" }); predictor.CheckOpponentCards(); Assert.AreEqual(1, predictor.PossibleDecks.Count); }
public void GetPredictedCard_ProbabilityReturnsToOneAfterSecondDeckFiltered() { AddMetaDeck("Hunter", new List <string> { "Hunter's Mark", "Alleycat" }); AddMetaDeck("Hunter", new List <string> { "Alleycat", "Tracking" }); var opponent = new MockOpponent("Hunter"); var predictor = new Predictor(opponent, _metaDecks.AsReadOnly()); opponent.KnownCards.Add(Database.GetCardFromName("Tracking")); predictor.CheckOpponentCards(); Assert.AreEqual(1, predictor.GetPredictedCard(Key("Tracking", 1)).Probability); }
public void JoustedCardsAreAddedButPlayedCountIsZero() { var opponent = new MockOpponent("Hunter"); AddMetaDeck("Hunter", new List <string> { }); opponent.KnownCards = CardList(new List <string> { "Alleycat" }); opponent.KnownCards[0].Jousted = true; var controller = new PredictionController(opponent, _metaDecks.AsReadOnly()); var info = GetPredictionInfo(controller); Assert.AreEqual(0, info.PredictedCards[0].NumPlayed); }
public void MarksCardsAlreadyPlayed() { var opponent = new MockOpponent("Hunter"); AddMetaDeck("Hunter", new List <string> { "Alleycat" }); var controller = new PredictionController(opponent, _metaDecks.AsReadOnly()); opponent.KnownCards = CardList(new List <string> { "Alleycat" }); var info = GetPredictionInfo(controller); Assert.AreEqual(1, info.PredictedCards[0].NumPlayed); }
public void GetPredictedCards_FewerAfterDeckFiltered() { AddMetaDeck("Hunter", new List <string> { "Deadly Shot", "Alleycat" }); AddMetaDeck("Hunter", new List <string> { "Deadly Shot", "Bear Trap" }); var opponent = new MockOpponent("Hunter"); var predictor = new Predictor(opponent, _metaDecks.AsReadOnly()); opponent.KnownCards.Add(Database.GetCardFromName("Alleycat")); predictor.CheckOpponentCards(); Assert.AreEqual(2, predictor.PredictedCards.Count); }
public void GetNextPredictedCards_TruncatesLeftoverCards() { AddMetaDeck("Hunter", new List <string> { "Alleycat" }); AddMetaDeck("Hunter", new List <string> { "Deadly Shot", "Alleycat" }); _metaDecks[1].Cards[0].Count = 40; var opponent = new MockOpponent("Hunter"); opponent.Mana = 1; var predictor = new Predictor(opponent, _metaDecks.AsReadOnly()); Assert.AreEqual(10, predictor.GetNextPredictedCards(10).Count); }
public void GetPredictedCards_SortedSecondaryByLowerManaCost() { AddMetaDeck("Hunter", new List <string> { "Bear Trap", "Alleycat" }); AddMetaDeck("Hunter", new List <string> { "Alleycat", "Tracking" }); var opponent = new MockOpponent("Hunter"); opponent.Mana = 2; var predictor = new Predictor(opponent, _metaDecks.AsReadOnly()); var firstPredictedCard = predictor.PredictedCards.ElementAt(1); Assert.AreEqual("Tracking", firstPredictedCard.Card.Name); }
public void CheckOpponentCards_MissingCardFiltersDeck() { var opponent = new MockOpponent("Hunter"); AddMetaDeck("Hunter", new List <string> { "Deadly Shot" }); AddMetaDeck("Hunter", new List <string> { "Alleycat" }); var predictor = new Predictor(opponent, _metaDecks.AsReadOnly()); opponent.KnownCards.Add(Database.GetCardFromName("Deadly Shot")); predictor.CheckOpponentCards(); Assert.AreEqual(1, predictor.PossibleDecks.Count); }
public void UpdatesWithFullCardList() { var opponent = new MockOpponent("Hunter"); AddMetaDeck("Hunter", new List <string> { "Deadly Shot", "Alleycat", "Bear Trap" }); var controller = new PredictionController(opponent, _metaDecks.AsReadOnly()); var info = GetPredictionInfo(controller); CollectionAssert.AreEqual(CardList(new List <string> { "Deadly Shot", "Alleycat", "Bear Trap" }), CardsFromInfo(info)); }
public void SortEntriesByCreated() { var opponent = new MockOpponent("Hunter"); AddMetaDeck("Hunter", new List <string> { "Bear Trap" }); var controller = new PredictionController(opponent, _metaDecks.AsReadOnly()); opponent.KnownCards = CardList(new List <string> { "Bear Trap", "Bear Trap" }); opponent.KnownCards[0].IsCreated = true; var info = GetPredictionInfo(controller); Assert.IsFalse(info.PredictedCards[0].Card.IsCreated); }
public void SecondOffMetaCardIncludedInPrediction() { AddMetaDeck("Hunter", new List <string> { "Alleycat" }); var opponent = new MockOpponent("Hunter"); opponent.KnownCards = CardList(new List <string> { "Alleycat" }, new List <int> { 2 }); var controller = new PredictionController(opponent, _metaDecks.AsReadOnly()); var info = GetPredictionInfo(controller); Assert.AreEqual(2, info.PredictedCards[0].Card.Count); }
public void GetPredictedCards_DoesNotIncludeCardsBelowThresholdIfNotPlayableYet() { AddMetaDeck("Hunter", new List <string> { "Alleycat" }); AddMetaDeck("Hunter", new List <string> { "Deadly Shot", "Alleycat" }); var opponent = new MockOpponent("Hunter"); opponent.Mana = 1; var predictor = new Predictor(opponent, _metaDecks.AsReadOnly()); // Deadly Shot only has a 50% chance and can't be played next turn. Assert.AreEqual(1, predictor.PredictedCards.Count); Assert.AreEqual("Alleycat", predictor.PredictedCards[0].Card.Name); }
public void SortEntriesByManaCost() { var opponent = new MockOpponent("Hunter"); AddMetaDeck("Hunter", new List <string> { "Alleycat" }); var controller = new PredictionController(opponent, _metaDecks.AsReadOnly()); opponent.KnownCards = CardList(new List <string> { "Bear Trap" }); opponent.KnownCards[0].IsCreated = true; var info = GetPredictionInfo(controller); Assert.AreEqual("Alleycat", info.PredictedCards[0].Card.Name); }
public void GetPossibleDecks_MatchingCardDoesNotFilter() { var opponent = new MockOpponent("Hunter"); AddMetaDeck("Hunter", new List <string> { "Deadly Shot" }); AddMetaDeck("Hunter", new List <string> { "Deadly Shot", "Alleycat" }); var predictor = new Predictor(opponent, _metaDecks.AsReadOnly()); var hunterCard = Database.GetCardFromName("Deadly Shot"); opponent.KnownCards.Add(hunterCard); predictor.CheckOpponentCards(); Assert.AreEqual(2, predictor.PossibleDecks.Count); }
public void GetPredictedCards_SameAsFirstDeckAfterSecondFiltered() { AddMetaDeck("Hunter", new List <string> { "Hunter's Mark", "Alleycat" }); AddMetaDeck("Hunter", new List <string> { "Alleycat", "Tracking" }); var opponent = new MockOpponent("Hunter"); var predictor = new Predictor(opponent, _metaDecks.AsReadOnly()); opponent.KnownCards.Add(Database.GetCardFromName("Tracking")); predictor.CheckOpponentCards(); Assert.AreEqual(2, predictor.PredictedCards.Count); Assert.IsNotNull(predictor.GetPredictedCard(Key("Alleycat", 1))); Assert.IsNotNull(predictor.GetPredictedCard(Key("Tracking", 1))); }
public void GetPredictedCards_LessThanDeckSizeIfAtSameProbabilityAndTooExpensive() { AddMetaDeck("Hunter", new List <string> { "Alleycat" }); AddMetaDeck("Hunter", new List <string> { "Deadly Shot", "Alleycat" }); _metaDecks[1].Cards[0].Count = 40; var opponent = new MockOpponent("Hunter"); opponent.Mana = 1; var predictor = new Predictor(opponent, _metaDecks.AsReadOnly()); // All the Deadly Shots are at the same probability and can't yet be played, // so don't include any of them. Assert.AreEqual(1, predictor.PredictedCards.Count); }
public void GetPredictedCards_DoesNotIncludeCardWithLowProbability() { for (int n = 0; n < 9; n++) { AddMetaDeck("Hunter", new List <string> { "Alleycat" }); } AddMetaDeck("Hunter", new List <string> { "Tracking", "Alleycat" }); var opponent = new MockOpponent("Hunter"); var predictor = new Predictor(opponent, _metaDecks.AsReadOnly()); // Deadly Shot only has a 10% chance and won't be included. Assert.AreEqual(1, predictor.PredictedCards.Count); Assert.AreEqual("Alleycat", predictor.PredictedCards[0].Card.Name); }
public void GetPredictedCards_IncludeCardIfPlayable() { AddMetaDeck("Hunter", new List <string> { "Alleycat" }); AddMetaDeck("Hunter", new List <string> { "Deadly Shot", "Alleycat" }); var opponent = new MockOpponent("Hunter"); var predictor = new Predictor(opponent, _metaDecks.AsReadOnly()); predictor.ProbabilityIncludeIfPlayable = .50m; opponent.Mana = 5; predictor.CheckOpponentMana(); // Deadly Shot has a 50% chance and is playable. Assert.AreEqual(2, predictor.PredictedCards.Count); }
public void AddsInCardsNotInMetaDecks() { var opponent = new MockOpponent("Hunter"); AddMetaDeck("Hunter", new List <string> { }); var controller = new PredictionController(opponent, _metaDecks.AsReadOnly()); opponent.KnownCards = CardList(new List <string> { "Alleycat" }); var info = GetPredictionInfo(controller); CollectionAssert.AreEqual(CardList(new List <string> { "Alleycat" }), CardsFromInfo(info)); Assert.AreEqual(1, info.PredictedCards[0].NumPlayed); }
public void OnTurnStart_DoesNotUpdateAvailableManaOnOpponentTurn() { var opponent = new MockOpponent("Hunter"); opponent.Mana = 1; AddMetaDeck("Hunter", new List <string> { "Alleycat" }); AddMetaDeck("Hunter", new List <string> { "Alleycat", "Bear Trap" }); var controller = new PredictionController(opponent, _metaDecks.AsReadOnly()); opponent.Mana = 2; controller.OnTurnStart(ActivePlayer.Opponent); var info = GetPredictionInfo(controller); Assert.AreEqual(1, info.PredictedCards.Count); }