129 lines
5.5 KiB
C#
129 lines
5.5 KiB
C#
using System.Reflection;
|
|
using BumpCombat.Enemies;
|
|
using BumpCombat.Progression;
|
|
using BumpCombat.Player;
|
|
using NUnit.Framework;
|
|
using UnityEngine;
|
|
|
|
namespace BumpCombat.Tests
|
|
{
|
|
public sealed class PassiveRelicRulesTests
|
|
{
|
|
[TestCase(0.149f, true)]
|
|
[TestCase(0.15f, false)]
|
|
[TestCase(0.99f, false)]
|
|
public void RollChance_UsesExclusiveUpperThreshold(float roll, bool expected)
|
|
{
|
|
Assert.That(PassiveRelicRules.RollsChance(0.15f, roll), Is.EqualTo(expected));
|
|
}
|
|
|
|
[TestCase(true, true, false, 0.1f, 20f)]
|
|
[TestCase(true, false, false, 0.1f, 10f)]
|
|
[TestCase(true, true, true, 0.1f, 10f)]
|
|
[TestCase(false, true, false, 0.1f, 10f)]
|
|
public void TwinHorn_DoublesOnlyOwnedOrdinaryBumps(
|
|
bool ownsRelic,
|
|
bool ordinaryBump,
|
|
bool artifactHit,
|
|
float roll,
|
|
float expected)
|
|
{
|
|
Assert.That(PassiveRelicRules.ApplyTwinHornDamage(
|
|
10f, ownsRelic, ordinaryBump, artifactHit, 0.15f, roll),
|
|
Is.EqualTo(expected));
|
|
}
|
|
|
|
[Test]
|
|
public void ZeroDamagePulseEcho_HasNoCastOrPlayerSideEffects()
|
|
{
|
|
GameObject owner = new("Passive Relic Echo Test Player");
|
|
ActiveArtifactDefinition pulse = ScriptableObject.CreateInstance<ActiveArtifactDefinition>();
|
|
try
|
|
{
|
|
owner.AddComponent<PlayerStats>();
|
|
owner.AddComponent<Rigidbody2D>();
|
|
ActiveArtifactController artifacts = owner.AddComponent<ActiveArtifactController>();
|
|
SetField(pulse, "artifactId", "pulse-test");
|
|
SetField(pulse, "effect", ActiveArtifactEffect.Pulse);
|
|
SetField(pulse, "normalDamage", 0f);
|
|
artifacts.Configure(new[] { pulse });
|
|
Assert.That(artifacts.TryAddArtifact(pulse), Is.True);
|
|
|
|
typeof(ActiveArtifactController)
|
|
.GetField("<CurrentGauge>k__BackingField", BindingFlags.Instance | BindingFlags.NonPublic)
|
|
?.SetValue(artifacts, 12f);
|
|
float gaugeBefore = artifacts.CurrentGauge;
|
|
Vector3 positionBefore = owner.transform.position;
|
|
int successfulUses = 0;
|
|
artifacts.OnArtifactUseSucceeded += (_, _) => successfulUses++;
|
|
|
|
bool emitted = artifacts.TryEmitPassiveRelicEcho(owner.transform.position, Vector2.right, 0.5f);
|
|
|
|
Assert.That(emitted, Is.False);
|
|
Assert.That(artifacts.CurrentGauge, Is.EqualTo(gaugeBefore));
|
|
Assert.That(owner.transform.position, Is.EqualTo(positionBefore));
|
|
Assert.That(artifacts.LocksMovement, Is.False);
|
|
Assert.That(artifacts.IsExecutingArtifact, Is.False);
|
|
Assert.That(successfulUses, Is.Zero);
|
|
}
|
|
finally
|
|
{
|
|
Object.DestroyImmediate(owner);
|
|
Object.DestroyImmediate(pulse);
|
|
}
|
|
}
|
|
|
|
[TestCase(EnemyDamageSource.Player, true)]
|
|
[TestCase(EnemyDamageSource.PassiveRelicAttack, true)]
|
|
[TestCase(EnemyDamageSource.PassiveRelicExplosion, true)]
|
|
[TestCase(EnemyDamageSource.PassiveRelicTransferredIgnite, true)]
|
|
[TestCase(EnemyDamageSource.Tower, false)]
|
|
public void RewardKillCredit_ExcludesTowers(
|
|
EnemyDamageSource source,
|
|
bool expected)
|
|
{
|
|
Assert.That(PassiveRelicRules.IsPlayerRewardKill(source),
|
|
Is.EqualTo(expected));
|
|
}
|
|
|
|
private static void SetField<T>(ActiveArtifactDefinition definition, string fieldName, T value)
|
|
{
|
|
typeof(ActiveArtifactDefinition)
|
|
.GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic)
|
|
?.SetValue(definition, value);
|
|
}
|
|
[Test]
|
|
public void AvailableRelics_ExcludesOwnedIdsAndPreservesCatalogOrder()
|
|
{
|
|
PassiveRelicId[] catalog = PassiveRelicRules.GetAvailableRelics(
|
|
System.Array.Empty<PassiveRelicId>());
|
|
PassiveRelicId[] expected = (PassiveRelicId[])
|
|
System.Enum.GetValues(typeof(PassiveRelicId));
|
|
Assert.That(catalog, Is.EqualTo(expected));
|
|
Assert.That(catalog.Length, Is.EqualTo(20));
|
|
|
|
PassiveRelicId[] afterOne = PassiveRelicRules.GetAvailableRelics(
|
|
new[] { PassiveRelicId.ResonanceCore });
|
|
Assert.That(afterOne, Has.None.EqualTo(PassiveRelicId.ResonanceCore));
|
|
Assert.That(afterOne.Length, Is.EqualTo(19));
|
|
Assert.That(PassiveRelicRules.GetAvailableRelics(expected), Is.Empty);
|
|
}
|
|
[Test]
|
|
public void RuptureDamageAndRadiusScaleFromEnemyHealthAndPlayerBody()
|
|
{
|
|
Assert.That(PassiveRelicRules.GetExplosionDamage(1000f, 0.1f), Is.EqualTo(100f));
|
|
Assert.That(PassiveRelicRules.GetExplosionRadius(1.2f, 3f), Is.EqualTo(3.6f).Within(0.0001f));
|
|
}
|
|
|
|
[TestCase(EnemyDamageSource.Player, true)]
|
|
[TestCase(EnemyDamageSource.PassiveRelicAttack, true)]
|
|
[TestCase(EnemyDamageSource.Tower, false)]
|
|
[TestCase(EnemyDamageSource.PassiveRelicExplosion, false)]
|
|
[TestCase(EnemyDamageSource.None, false)]
|
|
public void PlayerKillCredit_ExcludesTowerAndRelicExplosion(EnemyDamageSource source, bool expected)
|
|
{
|
|
Assert.That(PassiveRelicRules.IsPlayerCreditedKill(source), Is.EqualTo(expected));
|
|
}
|
|
}
|
|
}
|