ModernUO/Projects/UOContent.Tests/Tests/Items/PrizedPropertyTests.cs
2026-07-08 23:10:13 +02:00

220 lines
7.5 KiB
C#

using System;
using System.Collections.Generic;
using Server;
using Server.Items;
using Server.Mobiles;
using Server.Text;
using Xunit;
namespace UOContent.Tests;
[Collection("Sequential UOContent Tests")]
public class PrizedPropertyTests
{
private const int PrizedCliloc = 1154910;
[Fact]
public void NegativeAttributes_StoresAndDupesPrizedOnSupportedFamilies()
{
AssertStoresAndDupesPrized(new TestKatana(), new TestKatana());
AssertStoresAndDupesPrized(new LeatherChest(), new LeatherChest());
AssertStoresAndDupesPrized(new Buckler(), new Buckler());
AssertStoresAndDupesPrized(new GoldRing(), new GoldRing());
}
[Fact]
public void GetProperties_GatesPrizedTooltipToHighSeasOnSupportedFamilies()
{
var previousExpansion = Core.Expansion;
var items = CreateSupportedItems();
try
{
foreach (var item in items)
{
GetNegativeAttributes(item).Prized = 1;
Core.Expansion = Expansion.ML;
var preHighSeas = new RecordingPropertyList();
item.GetProperties(preHighSeas);
Assert.DoesNotContain(preHighSeas.Numbers, number => number == PrizedCliloc);
Core.Expansion = Expansion.HS;
var highSeas = new RecordingPropertyList();
item.GetProperties(highSeas);
Assert.Contains(highSeas.Numbers, number => number == PrizedCliloc);
}
}
finally
{
Core.Expansion = previousExpansion;
DeleteItems(items);
}
}
[Fact]
public void GetInsuranceCost_DoublesPrizedItemsOnlyInHighSeas()
{
var previousExpansion = Core.Expansion;
var normal = new TestKatana();
var prized = new TestKatana();
try
{
prized.NegativeAttributes.Prized = 1;
Core.Expansion = Expansion.ML;
Assert.Equal(600, PlayerMobile.GetInsuranceCost(prized));
Assert.False(NegativeAttributes.IsPrized(prized));
Core.Expansion = Expansion.HS;
Assert.Equal(600, PlayerMobile.GetInsuranceCost(normal));
Assert.Equal(1200, PlayerMobile.GetInsuranceCost(prized));
Assert.True(NegativeAttributes.IsPrized(prized));
}
finally
{
Core.Expansion = previousExpansion;
normal.Delete();
prized.Delete();
}
}
[Fact]
public void Prized_DoesNotChangeBlessedCursedOrInsuranceState()
{
var previousExpansion = Core.Expansion;
var weapon = new TestKatana();
try
{
Core.Expansion = Expansion.HS;
weapon.NegativeAttributes.Prized = 1;
Assert.Equal(LootType.Regular, weapon.LootType);
Assert.False(weapon.Insured);
Assert.False(weapon.PaidInsurance);
Assert.Null(weapon.BlessedFor);
}
finally
{
Core.Expansion = previousExpansion;
weapon.Delete();
}
}
[Fact]
public void RunicAttributeGeneration_DoesNotRollPrized()
{
var previousExpansion = Core.Expansion;
var weapon = new TestKatana();
var armor = new LeatherChest();
var jewel = new GoldRing();
try
{
Core.Expansion = Expansion.HS;
BaseRunicTool.ApplyAttributesTo(weapon, false, 0, 25, 100, 100);
BaseRunicTool.ApplyAttributesTo(armor, false, 0, 25, 100, 100);
BaseRunicTool.ApplyAttributesTo(jewel, false, 0, 25, 100, 100);
Assert.Equal(0, weapon.NegativeAttributes.Prized);
Assert.Equal(0, armor.NegativeAttributes.Prized);
Assert.Equal(0, jewel.NegativeAttributes.Prized);
}
finally
{
Core.Expansion = previousExpansion;
weapon.Delete();
armor.Delete();
jewel.Delete();
}
}
private static void AssertStoresAndDupesPrized<TItem>(TItem source, TItem dupe) where TItem : Item
{
try
{
GetNegativeAttributes(source).Prized = 1;
source.Dupe(dupe);
Assert.Equal(1, GetNegativeAttributes(source).Prized);
Assert.Equal(1, GetNegativeAttributes(dupe).Prized);
}
finally
{
source.Delete();
dupe.Delete();
}
}
private static Item[] CreateSupportedItems() =>
[
new TestKatana(),
new LeatherChest(),
new Buckler(),
new GoldRing()
];
private static NegativeAttributes GetNegativeAttributes(Item item) => item switch
{
BaseWeapon weapon => weapon.NegativeAttributes,
BaseArmor armor => armor.NegativeAttributes,
BaseJewel jewel => jewel.NegativeAttributes,
_ => throw new ArgumentException($"Unsupported Prized host: {item.GetType().FullName}", nameof(item))
};
private static void DeleteItems(IEnumerable<Item> items)
{
foreach (var item in items)
{
item.Delete();
}
}
private class TestKatana : Katana
{
}
private sealed class RecordingPropertyList : IPropertyList
{
private string _interpolated = string.Empty;
public List<int> Numbers { get; } = [];
public void Reset()
{
}
public void Terminate()
{
}
public void Add(int number) => Numbers.Add(number);
public void Add(int number, string argument) => Numbers.Add(number);
public void Add(ReadOnlySpan<char> argument) => Numbers.Add(0);
public void Add(int number, ReadOnlySpan<char> argument) => Numbers.Add(number);
public void AddChunked(ReadOnlySpan<char> text) => Numbers.Add(0);
public OplTextBlock TextBlock() => new(this);
public void Add(int number, int value) => Numbers.Add(number);
public void AddLocalized(int value) => Numbers.Add(0);
public void AddLocalized(int number, int value) => Numbers.Add(number);
public void Add(ref IPropertyList.InterpolatedStringHandler handler) => Numbers.Add(0);
public void Add(int number, ref IPropertyList.InterpolatedStringHandler handler) => Numbers.Add(number);
public void InitializeInterpolation(int literalLength, int formattedCount) => _interpolated = string.Empty;
public void AppendLiteral(string value) => _interpolated += value;
public void AppendFormatted<T>(T value) => _interpolated += value;
public void AppendFormatted<T>(T value, string format) => _interpolated += value is IFormattable formattable ? formattable.ToString(format, null) : value;
public void AppendFormatted<T>(T value, int alignment) => _interpolated += value;
public void AppendFormatted<T>(T value, int alignment, string format) =>
_interpolated += value is IFormattable formattable ? formattable.ToString(format, null) : value;
public void AppendFormatted(ReadOnlySpan<char> value) => _interpolated += value.ToString();
public void AppendFormatted(ReadOnlySpan<char> value, int alignment, string format = null) =>
_interpolated += value.ToString();
public void AppendFormatted(object value, int alignment = 0, string format = null) => _interpolated += value;
public void AppendFormatted(string value) => _interpolated += value;
public void AppendFormatted(string value, int alignment, string format = null) => _interpolated += value;
}
}