Files
tiny_tackle_heroes/Assets/_Project/Tests/PlayMode/Defense25DProgressionPlayModeTests.cs
T
2026-09-28 11:07:17 +09:00

107 lines
4.7 KiB
C#

using System.Collections.Generic;
using BumpCombat.Constants;
using BumpCombat.Core;
using BumpCombat.Defense;
using BumpCombat.Defense.Comparison;
using BumpCombat.Progression;
using NUnit.Framework;
using UnityEngine;
namespace BumpCombat.PlayModeTests
{
public sealed class Defense25DProgressionPlayModeTests
{
[Test]
public void KillExperienceUsesActualActorModifiersAndQueuesOneLevelChoice()
{
GameObject actorObject = new("Progression Actor");
Defense25DActor actor = actorObject.AddComponent<Defense25DActor>();
ModifierDefinition experienceModifier = Modifier(
"experience-gain", CharacterStat.ExperienceGain, 0.5f, 1);
ModifierDefinition rewardModifier = Modifier(
"move-speed", CharacterStat.MoveSpeed, 0.2f, 2);
Defense25DRewardConstants rewardConstants =
ScriptableObject.CreateInstance<Defense25DRewardConstants>();
Defense25DTowerModifiers towerModifiers = new(rewardConstants);
int oldRequiredExperience = GameplayConstants.Current.LevelUp.BaseExperienceToNextLevel;
try
{
GameplayConstants.Current.LevelUp.BaseExperienceToNextLevel = 5;
Assert.That(experienceModifier.TryApplyToModel(actor, null), Is.True);
Defense25DProgression progression = new();
List<string> requestedTokens = new();
progression.ChoiceRequested += (_, token) => requestedTokens.Add(token);
progression.Bind(
actor,
rewardConstants,
new[] { rewardModifier },
towerModifiers,
_ => false);
progression.GrantKillExperience(3);
Assert.That(progression.CurrentExperience, Is.EqualTo(4));
Assert.That(progression.Level, Is.EqualTo(1));
Assert.That(progression.HasPendingLevelChoice, Is.False);
progression.GrantKillExperience(1);
Assert.That(progression.Level, Is.EqualTo(2));
Assert.That(progression.CurrentExperience, Is.EqualTo(1));
Assert.That(progression.HasPendingLevelChoice, Is.True);
Assert.That(requestedTokens, Is.EqualTo(new[] { "run:1:level:2" }));
Assert.That(progression.CurrentChoices, Has.Count.EqualTo(1));
Assert.That(progression.CurrentChoices[0].TargetKind,
Is.EqualTo(Defense25DRewardTargetKind.PlayerModifier));
Assert.That(progression.TryChooseModifier(0), Is.True);
Assert.That(actor.GetStackCount(
rewardModifier.ModifierId,
CharacterStat.MoveSpeed), Is.EqualTo(1));
Assert.That(progression.HasPendingLevelChoice, Is.False);
Defense25DTowerModifierDefinition fireAttack = System.Array.Find(
rewardConstants.TowerModifierCatalog,
definition => definition.DefinitionId == "fire.attack.common");
Assert.That(fireAttack, Is.Not.Null);
Assert.That(towerModifiers.Apply(
Defense25DRewardChoice.CreateTowerModifier(fireAttack)), Is.True);
Assert.That(towerModifiers.AppliedChoiceCount, Is.EqualTo(1));
progression.ResetProgression();
Assert.That(progression.Level, Is.EqualTo(1));
Assert.That(progression.CurrentExperience, Is.Zero);
Assert.That(progression.RequiredExperience, Is.EqualTo(5));
Assert.That(progression.CurrentChoices, Is.Empty);
Assert.That(towerModifiers.AppliedChoiceCount, Is.Zero,
"Restart clears the run's tower modifier stacks as well as XP and choices.");
}
finally
{
GameplayConstants.Current.LevelUp.BaseExperienceToNextLevel = oldRequiredExperience;
Object.DestroyImmediate(experienceModifier);
Object.DestroyImmediate(rewardModifier);
Object.DestroyImmediate(rewardConstants);
Object.DestroyImmediate(actorObject);
}
}
private static ModifierDefinition Modifier(
string id,
CharacterStat stat,
float value,
int maximumStacks)
{
ModifierDefinition definition =
ScriptableObject.CreateInstance<ModifierDefinition>();
definition.Configure(
$"progression-test.{id}",
id,
stat,
ModifierOperation.Increased,
value,
maximumStacks);
return definition;
}
}
}