Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        public void Initialize()
        {
            _matchInfo = new MatchInfo();
            _gameData  = new MockGameData(_matchInfo);
            _game      = new GameState(_gameData, new GameStateEvents());
            _helper    = new EntityHelper(_game);
            _helper.CreateGame();
            _player       = _helper.CreatePlayer();
            _opponent     = _helper.CreatePlayer();
            _playerHero   = _helper.Create(_player, Paladin.UtherLightbringer, Zone.PLAY);
            _opponentHero = _helper.Create(_opponent, Hunter.Rexxar, Zone.PLAY);

            _matchInfo.LocalPlayer    = new MatchInfo.Player(_player.PlayerId, "", 0, 0, 0, 0, 0, 0, 0, null, null);
            _matchInfo.OpposingPlayer = new MatchInfo.Player(_opponent.PlayerId, "", 0, 0, 0, 0, 0, 0, 0, null, null);

            _solver = new SecretSolver(_game);
        }
Exemplo n.º 3
0
        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]);
            }
        }
Exemplo n.º 4
0
        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]);
            }
        }
Exemplo n.º 5
0
        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]);
            }
        }
Exemplo n.º 6
0
        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]);
            }
        }