public void ExportPlayers() { var spells = new FakeSpellParser(); var chars = new CharTracker(spells); var today = DateTime.Today; var red = chars.GetOrAdd("Red"); red.IsPlayer = true; red.UpdatedOn = today; var blue = chars.GetOrAdd("Blue"); blue.UpdatedOn = today; var green = chars.GetOrAdd("Green"); green.IsPlayer = true; green.Class = "CLR"; green.UpdatedOn = today; var spot = chars.GetOrAdd("Spot"); spot.Owner = "Green"; spot.UpdatedOn = today; var s = chars.ExportPlayers(); Assert.Equal($"Red:::{today:yyyy-MM-dd};Green:CLR::{today:yyyy-MM-dd};Spot::Green:{today:yyyy-MM-dd};", s); }
public void ImportPlayers() { var spells = new FakeSpellParser(); var chars = new CharTracker(spells); var today = DateTime.Today; chars.ImportPlayers($"Red:::{today:yyyy-MM-dd};Green:CLR::{today:yyyy-MM-dd};Spot::Green:{today:yyyy-MM-dd};"); var red = chars.Get("Red"); Assert.NotNull(red); Assert.True(red.IsPlayer); Assert.Null(red.Class); Assert.Equal(today, red.UpdatedOn); var green = chars.Get("Green"); Assert.NotNull(green); Assert.True(green.IsPlayer); Assert.Equal("CLR", green.Class); Assert.Equal(today, green.UpdatedOn); var spot = chars.Get("Spot"); Assert.NotNull(spot); Assert.False(spot.IsPlayer); Assert.Null(spot.Class); Assert.Equal("Green", spot.Owner); Assert.Equal(today, spot.UpdatedOn); }
public void Ignore_Group_Buff_Emote_Shared_With_Self_Buff_Lands_On_Self() { var spells = new FakeSpellParser(); var buffs = new BuffTracker(spells); buffs.AddSpell(new SpellInfo { Name = "Group Guardian of the Forest I", Target = (int)SpellTarget.Caster_Group, LandSelf = "The power of the forest surges through your muscles.", LandOthers = " channels the power of the forest." }); buffs.AddSpell(new SpellInfo { Name = "Guardian of the Forest I", Target = (int)SpellTarget.Self, LandSelf = "The power of the forest surges through your muscles.", LandOthers = " channels the power of the forest." }); buffs.HandleEvent(new LogCastingEvent() { Spell = "Guardian of the Forest X", Source = PLAYER, Timestamp = DateTime.UtcNow }); buffs.HandleEvent(new LogRawEvent() { Text = "The power of the forest surges through your muscles.", Timestamp = DateTime.UtcNow, Player = PLAYER }); var list = buffs.Get(PLAYER, DateTime.Today, DateTime.UtcNow.AddSeconds(1)).ToList(); Assert.Single(list); Assert.Equal("Guardian of the Forest X", list[0].Name); }
public void ImportPlayers_Skip_Stale() { var spells = new FakeSpellParser(); var chars = new CharTracker(spells); var today = DateTime.Today; chars.ImportPlayers($"Red:CLR::{today:yyyy-MM-dd};Green:CLR::{today.AddDays(-50):yyyy-MM-dd}"); Assert.NotNull(chars.Get("Red")); Assert.Null(chars.Get("Green")); }
public void Spell_Rank_2_Should_Assign_Class() { var spells = new FakeSpellParser(); spells.Spells.Add(new SpellInfo() { Name = "Super Fire Arrow Rk. II", ClassesMask = (int)ClassesMaskShort.RNG, ClassesCount = 1 }); var chars = new CharTracker(spells); chars.HandleEvent(new LogCastingEvent() { Source = "Rumstil", Spell = "Super Fire Arrow Rk. II", Type = CastingType.Spell }); Assert.Equal("RNG", chars.Get("Rumstil")?.Class); }
public void Spell_With_Ambiguous_Class_Shouldnt_Assign_Class() { var spells = new FakeSpellParser(); spells.Spells.Add(new SpellInfo() { Name = "Invis", ClassesMask = (int)(ClassesMaskShort.RNG | ClassesMaskShort.ENC), ClassesCount = 2 }); var chars = new CharTracker(spells); chars.HandleEvent(new LogCastingEvent() { Source = "Rumstil", Spell = "Invis", Type = CastingType.Spell }); Assert.Null(chars.Get("Rumstil")?.Class); }
public void Spell_Click_Shouldnt_Assign_Class() { var spells = new FakeSpellParser(); spells.Spells.Add(new SpellInfo() { Name = "Super Fire Arrow", ClassesMask = (int)ClassesMaskShort.RNG, ClassesCount = 1 }); var chars = new CharTracker(spells); chars.HandleEvent(new LogCastingEvent() { Source = "Rumstil", Spell = "Super Fire Arrow", Type = CastingType.Spell }); // click/procs (which are never rank 2/3) can misidentify a class Assert.Null(chars.Get("Rumstil")?.Class); }
public void Ignore_Self_Buff_Lands_On_Caster() { var spells = new FakeSpellParser(); var buffs = new BuffTracker(spells); buffs.AddSpell(new SpellInfo { Name = "Superfly TNT", LandSelf = "You should be in the front seat.", Target = (int)SpellTarget.Self }); // self buffs are handled by the casting event so the emote must be ignored to prevent double counting buffs.HandleEvent(new LogRawEvent() { Text = "You should be in the front seat.", Timestamp = DateTime.UtcNow, Player = PLAYER }); var list = buffs.Get(PLAYER, DateTime.Today, DateTime.UtcNow.AddSeconds(1)).ToList(); Assert.Empty(list); }
public void Self_Spell_Casting() { var spells = new FakeSpellParser(); var buffs = new BuffTracker(spells); buffs.AddSpell(new SpellInfo { Name = "Guns of the Navarone I", Target = (int)SpellTarget.Self }); // we only registered the first rank -- make sure it accepts any rank buffs.HandleEvent(new LogCastingEvent() { Spell = "Guns of the Navarone XV", Source = "Tokiel", Timestamp = DateTime.UtcNow }); var list = buffs.Get("Tokiel", DateTime.Today, DateTime.UtcNow.AddSeconds(1)).ToList(); Assert.Single(list); Assert.Equal("Guns of the Navarone XV", list[0].Name); }
public void Group_Buff_Lands_On_Caster_From_Bystanders_Log() { var spells = new FakeSpellParser(); var buffs = new BuffTracker(spells); buffs.AddSpell(new SpellInfo { Name = "Illusions of Grandeur I", LandOthers = " is consumed by Illusions of Grandeur.", Target = (int)SpellTarget.Caster_Group }); buffs.HandleEvent(new LogCastingEvent() { Spell = "Illusions of Grandeur I", Source = "Fourier", Timestamp = DateTime.UtcNow }); buffs.HandleEvent(new LogRawEvent() { Text = "Fourier is consumed by Illusions of Grandeur.", Player = PLAYER, Timestamp = DateTime.UtcNow }); var list = buffs.Get("Fourier", DateTime.Today, DateTime.UtcNow.AddSeconds(1)).ToList(); Assert.Single(list); Assert.Equal("Illusions of Grandeur", list[0].Name); }