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

93 lines
3.7 KiB
C#

using System.Collections;
using System.Reflection;
using BumpCombat.Constants;
using BumpCombat.Defense.Comparison;
using BumpCombat.Enemies;
using NUnit.Framework;
using UnityEditor;
using UnityEngine;
using UnityEngine.TestTools;
using Object = UnityEngine.Object;
namespace BumpCombat.Tests
{
public sealed class Defense25DSkeletonCombatPlayModeTests
{
private Defense25DComparison world;
private Defense25DComparisonSettings settings;
private AnimationClip attackClip;
private float previousTimeScale;
[UnitySetUp]
public IEnumerator SetUp()
{
previousTimeScale = Time.timeScale;
Time.timeScale = 1f;
settings = Object.Instantiate(AssetDatabase.LoadAssetAtPath<Defense25DComparisonSettings>(
"Assets/_Project/Constants/Defense25DComparison/ComparisonSettings.asset"));
Assert.That(settings, Is.Not.Null);
world = new GameObject("Skeleton combat under test").AddComponent<Defense25DComparison>();
world.Initialize(settings);
world.AutoSpawn = false;
world.ReadInput = false;
world.SetPaused(false);
Time.timeScale = 0f;
yield return null;
}
[UnityTearDown]
public IEnumerator TearDown()
{
if (world != null) Object.Destroy(world.gameObject);
if (settings != null) Object.Destroy(settings);
Time.timeScale = previousTimeScale;
yield return null;
}
[UnityTest]
public IEnumerator SkeletonSlashDamagesOnceWhenItsAuthoredActiveWindowBegins()
{
EnemyDefinition skeleton = AssetDatabase.LoadAssetAtPath<EnemyDefinition>(
"Assets/_Project/Constants/Enemies/Skeleton.asset");
attackClip = AssetDatabase.LoadAssetAtPath<AnimationClip>(
"Assets/_Project/Art/Characters/Skeleton/Animations/Skeleton_Attack.anim");
Assert.That(skeleton, Is.Not.Null);
Assert.That(attackClip, Is.Not.Null);
Defense25DEnemy enemy = world.Enemies[0];
Assert.That(world.IsRunning, Is.True);
enemy.Spawn(Vector2.zero);
enemy.ConfigureSkeletonCombat(skeleton, 1.25f, attackClip);
Assert.That(world.Settings.EnemyRadius, Is.EqualTo(.275f).Within(.0001f));
Assert.That(world.Settings.EnemyColliderOffset, Is.EqualTo(new Vector2(0f, -.35f)));
world.Player.ResetAt(new Vector2(.5f, 0f));
Physics.SyncTransforms();
SetGameTime(0f);
Assert.That(enemy.StepSkeletonCombat(Time.fixedDeltaTime), Is.True);
Assert.That(world.IsRunning, Is.True);
Assert.That(enemy.IsAttacking, Is.True);
SetGameTime(.699f);
enemy.StepSkeletonCombat(Time.fixedDeltaTime);
Assert.That(world.Player.DamageEvents, Is.Zero,
"The warning phase must not deal damage.");
SetGameTime(.7f);
enemy.StepSkeletonCombat(Time.fixedDeltaTime);
Assert.That(world.Player.DamageEvents, Is.EqualTo(1));
Assert.That(world.Player.CurrentHealth, Is.EqualTo(world.Player.MaxHealth - 12f).Within(.001f));
SetGameTime(.72f);
enemy.StepSkeletonCombat(Time.fixedDeltaTime);
Assert.That(world.Player.DamageEvents, Is.EqualTo(1),
"A successful slash is latched for the rest of its active window.");
yield return null;
}
private void SetGameTime(float value)
{
typeof(Defense25DComparison).GetProperty(nameof(Defense25DComparison.GameTime))
.GetSetMethod(true).Invoke(world, new object[] { value });
}
}
}