//
// Licensed under the MIT License. See LICENSE file in the project root for full license information.
//
namespace MUnique.OpenMU.GameLogic.Benchmarks;
using Microsoft.Extensions.Logging.Abstractions;
using Moq;
using MUnique.OpenMU.AttributeSystem;
using MUnique.OpenMU.GameLogic;
using MUnique.OpenMU.GameLogic.Attributes;
using MUnique.OpenMU.GameLogic.Benchmarks.Helpers;
///
/// Benchmarks for class methods related to XP distribution and item drops.
///
[MemoryDiagnoser]
[ThreadingDiagnoser]
[InvocationCount(100)]
public class PartyBenchmarks
{
private Party _party = null!;
private Player _killer = null!;
private IAttackable _killedObject = null!;
private List _players = null!;
///
/// Sets up the benchmark by creating a party with 5 players.
///
[GlobalSetup]
public async Task Setup()
{
var partyManager = new PartyManager(5, new NullLogger());
_party = new Party(partyManager, 5, new NullLogger());
_players = new List();
for (int i = 0; i < 5; i++)
{
var player = await PlayerTestHelper.CreatePlayerAsync();
await player.PlayerState.TryAdvanceToAsync(PlayerState.EnteredWorld).ConfigureAwait(false);
if (player.Attributes is { } attrs)
{
attrs[Stats.Level] = (short)(100 + i);
}
_players.Add(player);
await _party.AddAsync(player).ConfigureAwait(false);
}
_killer = _players[0];
foreach (var player in _players)
{
_killer.Observers.Add(player);
}
_killedObject = CreateMockAttackable(50);
}
///
/// Benchmarks the method.
///
[Benchmark]
public async ValueTask DistributeExperienceAfterKillAsync()
{
await _party.DistributeExperienceAfterKillAsync(_killedObject, _killer);
}
///
/// Benchmarks the method.
///
[Benchmark]
public async ValueTask DistributeMoneyAfterKillAsync()
{
await _party.DistributeMoneyAfterKillAsync(_killedObject, _killer, 10000);
}
///
/// Benchmarks the method.
///
[Benchmark]
public async ValueTask GetQuestDropItemGroupsAsync()
{
await _party.GetQuestDropItemGroupsAsync(_killer);
}
private static IAttackable CreateMockAttackable(float level)
{
var attributes = new Mock();
attributes.Setup(a => a[Stats.Level]).Returns(level);
var result = new Mock();
result.SetupAllProperties();
result.SetupGet(a => a.Attributes).Returns(attributes.Object);
GameMap? nullMap = null;
result.SetupGet(a => a.CurrentMap).Returns(nullMap);
return result.Object;
}
}