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;
}
}
}