public void EquipPart(AbilityPart part)
    {
        if (IsPartEquipped(part))
        {
            return;
        }

        Unequip(part.Type);

        switch (part)
        {
        case AbilityBehaviour behaviour:
            ChangeBehaviour(behaviour);
            break;

        case AbilityAction action:
            ChangeAction(action);
            break;

        default:
            throw new NotImplementedException();
        }

        part.OnEquipped();
    }
        public IEnumerator CannotHaveNegativeAmmo()
        {
            int startAmmo = 0;

            Ability ability = GetAbility();
            // Ensure ability isn't charged
            AbilityPart nonChargedBehaviour = AbilityLoader.Behaviour.Where(x => !(x is ChargedBehaviour)).Random();

            ability.EquipPart(nonChargedBehaviour);

            // We do this after equipping since changing behaviour will reset ammo count to max
            ability.CurrentAmmo = startAmmo;

            GlobalCallbacks.AddUpdateListener(() => ability.UpdateState(FireInput));

            // First we wait for the cooldown to expire
            yield return(new WaitForSeconds(ability.Behaviour.CooldownDuration));

            // Then we wait a single frame for the actual shooting to occur
            yield return(0);

            Assert.AreEqual(startAmmo, ability.CurrentAmmo);
        }
 private bool IsPartEquipped(AbilityPart part)
 {
     return(GetEquippedPartOfType(part.Type) == part);
 }