//
// 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.Items;
using MUnique.OpenMU.DataModel.Entities;
using MUnique.OpenMU.GameLogic;
///
/// Tests the .
///
[TestFixture]
public class StorageTest
{
///
/// Tests the adding of a small item to the upper left corner of the storage.
///
[Test]
public async ValueTask AddItem1X1TopLeftAsync()
{
var itemStorage = this.CreateItemStorage();
var storage = new Storage(12 + 64, 12, 0, itemStorage) as IStorage;
var item = this.GetItem(1, 1);
var added = await storage.AddItemAsync(12, item).ConfigureAwait(false);
Assert.That(added, Is.True);
Assert.That(storage.Items.Contains(item), Is.True);
Assert.That(storage.FreeSlots.Contains((byte)12), Is.False);
}
///
/// Tests adding a 2x2 item to the right bottom corner of the storage.
///
[Test]
public async ValueTask AddItem2X2AtRightBottomAsync()
{
var itemStorage = this.CreateItemStorage();
var storage = new Storage(12 + 64, 12, 0, itemStorage) as IStorage;
var item = this.GetItem(2, 2);
byte slot = 12 + (6 * 8) + 6;
var added = await storage.AddItemAsync(slot, item).ConfigureAwait(false);
Assert.That(added, Is.True);
Assert.That(storage.Items.Contains(item), Is.True);
Assert.That(storage.FreeSlots.Contains(slot), Is.False);
}
///
/// Tests if the adding of the item fails because the same slot is already in use by another item.
///
[Test]
public async ValueTask AddItemFailSpaceInUseAsync()
{
var itemStorage = this.CreateItemStorage();
var storage = new Storage(12 + 64, 12, 0, itemStorage) as IStorage;
await storage.AddItemAsync(12, this.GetItem(1, 1)).ConfigureAwait(false);
var item = this.GetItem(1, 1);
var added = await storage.AddItemAsync(12, item).ConfigureAwait(false);
Assert.That(added, Is.False);
Assert.That(storage.Items.Contains(item), Is.False);
Assert.That(storage.FreeSlots.Contains((byte)12), Is.False);
}
///
/// Tests if the adding of the item one line below another 2x2 item fails.
///
[Test]
public async ValueTask AddItemFailSpaceInUseVerticalAsync()
{
var itemStorage = this.CreateItemStorage();
var storage = new Storage(12 + 64, 12, 0, itemStorage) as IStorage;
var addedItem = this.GetItem(2, 2);
await storage.AddItemAsync(12, addedItem).ConfigureAwait(false);
var added = await storage.AddItemAsync(13, this.GetItem(1, 1)).ConfigureAwait(false);
Assert.That(added, Is.False);
added = await storage.AddItemAsync(12 + 8, this.GetItem(1, 1)).ConfigureAwait(false);
Assert.That(added, Is.False);
Assert.That(storage.Items.Count(), Is.EqualTo(1));
Assert.That(storage.Items.Contains(addedItem), Is.True);
Assert.That(storage.FreeSlots.Contains((byte)12), Is.False);
Assert.That(storage.FreeSlots.Contains((byte)13), Is.False);
Assert.That(storage.FreeSlots.Contains((byte)(12 + 8)), Is.False);
Assert.That(storage.FreeSlots.Contains((byte)(13 + 8)), Is.False);
}
///
/// Tests if adding an 2x1 item at the right border fails,
/// because the left part of the item would hang over.
///
[Test]
public async ValueTask AddItem2X1FailRightBorderAsync()
{
var itemStorage = this.CreateItemStorage();
var storage = new Storage(12 + 64, 12, 0, itemStorage) as IStorage;
var added = await storage.AddItemAsync(12 + 7, this.GetItem(2, 1)).ConfigureAwait(false);
Assert.That(added, Is.False);
Assert.That(storage.FreeSlots.Contains((byte)(12 + 7)), Is.True);
}
///
/// Tests if adding an 1x2 item at the bottom border fails,
/// because the bottom part of the item would hang over.
///
[Test]
public async ValueTask AddItem1X2FailBottomAsync()
{
var itemStorage = this.CreateItemStorage();
var storage = new Storage(12 + 64, 12, 0, itemStorage) as IStorage;
var added = await storage.AddItemAsync(12 + (7 * 8), this.GetItem(1, 2)).ConfigureAwait(false);
Assert.That(added, Is.False);
Assert.That(storage.FreeSlots.Contains((byte)(12 + (7 * 8))), Is.True);
}
private ItemDefinition GetItemDefintion(byte width, byte heigth)
{
var itemDefinition = new ItemDefinition
{
Durability = 100,
Width = width,
Height = heigth,
};
return itemDefinition;
}
private Item GetItem(byte width, byte heigth)
{
var item = new Item { Definition = this.GetItemDefintion(width, heigth) };
item.Durability = item.Definition.Durability;
return item;
}
private ItemStorage CreateItemStorage()
{
var storage = new Mock();
storage.Setup(s => s.Items).Returns(new List- ());
return storage.Object;
}
}