public void TestMethod1() { var data = TestData.Load("LogTests/TestData/data_1.json"); var events = new Dictionary <string, object>(); var gameData = new MockGameData(new MatchInfo() { LocalPlayer = data.LocalPlayer.ToMatchInfoPlayer(), OpposingPlayer = data.OpposingPlayer.ToMatchInfoPlayer() }, new GameServerInfo()); var logInput = new MockLogInput(); var game = new Game(gameData); var mgr = new GameEventManager(game, logInput, gameData); game.GameCreated += args => { events["created"] = true; args.Game.LocalPlayer.Deck = new Hearthstone.Deck(DeckType.Constructed, HearthDb.Deckstrings.DeckSerializer.Deserialize(data.LocalPlayer.Deck)); }; game.GameStateEvents.GameStateChanged += args => { if (args.Modifier is TagChange t) { if (t.Tag == GameTag.MULLIGAN_STATE && args.State.IsMulliganDone) { events["t0_local_hand"] = args.State.LocalPlayer.InHand.Select(x => x.CardId).ToList(); events["t0_opposing_hand"] = args.State.OpposingPlayer.InHand.Select(x => x.CardId).ToList(); } if (t.Tag == GameTag.ZONE && (t.PreviousValue == (int)Zone.DECK || t.Value == (int)Zone.DECK) && t.EntityId.HasValue && args.State.SetupComplete) { if (args.State.Entities[t.EntityId.Value].IsControlledBy(args.State.LocalPlayer.PlayerId)) { Assert.AreEqual(args.State.LocalPlayer.InDeck.Count(), args.State.LocalPlayer.GetRemainingCards().Sum(x => x.Count)); } } } }; game.GameStarted += args => events["started"] = true; //TODO move test data to separate repo logInput.Read(data.LogFile); Assert.AreEqual(true, events["created"]); Assert.AreEqual(true, events["started"]); var localHand = events["t0_local_hand"] as List <string>; Assert.IsNotNull(localHand); Assert.AreEqual(3, localHand.Count); Assert.IsTrue(localHand.All(x => !string.IsNullOrEmpty(x))); var opposingHand = events["t0_opposing_hand"] as List <string>; Assert.IsNotNull(opposingHand); Assert.AreEqual(5, opposingHand.Count); Assert.IsTrue(opposingHand.All(string.IsNullOrEmpty)); }
public void TestMethod1() { var data = TestData.Load("LogTests/TestData/dungeonrun_1.json"); var events = new Dictionary <string, object>(); var gameData = new MockGameData(new MatchInfo() { LocalPlayer = data.LocalPlayer.ToMatchInfoPlayer(), OpposingPlayer = data.OpposingPlayer.ToMatchInfoPlayer() }, new GameServerInfo()); var logInput = new MockLogInput(); var game = new Game(gameData); var mgr = new GameEventManager(game, logInput, gameData); var localPlayerDeck = new Hearthstone.Deck(DeckType.DungeonRun, "Dungeon Run", CardClass.PRIEST, data.LocalPlayer.DeckCards); game.GameCreated += args => args.Game.LocalPlayer.Deck = localPlayerDeck; game.GameStateEvents.TagChange += args => { if (args.Data.Tag == GameTag.MULLIGAN_STATE && args.Data.Value == (int)Mulligan.DONE && args.Data.EntityId == args.GameState.LocalPlayerEntity.Id) { events["t1"] = true; Assert.AreEqual(10, args.GameState.LocalPlayer.InDeck.Count()); Assert.AreEqual(3, args.GameState.LocalPlayer.InHand.Count()); foreach (var entity in args.GameState.LocalPlayer.InDeck) { Assert.IsFalse(entity.IsCreated, $"Found created entity in the deck: {entity}"); } foreach (var entity in args.GameState.LocalPlayer.InHand) { Assert.IsFalse(entity.IsCreated, $"Found created entity in the hand: {entity}"); } } }; logInput.Read(data.LogFile); foreach (var turn in new[] { "t1" }) { Assert.AreEqual(true, events[turn]); } }
public void Secrets3() { var data = TestData.Load("LogTests/TestData/secrets_3.json"); var events = new Dictionary <string, object>(); var gameData = new MockGameData(new MatchInfo() { LocalPlayer = data.LocalPlayer.ToMatchInfoPlayer(), OpposingPlayer = data.OpposingPlayer.ToMatchInfoPlayer() }, new GameServerInfo()); var logInput = new MockLogInput(); var game = new Game(gameData); var mgr = new GameEventManager(game, logInput, gameData); game.GameStateEvents.TagChange += args => { if (args.Data.Tag == GameTag.TURN) { var secrets = game.CurrentGame.SecretsManager.GetSecrets(game.CurrentGame.LocalPlayer.PlayerId).ToList(); switch (args.Data.Value) { case 12: { events["t12"] = true; //TODO break; } } } }; logInput.Read(data.LogFile); foreach (var turn in new[] { "t12" }) { Assert.AreEqual(true, events[turn]); } }
public void Secrets2() { var data = TestData.Load("LogTests/TestData/secrets_2.json"); var events = new Dictionary <string, object>(); var gameData = new MockGameData(new MatchInfo() { LocalPlayer = data.LocalPlayer.ToMatchInfoPlayer(), OpposingPlayer = data.OpposingPlayer.ToMatchInfoPlayer() }, new GameServerInfo()); var logInput = new MockLogInput(); var game = new Game(gameData); var mgr = new GameEventManager(game, logInput, gameData); game.GameStateEvents.TagChange += args => { if (args.Data.Tag == GameTag.TURN) { var secrets = game.CurrentGame.SecretsManager.GetSecrets(game.CurrentGame.LocalPlayer.PlayerId).ToList(); switch (args.Data.Value) { case 12: { events["t12"] = true; Assert.AreEqual(3, secrets.Count); var iceBlock = secrets.ElementAt(0); var explosiveRune = secrets.ElementAt(1); var potionOfPolymorph = secrets.ElementAt(2); Assert.AreEqual(12, explosiveRune.RemainingSecrets.Count); Assert.AreEqual(12, potionOfPolymorph.RemainingSecrets.Count); break; } case 14: { // Minion played, Explosive Runes triggered because it was played first // can still be polymorph events["t14"] = true; Assert.AreEqual(2, secrets.Count); var iceBlock = secrets.ElementAt(0); var potionOfPolymorph = secrets.ElementAt(1); Assert.IsTrue(potionOfPolymorph.RemainingSecrets.SequenceEqual(new[] { Mage.Effigy, Mage.PotionOfPolymorph, Mage.Counterspell, Mage.IceBarrier, Mage.MirrorEntity, Mage.IceBlock, Mage.Vaporize, Mage.Duplicate, Mage.FrozenClone, Mage.Spellbender, Mage.ManaBind }), string.Join("\n", potionOfPolymorph.RemainingSecrets.Select(x => Cards.All[x].Name))); break; } } } }; logInput.Read(data.LogFile); foreach (var turn in new[] { "t12", "t14" }) { Assert.AreEqual(true, events[turn]); } }
public void Secrets1() { var data = TestData.Load("LogTests/TestData/secrets_1.json"); var events = new Dictionary <string, object>(); var gameData = new MockGameData(new MatchInfo() { LocalPlayer = data.LocalPlayer.ToMatchInfoPlayer(), OpposingPlayer = data.OpposingPlayer.ToMatchInfoPlayer() }, new GameServerInfo()); var logInput = new MockLogInput(); var game = new Game(gameData); var mgr = new GameEventManager(game, logInput, gameData); game.GameStateEvents.TagChange += args => { if (args.Data.Tag == GameTag.TURN) { var secrets = game.CurrentGame.SecretsManager.GetSecrets(game.CurrentGame.LocalPlayer.PlayerId).ToList(); switch (args.Data.Value) { case 5: events["t5"] = true; Assert.AreEqual(0, secrets.Count); break; case 6: events["t6"] = true; Assert.AreEqual(1, secrets.Count); Assert.AreEqual(12, secrets.Single().PossibleSecrets.Count); Assert.IsTrue(secrets.Single().RemainingSecrets.SequenceEqual(new[] { Mage.Effigy, Mage.PotionOfPolymorph, Mage.Counterspell, Mage.IceBarrier, Mage.MirrorEntity, Mage.IceBlock, Mage.Vaporize, Mage.Duplicate, Mage.FrozenClone, Mage.ExplosiveRunes, Mage.Spellbender, Mage.ManaBind }), string.Join("\n", secrets.Single().RemainingSecrets.Select(x => Cards.All[x].Name))); break; case 8: { events["t8"] = true; Assert.AreEqual(2, secrets.Count); var iceBlock = secrets.ElementAt(0); var counterSpell = secrets.ElementAt(1); Assert.IsTrue(iceBlock.RemainingSecrets.SequenceEqual(new[] { Mage.Effigy, Mage.PotionOfPolymorph, Mage.MirrorEntity, Mage.IceBlock, Mage.Duplicate, Mage.FrozenClone, Mage.ExplosiveRunes, }), string.Join("\n", iceBlock.RemainingSecrets.Select(x => Cards.All[x].Name))); Assert.AreEqual(12, counterSpell.PossibleSecrets.Count); Assert.AreEqual(12, counterSpell.RemainingSecrets.Count); break; } case 10: { events["t10"] = true; Assert.AreEqual(3, secrets.Count); var iceBlock = secrets.ElementAt(0); var counterSpell = secrets.ElementAt(1); var frozenClone = secrets.ElementAt(2); Assert.IsTrue(iceBlock.RemainingSecrets.SequenceEqual(new[] { Mage.Effigy, Mage.IceBlock, Mage.Duplicate, }), string.Join("\n", iceBlock.RemainingSecrets.Select(x => Cards.All[x].Name))); Assert.IsTrue(counterSpell.RemainingSecrets.SequenceEqual(new[] { Mage.Effigy, Mage.Counterspell, Mage.IceBlock, Mage.Duplicate, Mage.Spellbender, Mage.ManaBind }), string.Join("\n", iceBlock.RemainingSecrets.Select(x => Cards.All[x].Name))); Assert.AreEqual(12, frozenClone.RemainingSecrets.Count); break; } case 12: { events["t12"] = true; Assert.AreEqual(2, secrets.Count); var iceBlock = secrets.ElementAt(0); var counterSpell = secrets.ElementAt(1); Assert.IsTrue(iceBlock.RemainingSecrets.SequenceEqual(new[] { Mage.IceBlock, }), string.Join("\n", iceBlock.RemainingSecrets.Select(x => Cards.All[x].Name))); Assert.IsTrue(counterSpell.RemainingSecrets.SequenceEqual(new[] { Mage.Counterspell, Mage.IceBlock, Mage.Spellbender, Mage.ManaBind }), string.Join("\n", iceBlock.RemainingSecrets.Select(x => Cards.All[x].Name))); break; } case 14: { events["t14"] = true; Assert.AreEqual(4, secrets.Count); var iceBlock = secrets.ElementAt(0); var counterSpell = secrets.ElementAt(1); var potionOfPolymorph = secrets.ElementAt(2); var frozenClone = secrets.ElementAt(3); Assert.IsTrue(iceBlock.RemainingSecrets.SequenceEqual(new[] { Mage.IceBlock, }), string.Join("\n", iceBlock.RemainingSecrets.Select(x => Cards.All[x].Name))); Assert.IsTrue(counterSpell.RemainingSecrets.SequenceEqual(new[] { Mage.Counterspell, Mage.IceBlock, Mage.Spellbender, Mage.ManaBind }), string.Join("\n", iceBlock.RemainingSecrets.Select(x => Cards.All[x].Name))); Assert.AreEqual(12, potionOfPolymorph.RemainingSecrets.Count); Assert.AreEqual(12, frozenClone.RemainingSecrets.Count); break; } case 16: { events["t16"] = true; Assert.AreEqual(4, secrets.Count); var iceBlock = secrets.ElementAt(0); var counterSpell = secrets.ElementAt(1); var iceBarrier = secrets.ElementAt(2); var manaBind = secrets.ElementAt(3); Assert.IsTrue(iceBlock.RemainingSecrets.SequenceEqual(new[] { Mage.IceBlock, }), string.Join("\n", iceBlock.RemainingSecrets.Select(x => Cards.All[x].Name))); Assert.IsTrue(counterSpell.RemainingSecrets.SequenceEqual(new[] { Mage.Counterspell, Mage.IceBlock, Mage.Spellbender, Mage.ManaBind }), string.Join("\n", iceBlock.RemainingSecrets.Select(x => Cards.All[x].Name))); Assert.AreEqual(12, iceBarrier.RemainingSecrets.Count); Assert.AreEqual(12, manaBind.RemainingSecrets.Count); break; } case 18: { events["t18"] = true; Assert.AreEqual(4, secrets.Count); var iceBlock = secrets.ElementAt(0); var counterSpell = secrets.ElementAt(1); var manaBind = secrets.ElementAt(2); var iceBarrier = secrets.ElementAt(3); Assert.IsTrue(iceBlock.RemainingSecrets.SequenceEqual(new[] { Mage.IceBlock, }), string.Join("\n", iceBlock.RemainingSecrets.Select(x => Cards.All[x].Name))); Assert.IsTrue(counterSpell.RemainingSecrets.SequenceEqual(new[] { Mage.Counterspell, Mage.IceBlock, Mage.Spellbender, Mage.ManaBind }), string.Join("\n", iceBlock.RemainingSecrets.Select(x => Cards.All[x].Name))); Assert.IsTrue(manaBind.RemainingSecrets.SequenceEqual(new[] { Mage.Counterspell, Mage.IceBlock, Mage.Spellbender, Mage.ManaBind }), string.Join("\n", manaBind.RemainingSecrets.Select(x => Cards.All[x].Name))); Assert.AreEqual(12, iceBarrier.RemainingSecrets.Count); break; } case 20: { events["t20"] = true; Assert.AreEqual(3, secrets.Count); var iceBlock = secrets.ElementAt(0); var spellbender = secrets.ElementAt(1); var vaporize = secrets.ElementAt(2); Assert.IsTrue(iceBlock.RemainingSecrets.SequenceEqual(new[] { Mage.IceBlock, }), string.Join("\n", iceBlock.RemainingSecrets.Select(x => Cards.All[x].Name))); Assert.AreEqual(12, spellbender.RemainingSecrets.Count); Assert.AreEqual(12, vaporize.RemainingSecrets.Count); break; } case 22: { events["t22"] = true; Assert.AreEqual(4, secrets.Count); var spellbender = secrets.ElementAt(0); var effigy = secrets.ElementAt(1); var duplicate = secrets.ElementAt(2); var manaBind = secrets.ElementAt(3); Assert.IsTrue(spellbender.RemainingSecrets.SequenceEqual(new[] { Mage.Counterspell, Mage.Spellbender, Mage.ManaBind }), string.Join("\n", spellbender.RemainingSecrets.Select(x => Cards.All[x].Name))); Assert.AreEqual(12, effigy.RemainingSecrets.Count); Assert.AreEqual(12, duplicate.RemainingSecrets.Count); Assert.AreEqual(12, manaBind.RemainingSecrets.Count); break; } } } }; logInput.Read(data.LogFile); foreach (var turn in new[] { "t5", "t6", "t8", "t10", "t12", "t14", "t16", "t18", "t20", "t22" }) { Assert.AreEqual(true, events[turn]); } }