//
// Licensed under the MIT License. See LICENSE file in the project root for full license information.
//
namespace MUnique.OpenMU.Tests;
using Moq;
using MUnique.OpenMU.DataModel.Configuration;
using MUnique.OpenMU.DataModel.Configuration.Items;
using MUnique.OpenMU.GameLogic;
using MUnique.OpenMU.GameLogic.Attributes;
///
/// Tests the drop generator.
///
[TestFixture]
public class DropGeneratorTest
{
///
/// Tests if the drop fails because the randomizer returns a number which causes a fail.
///
[Test]
public async ValueTask TestDropFailAsync()
{
var config = this.GetGameConfig();
var generator = new DefaultDropGenerator(config, this.GetRandomizer(9999));
var (items, _) = await generator.GenerateItemDropsAsync(this.GetMonster(1, 0), 0, await PlayerTestHelper.CreatePlayerAsync().ConfigureAwait(false));
var item = items.FirstOrDefault();
Assert.That(item, Is.Null);
}
///
/// Tests the drops defined by a monster are getting considered.
///
[Test]
public async ValueTask TestItemDropItemByMonsterAsync()
{
var config = this.GetGameConfig();
var monster = this.GetMonster(1, 0);
monster.DropItemGroups.AddBasicDropItemGroups();
monster.DropItemGroups.Add(3000, SpecialItemType.RandomItem, true);
var generator = new DefaultDropGenerator(config, this.GetRandomizer2(0, 0.5));
var (items, _) = await generator.GenerateItemDropsAsync(monster, 1, await PlayerTestHelper.CreatePlayerAsync().ConfigureAwait(false));
var item = items.FirstOrDefault();
Assert.That(item, Is.Not.Null);
// ReSharper disable once PossibleNullReferenceException
Assert.That(item!.Definition, Is.EqualTo(monster.DropItemGroups.Last().PossibleItems.First()));
}
///
/// Tests that items with a maximum drop level are filtered from generic monster drops.
///
[Test]
public async ValueTask TestMaximumDropLevelAsync()
{
var config = this.GetGameConfig();
var cappedItem = this.CreateItemDefinition(12, 15, 12, 66);
var uncappedItem = this.CreateItemDefinition(14, 13, 25);
var dropGroup = new Mock();
dropGroup.SetupAllProperties();
dropGroup.Object.Chance = 1.0;
dropGroup.Object.ItemType = SpecialItemType.Jewel;
dropGroup.Setup(g => g.PossibleItems).Returns(new List { cappedItem, uncappedItem });
var player = await PlayerTestHelper.CreatePlayerAsync().ConfigureAwait(false);
player.CurrentMap!.Definition.DropItemGroups.Add(dropGroup.Object);
var generator = new DefaultDropGenerator(config, this.GetRandomizer(0));
var (items, _) = await generator.GenerateItemDropsAsync(this.GetMonster(1, 67), 1, player).ConfigureAwait(false);
var item = items.FirstOrDefault();
Assert.That(item, Is.Not.Null);
Assert.That(item!.Definition, Is.EqualTo(uncappedItem));
}
///
/// Tests the drops defined by a player are getting considered.
///
public void TestItemDropItemByPlayer()
{
// to be implemented
}
///
/// Tests the drops defined by a map are getting considered.
///
public void TestItemDropItemByMap()
{
// to be implemented
}
///
/// Tests that ExcellentItemDropLevelDelta property exists and has correct default.
///
[Test]
public void TestExcellentItemDropLevelDelta_PropertyExists()
{
var config = this.GetGameConfig();
// The initializer sets default to 25 for backward compatibility
config.ExcellentItemDropLevelDelta = 25;
Assert.That(config.ExcellentItemDropLevelDelta, Is.EqualTo(25));
config.ExcellentItemDropLevelDelta = 0;
Assert.That(config.ExcellentItemDropLevelDelta, Is.EqualTo(0));
config.ExcellentItemDropLevelDelta = 50;
Assert.That(config.ExcellentItemDropLevelDelta, Is.EqualTo(50));
}
private MonsterDefinition GetMonster(int numberOfDrops, byte level)
{
var monster = new Mock();
monster.SetupAllProperties();
monster.Setup(m => m.DropItemGroups).Returns(new List());
monster.Setup(m => m.Attributes).Returns(new List());
monster.Object.NumberOfMaximumItemDrops = numberOfDrops;
monster.Object.Attributes.Add(new MonsterAttribute { AttributeDefinition = Stats.Level, Value = level });
return monster.Object;
}
private IRandomizer GetRandomizer(int randomValue)
{
var randomizer = new Mock();
randomizer.Setup(r => r.NextInt(It.IsAny(), It.IsAny())).Returns(randomValue);
randomizer.Setup(r => r.NextDouble()).Returns(randomValue / 10000.0);
return randomizer.Object;
}
private IRandomizer GetRandomizer2(int integerValue, double doubleValue)
{
var randomizer = new Mock();
randomizer.Setup(r => r.NextInt(It.IsAny(), It.IsAny())).Returns(integerValue);
randomizer.Setup(r => r.NextDouble()).Returns(doubleValue);
return randomizer.Object;
}
private GameConfiguration GetGameConfig()
{
var gameConfiguration = new Mock();
gameConfiguration.Setup(c => c.Items).Returns(new List());
return gameConfiguration.Object;
}
private ItemDefinition CreateItemDefinition(byte group, short number, byte dropLevel, byte? maximumDropLevel = null)
{
var itemDefinition = new Mock();
itemDefinition.SetupAllProperties();
itemDefinition.Object.Group = group;
itemDefinition.Object.Number = number;
itemDefinition.Object.DropLevel = dropLevel;
itemDefinition.Object.MaximumDropLevel = maximumDropLevel;
itemDefinition.Object.Durability = 1;
itemDefinition.Setup(d => d.PossibleItemOptions).Returns(new List());
return itemDefinition.Object;
}
}