Files
AdamuSw/tests/MUnique.OpenMU.GameLogic.Benchmarks/PartyBenchmarks.cs
2026-07-14 19:00:35 +03:00

100 lines
3.1 KiB
C#

// <copyright file="PartyBenchmarks.cs" company="MUnique">
// Licensed under the MIT License. See LICENSE file in the project root for full license information.
// </copyright>
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;
/// <summary>
/// Benchmarks for <see cref="Party"/> class methods related to XP distribution and item drops.
/// </summary>
[MemoryDiagnoser]
[ThreadingDiagnoser]
[InvocationCount(100)]
public class PartyBenchmarks
{
private Party _party = null!;
private Player _killer = null!;
private IAttackable _killedObject = null!;
private List<Player> _players = null!;
/// <summary>
/// Sets up the benchmark by creating a party with 5 players.
/// </summary>
[GlobalSetup]
public async Task Setup()
{
var partyManager = new PartyManager(5, new NullLogger<Party>());
_party = new Party(partyManager, 5, new NullLogger<Party>());
_players = new List<Player>();
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);
}
/// <summary>
/// Benchmarks the <see cref="Party.DistributeExperienceAfterKillAsync"/> method.
/// </summary>
[Benchmark]
public async ValueTask DistributeExperienceAfterKillAsync()
{
await _party.DistributeExperienceAfterKillAsync(_killedObject, _killer);
}
/// <summary>
/// Benchmarks the <see cref="Party.DistributeMoneyAfterKillAsync"/> method.
/// </summary>
[Benchmark]
public async ValueTask DistributeMoneyAfterKillAsync()
{
await _party.DistributeMoneyAfterKillAsync(_killedObject, _killer, 10000);
}
/// <summary>
/// Benchmarks the <see cref="Party.GetQuestDropItemGroupsAsync"/> method.
/// </summary>
[Benchmark]
public async ValueTask GetQuestDropItemGroupsAsync()
{
await _party.GetQuestDropItemGroupsAsync(_killer);
}
private static IAttackable CreateMockAttackable(float level)
{
var attributes = new Mock<IAttributeSystem>();
attributes.Setup(a => a[Stats.Level]).Returns(level);
var result = new Mock<IAttackable>();
result.SetupAllProperties();
result.SetupGet(a => a.Attributes).Returns(attributes.Object);
GameMap? nullMap = null;
result.SetupGet(a => a.CurrentMap).Returns(nullMap);
return result.Object;
}
}