using System.Linq; using BumpCombat.Constants; using NUnit.Framework; using UnityEditor; using UnityEngine; namespace BumpCombat.Tests { public sealed class Defense25DMonsterPoolPrefabAssetTests { private const string PoolPath = "Assets/_Project/Constants/Defense25DComparison/MonsterPools.asset"; private const string PrefabRoot = "Assets/_Project/Prefabs/Defense25DMonsters/Roster25D-v1/"; [Test] public void EveryAllowedSpeciesHasADistinctVisualPrefabWithASprite() { GameObject existingPrefab = AssetDatabase.LoadAssetAtPath("Assets/_Project/Prefabs/Enemies/Slime.prefab"); Assert.That(existingPrefab, Is.Not.Null, "The existing Slime prefab must load as the control asset."); Assert.That(PrefabUtility.IsPartOfPrefabAsset(existingPrefab), Is.True, $"The existing prefab control was not recognized: {AssetDatabase.GetAssetPath(existingPrefab)} / {PrefabUtility.GetPrefabAssetType(existingPrefab)}."); Defense25DMonsterPoolDefinition pool = AssetDatabase.LoadAssetAtPath(PoolPath); Assert.That(pool, Is.Not.Null, $"Missing pool asset at {PoolPath}."); Assert.That(pool.TryValidate(out string validationError), Is.True, validationError); var entries = pool.Tiers.SelectMany(tier => tier.Entries).ToArray(); Assert.That(entries.Length, Is.EqualTo(28)); Assert.That(entries.Select(entry => entry.VisualPrefab).All(prefab => prefab != null), Is.True); Assert.That(entries.Select(entry => entry.VisualPrefab).Distinct().Count(), Is.EqualTo(28)); foreach (Defense25DMonsterPoolEntry entry in entries) { GameObject prefab = entry.VisualPrefab; string assetPath = AssetDatabase.GetAssetPath(prefab); GlobalObjectId globalId = GlobalObjectId.GetGlobalObjectIdSlow(prefab); string assetGuid = AssetDatabase.AssetPathToGUID(assetPath); TestContext.WriteLine($"{entry.EnemyDefinitionId}: path={assetPath}; globalObjectId={globalId}; prefabAsset={PrefabUtility.IsPartOfPrefabAsset(prefab)}"); Assert.That(PrefabUtility.IsPartOfPrefabAsset(prefab), Is.True, $"{entry.EnemyDefinitionId}: {assetPath} / {PrefabUtility.GetPrefabAssetType(prefab)} / persistent={EditorUtility.IsPersistent(prefab)} / {globalId}."); Assert.That(assetPath, Does.StartWith(PrefabRoot), entry.EnemyDefinitionId); Assert.That(globalId.ToString(), Does.Contain(assetGuid), $"GlobalObjectId doesn't identify the prefab asset for {entry.EnemyDefinitionId}."); SpriteRenderer renderer = prefab.GetComponent(); Assert.That(renderer, Is.Not.Null, $"{entry.EnemyDefinitionId} prefab has no root SpriteRenderer."); Assert.That(renderer.sprite, Is.Not.Null, $"{entry.EnemyDefinitionId} prefab has no Idle sprite."); } } } }