public void CastMethod_AppropriatelyRaisesEvents([Values(false, true)] bool enemyDies) { var spellDamage = _fireballSpell.Power + _human.MagicStrength; int enemyHealth = spellDamage + (enemyDies ? 0 : 1); _enemy.SetHealth(enemyHealth); _human.SetDeathOnTurnEndEvent(); _human.AddSpell(_fireballSpell); _human.SetMana(_fireballSpell.Cost); _human.SetMove(_fireballSpell); _human.SetMoveTarget(_enemy); _logger.Subscribe(EventType.ManaLost, _human); _logger.Subscribe(EventType.SpellSuccessful, _human); _logger.Subscribe(EventType.EnemyKilled, _human); _logger.Subscribe(EventType.MagicalDamageTaken, _enemy); _logger.Subscribe(EventType.Killed, _enemy); _battleManager.Battle(_humanTeam, _enemyTeam); var logs = _logger.Logs; int expectedLogCount = enemyDies ? 5 : 3; Assert.AreEqual(expectedLogCount, logs.Count); int i = 0; //first event, mana spent EventLog log = logs[i++]; Assert.AreEqual(EventType.ManaLost, log.Type); Assert.AreEqual(_human, log.Sender); ManaLostEventArgs e1 = log.E as ManaLostEventArgs; Assert.That(e1, Is.Not.Null); if (e1 != null) { Assert.AreEqual(_fireballSpell.Cost, e1.ManaSpent); } //second event, magical damage taken log = logs[i++]; Assert.AreEqual(EventType.MagicalDamageTaken, log.Type); Assert.AreEqual(_enemy, log.Sender); MagicalDamageTakenEventArgs e2 = log.E as MagicalDamageTakenEventArgs; Assert.That(e2, Is.Not.Null); if (e2 != null) { Assert.AreEqual(spellDamage, e2.Damage); Assert.AreEqual(_fireballSpell.ElementalType, e2.MagicType); } //killed event sent by enemy, potentially if (enemyDies) { log = logs[i++]; Assert.AreEqual(EventType.Killed, log.Type); Assert.AreEqual(_enemy, log.Sender); KilledEventArgs e3 = log.E as KilledEventArgs; Assert.That(e3, Is.Not.Null); } //Spell successful log = logs[i++]; Assert.AreEqual(EventType.SpellSuccessful, log.Type); Assert.AreEqual(_human, log.Sender); SpellSuccessfulEventArgs e4 = log.E as SpellSuccessfulEventArgs; Assert.That(e4, Is.Not.Null); if (e4 != null) { Assert.AreEqual(_fireballSpell, e4.Spell); Assert.AreEqual(spellDamage, e4.DamageDealt); Assert.AreEqual(_enemy, e4.TargettedFoe); } //enemy killed, potentially if (enemyDies) { log = logs[i]; Assert.AreEqual(EventType.EnemyKilled, log.Type); Assert.AreEqual(_human, log.Sender); EnemyKilledEventArgs e5 = log.E as EnemyKilledEventArgs; Assert.That(e5, Is.Not.Null); if (e5 != null) { Assert.AreEqual(_enemy, e5.Enemy); } } }
private void _logSpellSuccessful(object sender, SpellSuccessfulEventArgs e) { Logs.Add(new EventLog(EventType.SpellSuccessful, sender, e)); }
public void OnSpellSuccessful(SpellSuccessfulEventArgs e) { SpellSuccessful?.Invoke(this, e); }