93 lines
3.7 KiB
C#
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 });
|
|
}
|
|
}
|
|
}
|