Files
tiny_tackle_heroes/Assets/_Project/Tests/PlayMode/Defense25DLoadoutPlayModeTests.cs
T
2026-09-27 21:08:05 +09:00

137 lines
5.9 KiB
C#

using System;
using System.Collections.Generic;
using BumpCombat.Combat;
using BumpCombat.Player;
using BumpCombat.Progression;
using BumpCombat.Defense.Comparison;
using NUnit.Framework;
using UnityEngine;
using Object = UnityEngine.Object;
namespace BumpCombat.Tests
{
public sealed class Defense25DLoadoutPlayModeTests
{
private readonly List<ActiveArtifactDefinition> definitions = new();
[TearDown]
public void TearDown()
{
foreach (ActiveArtifactDefinition definition in definitions)
Object.DestroyImmediate(definition);
definitions.Clear();
}
[Test]
public void SourceCatalogsExposeAllSixActiveEffectsAndTwentyRelics()
{
Assert.That(Enum.GetValues(typeof(ActiveArtifactEffect)).Length, Is.EqualTo(6));
Assert.That(Enum.GetValues(typeof(PassiveRelicId)).Length, Is.EqualTo(20));
Assert.That(PassiveRelicRules.GetAvailableRelics(Array.Empty<PassiveRelicId>()).Length,
Is.EqualTo(20));
}
[Test]
public void EveryActiveEffectDispatchesAndEveryRelicCanBeAcquired()
{
Defense25DLoadout loadout = NewLoadout(1000f, 6, 6);
List<ActiveArtifactEffect> activated = new();
foreach (ActiveArtifactEffect effect in Enum.GetValues(typeof(ActiveArtifactEffect)))
{
ActiveArtifactDefinition definition = Definition(effect, 1f, 2f);
Assert.That(loadout.TryAddArtifact(definition), Is.True, effect.ToString());
Assert.That(loadout.Select(loadout.OwnedArtifactCount - 1), Is.True);
loadout.ExecuteArtifact = use =>
{
activated.Add(use.Effect);
return true;
};
Assert.That(loadout.TryUse(false), Is.True, effect.ToString());
}
Assert.That(activated, Is.EquivalentTo(Enum.GetValues(typeof(ActiveArtifactEffect))));
foreach (PassiveRelicId relic in Enum.GetValues(typeof(PassiveRelicId)))
Assert.That(loadout.TryAcquireRelic(relic), Is.True, relic.ToString());
Assert.That(loadout.OwnedRelicCount, Is.EqualTo(20));
}
[Test]
public void LoadoutEnforcesArtifactColorAndCapacityRules()
{
Defense25DLoadout loadout = NewLoadout(100f, 3, 1);
ActiveArtifactDefinition dash = Definition(ActiveArtifactEffect.Dash, 10f, 30f);
ActiveArtifactDefinition cyclone = Definition(ActiveArtifactEffect.Cyclone, 10f, 30f);
ActiveArtifactDefinition pulse = Definition(ActiveArtifactEffect.Pulse, 10f, 30f);
Assert.That(loadout.TryAddArtifact(dash), Is.True);
Assert.That(loadout.TryAddArtifact(cyclone), Is.False);
Assert.That(loadout.TryAddArtifact(pulse), Is.True);
Assert.That(loadout.OwnedArtifactCount, Is.EqualTo(2));
}
[Test]
public void ChargeReleaseUsesDefinitionCostAndFailedExecutionKeepsGauge()
{
Defense25DLoadout loadout = NewLoadout(80f, 3, 1);
ActiveArtifactDefinition definition = Definition(ActiveArtifactEffect.Pulse, 20f, 60f, 2f);
Assert.That(loadout.TryAddArtifact(definition), Is.True);
loadout.Select(0);
loadout.ExecuteArtifact = _ => false;
Assert.That(loadout.BeginCharge(), Is.True);
loadout.AdvanceCharge(1f);
Assert.That(loadout.ChargeProgress, Is.EqualTo(.5f).Within(.001f));
Assert.That(loadout.ReleaseCharge(), Is.False);
Assert.That(loadout.Gauge, Is.EqualTo(80f));
Assert.That(loadout.IsCharging, Is.False);
loadout.ExecuteArtifact = _ => true;
Assert.That(loadout.TryUse(false), Is.True);
Assert.That(loadout.Gauge, Is.EqualTo(60f));
}
[Test]
public void RunResetClearsOwnedStateAndRestoresStartingGauge()
{
Defense25DLoadout loadout = NewLoadout(25f, 3, 1);
Assert.That(loadout.TryAddArtifact(Definition(ActiveArtifactEffect.Dash, 10f, 30f)), Is.True);
Assert.That(loadout.TryAcquireRelic(PassiveRelicId.TwinHornTalisman), Is.True);
loadout.ResetRun();
Assert.That(loadout.OwnedArtifactCount, Is.Zero);
Assert.That(loadout.OwnedRelicCount, Is.Zero);
Assert.That(loadout.Gauge, Is.EqualTo(25f));
}
[Test]
public void RelicOfferPrerequisitesAndTriggerDispatchAreEnforced()
{
Defense25DLoadout loadout = NewLoadout(50f, 3, 1);
int triggers = 0;
loadout.DispatchRelicTrigger = _ => triggers++;
Assert.That(loadout.TryAcquireRelic(PassiveRelicId.EmberCarrier), Is.False);
Assert.That(loadout.TryAcquireRelic(PassiveRelicId.EmberWick), Is.True);
Assert.That(loadout.TryAcquireRelic(PassiveRelicId.EmberCarrier), Is.True);
loadout.NotifyRelicTrigger(PassiveRelicId.EmberCarrier);
loadout.NotifyRelicTrigger(PassiveRelicId.BloodFang);
Assert.That(triggers, Is.EqualTo(1));
}
private static Defense25DLoadout NewLoadout(float startingGauge, int maxArtifacts, int maxPerColor) =>
new(startingGauge, 100f, maxArtifacts, maxPerColor);
private ActiveArtifactDefinition Definition(
ActiveArtifactEffect effect, float normalCost, float chargedCost, float chargeDuration = .8f)
{
ActiveArtifactDefinition definition = ScriptableObject.CreateInstance<ActiveArtifactDefinition>();
definition.Configure(effect.ToString(), effect.ToString(), "*", effect,
DamageTag.Collision, Color.white, Color.white, normalCost, chargedCost,
chargeDuration, 1f, 2f, 1f, 2f, 1f, 2f);
definitions.Add(definition);
return definition;
}
}
}