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( "Assets/_Project/Constants/Defense25DComparison/ComparisonSettings.asset")); Assert.That(settings, Is.Not.Null); world = new GameObject("Skeleton combat under test").AddComponent(); 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( "Assets/_Project/Constants/Enemies/Skeleton.asset"); attackClip = AssetDatabase.LoadAssetAtPath( "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 }); } } }