using System.Collections; using System.Collections.Generic; using System; using System.Reflection; using BumpCombat.Core; using BumpCombat.Defense; using BumpCombat.Constants; using BumpCombat.Defense.Comparison; using BumpCombat.Enemies; using BumpCombat.Progression; using NUnit.Framework; using UnityEditor; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.InputSystem.LowLevel; using UnityEngine.TestTools; using UnityEngine.UI; using Object = UnityEngine.Object; namespace BumpCombat.Tests { public sealed class Defense25DRunHudPlayModeTests { private const string ConstantsPath = "Assets/_Project/Constants/Defense25DComparison/RunHudConstants.asset"; private GameObject hudTestWorldObject; private GameObject hudTestObject; private Defense25DComparisonSettings hudTestSettings; private Defense25DRunDefinition hudTestRunDefinition; private Defense25DWaveDirectorConstants hudTestWaveConstants; private Defense25DProgression hudTestProgression; private Defense25DRewardConstants hudTestRewardConstants; private ModifierDefinition hudTestModifier; private float previousTimeScale; private InputSettings.BackgroundBehavior previousBackgroundBehavior; private InputSettings.EditorInputBehaviorInPlayMode previousEditorInputBehavior; private bool previousRunInBackground; private bool hudInputSettingsCaptured; [SetUp] public void CaptureTimeScale() { previousTimeScale = Time.timeScale; } [Test] public void RunHudConstantsAssetMatchesTheFhdLayoutContract() { Defense25DRunHudConstants constants = AssetDatabase.LoadAssetAtPath(ConstantsPath); Assert.That(constants, Is.Not.Null); Assert.That(constants.CombatHudBottomLeft, Is.EqualTo(new Vector2(24f, 24f))); Assert.That(constants.CombatHudSize, Is.EqualTo(new Vector2(392f, 136f))); Assert.That(constants.HealthTrackSize, Is.EqualTo(new Vector2(352f, 12f))); Assert.That(constants.ArtifactGaugeSize, Is.EqualTo(new Vector2(352f, 18f))); Assert.That(constants.ExperienceTrackSize, Is.EqualTo(new Vector2(352f, 8f))); Assert.That(constants.GuardTrackSize, Is.EqualTo(new Vector2(18f, 94f))); Assert.That(constants.TimerSize, Is.EqualTo(new Vector2(220f, 66f))); Assert.That(constants.WaveSummarySize, Is.EqualTo(new Vector2(700f, 116f))); Assert.That(constants.MinimapSize, Is.EqualTo(new Vector2(300f, 162f))); Assert.That(constants.PortalListSize, Is.EqualTo(new Vector2(320f, 300f))); Assert.That(constants.PortalCount, Is.EqualTo(12)); Assert.That(constants.MissionCount, Is.EqualTo(3)); Assert.That(constants.ModalMaximumSize, Is.EqualTo(new Vector2(1040f, 420f))); } [TestCase(1280f, 720f, 2f / 3f)] [TestCase(1920f, 1080f, 1f)] [TestCase(2560f, 1440f, 4f / 3f)] [TestCase(1399f, 799f, 1399f / 1920f)] public void ViewportScaleUsesTheSmallerReferenceAxis( float width, float height, float expectedScale) { float scale = Defense25DRunHudConstants.ScaleForViewport( new Rect(0f, 0f, width, height)); Assert.That(scale, Is.EqualTo(expectedScale).Within(.0001f)); } [TestCase(0f, 1080f)] [TestCase(1920f, 0f)] [TestCase(-1f, 720f)] public void InvalidViewportHasNoLayoutScale(float width, float height) { Assert.That(Defense25DRunHudConstants.IsValidViewport( new Rect(0f, 0f, width, height)), Is.False); Assert.That(Defense25DRunHudConstants.ScaleForViewport( new Rect(0f, 0f, width, height)), Is.Zero); } [UnityTest] public IEnumerator BindCreatesRealButtonHitRectsAndUnbindClearsThem() { GameObject host = new("Run HUD PlayMode Test"); Defense25DRunHud hud = host.AddComponent(); hud.Bind(null, null, null); yield return null; Assert.That(hud.IsLayoutValid, Is.True); Rect[] firstRects = hud.GetPointerBlockRects(); Assert.That(firstRects, Is.Not.Empty); foreach (Rect hitRect in firstRects) Assert.That(hitRect.width * hitRect.height, Is.GreaterThan(0f)); Graphic[] graphics = host.GetComponentsInChildren(true); foreach (Graphic graphic in graphics) if (graphic.raycastTarget) Assert.That(graphic.GetComponent