public void GameStateChange_TagChange() { TagChange tagChange = null; var parser = new PowerParser(new MockGameInfo()); parser.GameStateChange += args => tagChange = args as TagChange; parser.Parse(new Line("Power", "D 00:31:50.8318211 PowerTaskList.DebugPrintPower() - TAG_CHANGE Entity=Epix tag=RESOURCES_USED value=2")); Assert.IsNotNull(tagChange); Assert.IsNull(tagChange.EntityId); Assert.AreEqual("Epix", tagChange.EntityName); Assert.AreEqual(GameTag.RESOURCES_USED, tagChange.Tag); Assert.AreEqual(2, tagChange.Value); parser.Parse(new Line("Power", "D 00:31:50.8318211 PowerTaskList.DebugPrintPower() - TAG_CHANGE Entity=2 tag=RESOURCES_USED value=2")); Assert.IsNotNull(tagChange); Assert.AreEqual(2, tagChange.EntityId); Assert.AreEqual(GameTag.RESOURCES_USED, tagChange.Tag); Assert.AreEqual(2, tagChange.Value); tagChange = null; parser.Parse(new Line("Power", "D 00:31:50.8568882 PowerTaskList.DebugPrintPower() - TAG_CHANGE Entity=[entityName=Vilefin Inquisitor id=60 zone=HAND zonePos=4 cardId=OG_006 player=2] tag=ZONE value=PLAY")); Assert.IsNotNull(tagChange); Assert.AreEqual(60, tagChange.EntityId); Assert.AreEqual(GameTag.ZONE, tagChange.Tag); Assert.AreEqual((int)Zone.PLAY, tagChange.Value); }
public TagChange GetDeepCopy() { TagChange tc = new TagChange(); tc.isAnAddition = isAnAddition; tc.tag = tag; return(tc); }
public void ResolveEntity() { var tc = new TagChange(new TagChangeData(GameTag.HEALTH, 5, false, null, null)); Assert.IsNull(tc.EntityId); tc.ResolveEntityId(1); Assert.AreEqual(1, tc.EntityId); }
public void ResolveEntity_NoMultipleCalls() { var tc = new TagChange(new TagChangeData(GameTag.HEALTH, 5, false, null, null)); tc.ResolveEntityId(1); tc.ResolveEntityId(2); Assert.AreEqual(1, tc.EntityId); }
public void Apply_NoEntityId_NoCreationTag() { var tc = new TagChange(new TagChangeData(GameTag.HEALTH, 5, false, null, null)); var game = new MockGameState(); tc.Apply(game); Assert.IsNull(tc.EntityId); Assert.IsNull(tc.PreviousValue); }
public void Apply_ValidEntity() { var tc = new TagChange(new TagChangeData(GameTag.HEALTH, 5, false, 1, null)); var game = new MockGameState(); game.Entities.Add(1, new Entity(1, "CARD_ID")); tc.Apply(game); Assert.AreEqual(0, tc.PreviousValue); Assert.AreEqual(tc.Value, game.Entities[tc.EntityId.Value].Tags[tc.Tag]); }
public void Constructor() { var data = new TagChangeData(GameTag.HEALTH, 5, true, 1, "NAME"); var tc = new TagChange(data); Assert.AreEqual(data.Tag, tc.Tag); Assert.AreEqual(data.Value, tc.Value); Assert.IsTrue(tc.CreationTag); Assert.AreEqual(data.EntityId, tc.EntityId); Assert.AreEqual(data.EntityName, tc.EntityName); }
public void Apply_InvalidEntity() { var tc = new TagChange(new TagChangeData(GameTag.HEALTH, 5, false, 2, null)); var game = new MockGameState(); var entity = new Entity(1, "CARD_ID"); game.Entities.Add(1, entity); tc.Apply(game); Assert.IsNull(tc.PreviousValue); }
public void GameStateChange_TagChange_CreationTag() { TagChange tagChange = null; var parser = new PowerParser(new MockGameInfo()); parser.GameStateChange += args => tagChange = args as TagChange; parser.Parse(new Line("Power", "D 00:31:50.9189508 PowerTaskList.DebugPrintPower() - tag=CONTROLLER value=2")); Assert.IsNotNull(tagChange); Assert.IsTrue(tagChange.CreationTag); Assert.AreEqual(GameTag.CONTROLLER, tagChange.Tag); Assert.AreEqual(2, tagChange.Value); }
public void Apply_ValidEntity_ControllerChange() { var tc = new TagChange(new TagChangeData(GameTag.CONTROLLER, 1, false, 1, null)); var game = new MockGameState(); game.Entities.Add(1, new Entity(1, "CARD_ID")); tc.Apply(game); Assert.AreEqual(tc.Value, game.Entities[tc.EntityId.Value].Info.OriginalController); var tc2 = new TagChange(new TagChangeData(GameTag.CONTROLLER, 2, false, 1, null)); tc2.Apply(game); Assert.AreEqual(tc.Value, game.Entities[tc.EntityId.Value].Info.OriginalController); }
public void Apply_ValidEntity_ZoneChange() { var tc = new TagChange(new TagChangeData(GameTag.ZONE, (int)Zone.DECK, false, 1, null)); var game = new MockGameState { CurrentTurn = 1 }; game.Entities.Add(1, new Entity(1, "CARD_ID")); tc.Apply(game); Assert.AreEqual((Zone?)tc.Value, game.Entities[tc.EntityId.Value].Info.OriginalZone); Assert.AreEqual(Zone.INVALID, game.Entities[tc.EntityId.Value].Info.PreviousZone); Assert.AreEqual(1, game.Entities[tc.EntityId.Value].Info.LastZoneChange); var tc2 = new TagChange(new TagChangeData(GameTag.ZONE, (int)Zone.HAND, false, 1, null)); tc2.Apply(game); Assert.AreEqual((Zone?)tc.Value, game.Entities[tc.EntityId.Value].Info.OriginalZone); }
public static void Handle(string timestamp, string data, ParserState state) { var trimmed = data.Trim(); var indentLevel = data.Length - trimmed.Length; data = trimmed; if (state.Node != null && indentLevel <= state.Node.IndentLevel) { var action = state.Node.Object as Action; if (action == null || action.Entity != 1 || !data.ToLower().Contains("mulligan")) { state.Node = state.Node.Parent ?? state.Node; } } if (data == "CREATE_GAME") { state.CurrentGame = new Game { Data = new List <GameData>(), TimeStamp = timestamp }; state.Replay.Games.Add(state.CurrentGame); state.Node = new Node(typeof(Game), state.CurrentGame, 0, null); return; } var match = Regexes.ActionCreategameRegex.Match(data); if (match.Success) { var id = match.Groups[1].Value; Debug.Assert(id == "1"); var gEntity = new GameEntity { Id = int.Parse(id), Tags = new List <Tag>() }; state.CurrentGame.Data.Add(gEntity); state.Node = new Node(typeof(GameEntity), gEntity, indentLevel, state.Node); return; } match = Regexes.ActionCreategamePlayerRegex.Match(data); if (match.Success) { var id = match.Groups[1].Value; var playerId = match.Groups[2].Value; var accountHi = match.Groups[3].Value; var accountLo = match.Groups[4].Value; var pEntity = new PlayerEntity { Id = int.Parse(id), AccountHi = accountHi, AccountLo = accountLo, PlayerId = int.Parse(playerId), Tags = new List <Tag>() }; state.CurrentGame.Data.Add(pEntity); state.Node = new Node(typeof(PlayerEntity), pEntity, indentLevel, state.Node); return; } match = Regexes.ActionStartRegex.Match(data); if (match.Success) { var rawEntity = match.Groups[1].Value; var rawType = match.Groups[2].Value; var index = match.Groups[3].Value; var rawTarget = match.Groups[4].Value; var entity = Helper.ParseEntity(rawEntity, state); var target = Helper.ParseEntity(rawTarget, state); var type = Helper.ParseEnum <PowSubType>(rawType); var action = new Action { Data = new List <GameData>(), Entity = entity, Index = int.Parse(index), Target = target, TimeStamp = timestamp, Type = type }; if (state.Node.Type == typeof(Game)) { ((Game)state.Node.Object).Data.Add(action); } else if (state.Node.Type == typeof(Action)) { ((Action)state.Node.Object).Data.Add(action); } else { throw new Exception("Invalid node " + state.Node.Type); } state.Node = new Node(typeof(Action), action, indentLevel, state.Node); return; } match = Regexes.ActionMetadataRegex.Match(data); if (match.Success) { var rawMeta = match.Groups[1].Value; var rawData = match.Groups[2].Value; var info = match.Groups[3].Value; var parsedData = Helper.ParseEntity(rawData, state); var meta = Helper.ParseEnum <MetaDataType>(rawMeta); var metaData = new MetaData { Data = parsedData, Info = int.Parse(info), Meta = meta, MetaInfo = new List <Info>() }; if (state.Node.Type == typeof(Action)) { ((Action)state.Node.Object).Data.Add(metaData); } else { throw new Exception("Invalid node " + state.Node.Type); } state.Node = new Node(typeof(MetaData), metaData, indentLevel, state.Node); return; } match = Regexes.ActionMetaDataInfoRegex.Match(data); if (match.Success) { var index = match.Groups[1].Value; var rawEntity = match.Groups[2].Value; var entity = Helper.ParseEntity(rawEntity, state); var metaInfo = new Info { Id = entity, Index = int.Parse(index) }; if (state.Node.Type == typeof(MetaData)) { ((MetaData)state.Node.Object).MetaInfo.Add(metaInfo); } else { throw new Exception("Invalid node " + state.Node.Type); } } match = Regexes.ActionShowEntityRegex.Match(data); if (match.Success) { var rawEntity = match.Groups[1].Value; var cardId = match.Groups[2].Value; var entity = Helper.ParseEntity(rawEntity, state); var showEntity = new ShowEntity { CardId = cardId, Entity = entity, Tags = new List <Tag>() }; if (state.Node.Type == typeof(Game)) { ((Game)state.Node.Object).Data.Add(showEntity); } else if (state.Node.Type == typeof(Action)) { ((Action)state.Node.Object).Data.Add(showEntity); } else { throw new Exception("Invalid node " + state.Node.Type); } state.Node = new Node(typeof(ShowEntity), showEntity, indentLevel, state.Node); return; } match = Regexes.ActionHideEntityRegex.Match(data); if (match.Success) { var rawEntity = match.Groups[1].Value; var tagName = match.Groups[2].Value; var value = match.Groups[3].Value; var entity = Helper.ParseEntity(rawEntity, state); var zone = Helper.ParseTag(tagName, value); var hideEntity = new HideEntity { Entity = entity, Zone = zone.Value, TimeStamp = timestamp }; if (state.Node.Type == typeof(Game)) { ((Game)state.Node.Object).Data.Add(hideEntity); } else if (state.Node.Type == typeof(Action)) { ((Action)state.Node.Object).Data.Add(hideEntity); } else { throw new Exception("Invalid node: " + state.Node.Type); } return; } match = Regexes.ActionFullEntityUpdatingRegex.Match(data); if (!match.Success) { match = Regexes.ActionFullEntityCreatingRegex.Match(data); } if (match.Success) { var rawEntity = match.Groups[1].Value; var cardId = match.Groups[2].Value; var entity = Helper.ParseEntity(rawEntity, state); var showEntity = new FullEntity { CardId = cardId, Id = entity, Tags = new List <Tag>() }; if (state.Node.Type == typeof(Game)) { ((Game)state.Node.Object).Data.Add(showEntity); } else if (state.Node.Type == typeof(Action)) { ((Action)state.Node.Object).Data.Add(showEntity); } else { throw new Exception("Invalid node " + state.Node.Type); } state.Node = new Node(typeof(FullEntity), showEntity, indentLevel, state.Node); return; } match = Regexes.ActionTagChangeRegex.Match(data); if (match.Success) { var rawEntity = match.Groups[1].Value; var tagName = match.Groups[2].Value; var value = match.Groups[3].Value; var tag = Helper.ParseTag(tagName, value); if (tag.Name == (int)GameTag.CURRENT_PLAYER) { UpdateCurrentPlayer(state, rawEntity, tag); } var entity = Helper.ParseEntity(rawEntity, state); if (tag.Name == (int)GameTag.ENTITY_ID) { entity = UpdatePlayerEntity(state, rawEntity, tag, entity); } var tagChange = new TagChange { Entity = entity, Name = tag.Name, Value = tag.Value }; if (state.Node.Type == typeof(Game)) { ((Game)state.Node.Object).Data.Add(tagChange); } else if (state.Node.Type == typeof(Action)) { ((Action)state.Node.Object).Data.Add(tagChange); } else { throw new Exception("Invalid node " + state.Node.Type); } return; } match = Regexes.ActionTagRegex.Match(data); if (match.Success) { var tagName = match.Groups[1].Value; var value = match.Groups[2].Value; var tag = Helper.ParseTag(tagName, value); if (tag.Name == (int)GameTag.CURRENT_PLAYER) { state.FirstPlayerId = ((PlayerEntity)state.Node.Object).Id; } if (state.Node.Type == typeof(GameEntity)) { ((GameEntity)state.Node.Object).Tags.Add(tag); } else if (state.Node.Type == typeof(PlayerEntity)) { ((PlayerEntity)state.Node.Object).Tags.Add(tag); } else if (state.Node.Type == typeof(FullEntity)) { ((FullEntity)state.Node.Object).Tags.Add(tag); } else if (state.Node.Type == typeof(ShowEntity)) { ((ShowEntity)state.Node.Object).Tags.Add(tag); } else { throw new Exception("Invalid node " + state.Node.Type + " -- " + data); } } }
public void CanNotApply() { var tc = new TagChange(new TagChangeData(GameTag.HEALTH, 5, false, null, null)); Assert.IsFalse(tc.CanApply); }
public void CanApply_HasId() { var tc = new TagChange(new TagChangeData(GameTag.HEALTH, 5, false, 1, null)); Assert.IsTrue(tc.CanApply); }
public void CanApply_CreationTag() { var tc = new TagChange(new TagChangeData(GameTag.HEALTH, 5, true, null, null)); Assert.IsTrue(tc.CanApply); }