using NUnit.Framework; using UnityEngine; using Colosseum.AI; namespace Colosseum.Tests { /// /// 가중치 패턴 선택기의 후보 필터링과 가중치 분배를 검증합니다. /// public class WeightedPatternSelectorTests { [Test] public void TrySelectPattern_ReadyCandidatesOnly_AppliesWeightsAfterFiltering() { BossPatternData first = ScriptableObject.CreateInstance(); BossPatternData second = ScriptableObject.CreateInstance(); BossPatternData third = ScriptableObject.CreateInstance(); try { WeightedPatternCandidate[] candidates = { new WeightedPatternCandidate(first, 50f), new WeightedPatternCandidate(second, 30f), new WeightedPatternCandidate(third, 20f), }; bool result = WeightedPatternSelector.TrySelectPattern( candidates, pattern => pattern != first, 0.1f, out BossPatternData selectedPattern); Assert.IsTrue(result, "준비된 후보가 있는데 선택에 실패했습니다."); Assert.AreSame(second, selectedPattern, "준비되지 않은 후보를 제외한 뒤 첫 번째 가중치 후보가 선택되어야 합니다."); } finally { Object.DestroyImmediate(first); Object.DestroyImmediate(second); Object.DestroyImmediate(third); } } [Test] public void TrySelectPattern_UsesDeclaredWeightBands() { BossPatternData combo = ScriptableObject.CreateInstance(); BossPatternData pressure = ScriptableObject.CreateInstance(); BossPatternData tertiary = ScriptableObject.CreateInstance(); BossPatternData secondary = ScriptableObject.CreateInstance(); BossPatternData primary = ScriptableObject.CreateInstance(); try { WeightedPatternCandidate[] candidates = { new WeightedPatternCandidate(combo, 26f), new WeightedPatternCandidate(pressure, 24f), new WeightedPatternCandidate(primary, 22f), new WeightedPatternCandidate(secondary, 16f), new WeightedPatternCandidate(tertiary, 12f), }; Assert.AreSame(combo, Select(candidates, 0.20f)); Assert.AreSame(pressure, Select(candidates, 0.40f)); Assert.AreSame(primary, Select(candidates, 0.60f)); Assert.AreSame(secondary, Select(candidates, 0.80f)); Assert.AreSame(tertiary, Select(candidates, 0.95f)); } finally { Object.DestroyImmediate(combo); Object.DestroyImmediate(pressure); Object.DestroyImmediate(tertiary); Object.DestroyImmediate(secondary); Object.DestroyImmediate(primary); } } private static BossPatternData Select(WeightedPatternCandidate[] candidates, float roll) { bool result = WeightedPatternSelector.TrySelectPattern( candidates, pattern => pattern != null, roll, out BossPatternData selectedPattern); Assert.IsTrue(result, "테스트용 선택이 실패했습니다."); return selectedPattern; } } }