using System.Linq; using BumpCombat.Constants; using BumpCombat.Defense.Comparison; using NUnit.Framework; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine.SceneManagement; namespace BumpCombat.Tests { public sealed class Defense25DRunAssetTests { private const string WaveConstantsPath = "Assets/_Project/Constants/Defense25DComparison/LongDefenseWaveDirector.asset"; private const string RunDefinitionPath = "Assets/_Project/Constants/Defense25DComparison/LongDefenseRun.asset"; private const string MonsterPoolPath = "Assets/_Project/Constants/Defense25DComparison/MonsterPools.asset"; private const string ArtifactDropConstantsPath = "Assets/_Project/Constants/Defense25DComparison/ArtifactDropConstants.asset"; private const string ScenePath = "Assets/_Project/Scenes/Defense25DRun.unity"; [Test] public void SavedRunAssetsReloadAndSceneReferencesTheRunDefinition() { Defense25DWaveDirectorConstants waveConstants = AssetDatabase.LoadAssetAtPath(WaveConstantsPath); Defense25DRunDefinition runDefinition = AssetDatabase.LoadAssetAtPath(RunDefinitionPath); Defense25DMonsterPoolDefinition monsterPool = AssetDatabase.LoadAssetAtPath(MonsterPoolPath); Defense25DArtifactDropConstants artifactDropConstants = AssetDatabase.LoadAssetAtPath(ArtifactDropConstantsPath); Assert.That(waveConstants, Is.Not.Null, "The Wave Director constants must be a persistent standalone asset."); Assert.That(runDefinition, Is.Not.Null, "The long-defense RunDefinition must be a persistent asset."); Assert.That(runDefinition.WaveDirectorConstants, Is.SameAs(waveConstants)); Assert.That(monsterPool, Is.Not.Null); Assert.That(artifactDropConstants, Is.Not.Null); Assert.That(runDefinition.MonsterPoolDefinition, Is.SameAs(monsterPool)); Assert.That(runDefinition.ArtifactDropConstants, Is.SameAs(artifactDropConstants)); Assert.That(runDefinition.PreparationSeconds, Is.EqualTo(20f)); Assert.That(waveConstants.SpawnWindowSeconds, Is.EqualTo(18f)); Assert.That(waveConstants.MicroBreakSeconds, Is.EqualTo(6f)); Assert.That(waveConstants.StrategyBreakEvery, Is.EqualTo(3)); Assert.That(waveConstants.StrategyBreakSeconds, Is.EqualTo(15f)); Assert.That(waveConstants.TelegraphSeconds, Is.EqualTo(8f)); Assert.That(waveConstants.EliteFirstAtSeconds, Is.EqualTo(90f)); Assert.That(waveConstants.EliteIntervalSeconds, Is.EqualTo(90f)); Assert.That(waveConstants.StrongEventMinimumIntervalSeconds, Is.EqualTo(1f)); Assert.That(waveConstants.MidBossTimes, Is.EqualTo(new[] { 240f, 480f })); Assert.That(waveConstants.ThreatCurve.Last().ThreatBudget, Is.EqualTo(84f)); Assert.That(waveConstants.Validate(out string constantsError), Is.True, constantsError); Assert.That(runDefinition.PortalDefinitions.Select(portal => portal.PortalId).Distinct().Count(), Is.EqualTo(12)); Assert.That(runDefinition.PortalDefinitions.All(portal => portal.TelegraphSeconds == 10f), Is.True); Assert.That(runDefinition.PortalDefinitions.Select(portal => portal.OpenAt), Is.EqualTo(new[] { 0f, 0f, 120f, 120f, 240f, 240f, 360f, 360f, 480f, 480f, 600f, 600f })); Assert.That(runDefinition.Validate(out string error), Is.True, error); Scene scene = EditorSceneManager.OpenScene(ScenePath, OpenSceneMode.Additive); try { Defense25DRunSceneProfile[] profiles = scene.GetRootGameObjects() .Select(root => root.GetComponent()) .Where(profile => profile != null) .ToArray(); Assert.That(profiles.Length, Is.EqualTo(1)); Assert.That(profiles[0].RunDefinition, Is.SameAs(runDefinition)); } finally { if (scene.IsValid() && scene.isLoaded) EditorSceneManager.CloseScene(scene, true); } } } }