test(opl): remove brittle OPL attribute golden tests from #2501
These property-value tests assert exact cliloc/value/order of OPL emission per item base. Their value was transitional: #2501 wrote them to lock the emitted-line set across the de-interleaving rewire, and that refactor has landed. Kept around, they become a permanent tax on modding - any admin who reorders an emission, changes a value, or adds an attribute line gets a red build for simple, in-client-visible behavior that isn't complex or controversial. The one non-trivial case they covered (LowerStatReq) is the one that just broke, and it broke because the test was wrong. Remove the whole Tests/PropertyList/ set (helper included; used nowhere else). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
326dc470de
commit
3f305f9da7
10 changed files with 0 additions and 474 deletions
|
|
@ -1,58 +0,0 @@
|
|||
using System;
|
||||
using System.Buffers.Binary;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
using Xunit;
|
||||
|
||||
namespace UOContent.Tests;
|
||||
|
||||
[Collection("Sequential UOContent Tests")]
|
||||
public class AosArmorAttributesPropertiesTests
|
||||
{
|
||||
private static Dictionary<int, string> Decode(ObjectPropertyList opl)
|
||||
{
|
||||
opl.Terminate();
|
||||
var buffer = opl.Buffer;
|
||||
var map = new Dictionary<int, string>();
|
||||
var pos = 15;
|
||||
while (true)
|
||||
{
|
||||
var cliloc = BinaryPrimitives.ReadInt32BigEndian(buffer.AsSpan(pos));
|
||||
pos += 4;
|
||||
if (cliloc == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
var byteLen = BinaryPrimitives.ReadUInt16BigEndian(buffer.AsSpan(pos));
|
||||
pos += 2;
|
||||
map[cliloc] = Encoding.Unicode.GetString(buffer, pos, byteLen);
|
||||
pos += byteLen;
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void EmitsMageArmorAndSelfRepair_DoesNotReadLowerStatReqOrDurabilityFromContainer()
|
||||
{
|
||||
var attrs = new AosArmorAttributes(null)
|
||||
{
|
||||
MageArmor = 1,
|
||||
SelfRepair = 4,
|
||||
LowerStatReq = 50, // container value must NOT be auto-emitted (it's passed in by the consumer)
|
||||
DurabilityBonus = 10 // never emitted by this method
|
||||
};
|
||||
|
||||
var opl = new ObjectPropertyList(null);
|
||||
attrs.GetProperties(opl); // no lowerStatReq arg
|
||||
var map = Decode(opl);
|
||||
|
||||
Assert.Equal("", map[1060437]); // MageArmor (no-arg)
|
||||
Assert.Equal("4", map[1060450]); // SelfRepair
|
||||
Assert.False(map.ContainsKey(1060435)); // LowerStatReq NOT read from container
|
||||
Assert.False(map.ContainsKey(1060410)); // DurabilityBonus excluded
|
||||
}
|
||||
}
|
||||
|
|
@ -1,75 +0,0 @@
|
|||
using System;
|
||||
using System.Buffers.Binary;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
using Xunit;
|
||||
|
||||
namespace UOContent.Tests;
|
||||
|
||||
[Collection("Sequential UOContent Tests")]
|
||||
public class AosAttributesPropertiesTests
|
||||
{
|
||||
private static Dictionary<int, string> Decode(ObjectPropertyList opl)
|
||||
{
|
||||
opl.Terminate();
|
||||
var buffer = opl.Buffer;
|
||||
var map = new Dictionary<int, string>();
|
||||
var pos = 15;
|
||||
while (true)
|
||||
{
|
||||
var cliloc = BinaryPrimitives.ReadInt32BigEndian(buffer.AsSpan(pos));
|
||||
pos += 4;
|
||||
if (cliloc == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
var byteLen = BinaryPrimitives.ReadUInt16BigEndian(buffer.AsSpan(pos));
|
||||
pos += 2;
|
||||
map[cliloc] = Encoding.Unicode.GetString(buffer, pos, byteLen);
|
||||
pos += byteLen;
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void EmitsRawAttributesInCanonicalOrder()
|
||||
{
|
||||
var attrs = new AosAttributes(null)
|
||||
{
|
||||
DefendChance = 5,
|
||||
BonusStr = 10,
|
||||
NightSight = 1,
|
||||
SpellChanneling = 1,
|
||||
WeaponSpeed = 7
|
||||
};
|
||||
|
||||
var opl = new ObjectPropertyList(null);
|
||||
attrs.GetProperties(opl);
|
||||
var map = Decode(opl);
|
||||
|
||||
Assert.Equal("5", map[1060408]); // DefendChance
|
||||
Assert.Equal("10", map[1060485]); // BonusStr
|
||||
Assert.Equal("", map[1060441]); // NightSight (no-arg)
|
||||
Assert.Equal("", map[1060482]); // SpellChanneling (no-arg)
|
||||
Assert.Equal("7", map[1060486]); // WeaponSpeed
|
||||
Assert.False(map.ContainsKey(1060401)); // WeaponDamage not set
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AppliesComputedBonuses()
|
||||
{
|
||||
var attrs = new AosAttributes(null) { WeaponDamage = 10, AttackChance = 4, Luck = 100 };
|
||||
|
||||
var opl = new ObjectPropertyList(null);
|
||||
attrs.GetProperties(opl, damageBonus: 5, hitChanceBonus: 3, luckBonus: 50);
|
||||
var map = Decode(opl);
|
||||
|
||||
Assert.Equal("15", map[1060401]); // WeaponDamage + damageBonus
|
||||
Assert.Equal("7", map[1060415]); // AttackChance + hitChanceBonus
|
||||
Assert.Equal("150", map[1060436]); // Luck + luckBonus
|
||||
}
|
||||
}
|
||||
|
|
@ -1,61 +0,0 @@
|
|||
using System;
|
||||
using System.Buffers.Binary;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
using Xunit;
|
||||
|
||||
namespace UOContent.Tests;
|
||||
|
||||
[Collection("Sequential UOContent Tests")]
|
||||
public class AosWeaponAttributesPropertiesTests
|
||||
{
|
||||
private static Dictionary<int, string> Decode(ObjectPropertyList opl)
|
||||
{
|
||||
opl.Terminate();
|
||||
var buffer = opl.Buffer;
|
||||
var map = new Dictionary<int, string>();
|
||||
var pos = 15;
|
||||
while (true)
|
||||
{
|
||||
var cliloc = BinaryPrimitives.ReadInt32BigEndian(buffer.AsSpan(pos));
|
||||
pos += 4;
|
||||
if (cliloc == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
var byteLen = BinaryPrimitives.ReadUInt16BigEndian(buffer.AsSpan(pos));
|
||||
pos += 2;
|
||||
map[cliloc] = Encoding.Unicode.GetString(buffer, pos, byteLen);
|
||||
pos += byteLen;
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void EmitsHitEffectsUseBestSkillMageWeaponSelfRepair()
|
||||
{
|
||||
var attrs = new AosWeaponAttributes(null)
|
||||
{
|
||||
UseBestSkill = 1,
|
||||
HitFireball = 12,
|
||||
HitLeechHits = 20,
|
||||
MageWeapon = 25,
|
||||
SelfRepair = 3
|
||||
};
|
||||
|
||||
var opl = new ObjectPropertyList(null);
|
||||
attrs.GetProperties(opl);
|
||||
var map = Decode(opl);
|
||||
|
||||
Assert.Equal("", map[1060400]); // UseBestSkill (no-arg)
|
||||
Assert.Equal("12", map[1060420]); // HitFireball
|
||||
Assert.Equal("20", map[1060422]); // HitLeechHits
|
||||
Assert.Equal("5", map[1060438]); // MageWeapon => 30 - 25
|
||||
Assert.Equal("3", map[1060450]); // SelfRepair
|
||||
Assert.False(map.ContainsKey(1060435)); // LowerStatReq is emitted inline by the weapon, not by GetProperties
|
||||
}
|
||||
}
|
||||
|
|
@ -1,40 +0,0 @@
|
|||
using Server.Items;
|
||||
using Xunit;
|
||||
|
||||
namespace UOContent.Tests;
|
||||
|
||||
[Collection("Sequential UOContent Tests")]
|
||||
public class BaseArmorPropertiesTests
|
||||
{
|
||||
[Fact]
|
||||
public void Armor_AttributeLineSet_Preserved()
|
||||
{
|
||||
var armor = new PlateChest();
|
||||
try
|
||||
{
|
||||
armor.Attributes.DefendChance = 5;
|
||||
armor.Attributes.BonusDex = 8;
|
||||
armor.Attributes.Luck = 40;
|
||||
armor.Attributes.SpellChanneling = 1;
|
||||
armor.Attributes.IncreasedKarmaLoss = 2;
|
||||
armor.ArmorAttributes.MageArmor = 1;
|
||||
armor.ArmorAttributes.SelfRepair = 3;
|
||||
armor.ArmorAttributes.LowerStatReq = 50;
|
||||
|
||||
var map = ItemOplTestHelper.DecodeAttributeLines(armor);
|
||||
|
||||
Assert.Equal("5", map[1060408]); // DefendChance
|
||||
Assert.Equal("8", map[1060409]); // BonusDex
|
||||
Assert.Equal("40", map[1060436]); // Luck (GetLuckBonus()==0 unequipped)
|
||||
Assert.Equal("", map[1060482]); // SpellChanneling
|
||||
Assert.Equal("2", map[1075210]); // IncreasedKarmaLoss
|
||||
Assert.Equal("", map[1060437]); // MageArmor
|
||||
Assert.Equal("3", map[1060450]); // SelfRepair
|
||||
Assert.Equal("50", map[1060435]); // LowerStatReq (inline via GetLowerStatReq)
|
||||
}
|
||||
finally
|
||||
{
|
||||
armor.Delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
using Server.Items;
|
||||
using Xunit;
|
||||
|
||||
namespace UOContent.Tests;
|
||||
|
||||
[Collection("Sequential UOContent Tests")]
|
||||
public class BaseClothingPropertiesTests
|
||||
{
|
||||
[Fact]
|
||||
public void Clothing_AttributeLineSet_Preserved()
|
||||
{
|
||||
var shirt = new FancyShirt();
|
||||
try
|
||||
{
|
||||
shirt.Attributes.DefendChance = 5;
|
||||
shirt.Attributes.Luck = 25;
|
||||
shirt.Attributes.SpellChanneling = 1;
|
||||
shirt.ClothingAttributes.MageArmor = 1;
|
||||
shirt.ClothingAttributes.SelfRepair = 2;
|
||||
shirt.ClothingAttributes.LowerStatReq = 30;
|
||||
shirt.ClothingAttributes.DurabilityBonus = 15;
|
||||
|
||||
var map = ItemOplTestHelper.DecodeAttributeLines(shirt);
|
||||
|
||||
Assert.Equal("5", map[1060408]); // DefendChance
|
||||
Assert.Equal("25", map[1060436]); // Luck (raw)
|
||||
Assert.Equal("", map[1060482]); // SpellChanneling
|
||||
Assert.Equal("", map[1060437]); // MageArmor
|
||||
Assert.Equal("2", map[1060450]); // SelfRepair
|
||||
Assert.Equal("30", map[1060435]); // LowerStatReq (direct)
|
||||
Assert.Equal("15", map[1060410]); // DurabilityBonus (direct)
|
||||
}
|
||||
finally
|
||||
{
|
||||
shirt.Delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,36 +0,0 @@
|
|||
using Server.Items;
|
||||
using Xunit;
|
||||
|
||||
namespace UOContent.Tests;
|
||||
|
||||
[Collection("Sequential UOContent Tests")]
|
||||
public class BaseJewelPropertiesTests
|
||||
{
|
||||
[Fact]
|
||||
public void Jewel_AttributeLineSet_Preserved()
|
||||
{
|
||||
var ring = new GoldRing();
|
||||
try
|
||||
{
|
||||
ring.Attributes.DefendChance = 5;
|
||||
ring.Attributes.BonusStr = 10;
|
||||
ring.Attributes.Luck = 100;
|
||||
ring.Attributes.NightSight = 1;
|
||||
ring.Attributes.SpellChanneling = 1;
|
||||
ring.Attributes.IncreasedKarmaLoss = 3;
|
||||
|
||||
var map = ItemOplTestHelper.DecodeAttributeLines(ring);
|
||||
|
||||
Assert.Equal("5", map[1060408]); // DefendChance
|
||||
Assert.Equal("10", map[1060485]); // BonusStr
|
||||
Assert.Equal("100", map[1060436]); // Luck (raw; jewel has no luck bonus)
|
||||
Assert.Equal("", map[1060441]); // NightSight
|
||||
Assert.Equal("", map[1060482]); // SpellChanneling
|
||||
Assert.Equal("3", map[1075210]); // IncreasedKarmaLoss (Core.ML EJ)
|
||||
}
|
||||
finally
|
||||
{
|
||||
ring.Delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,42 +0,0 @@
|
|||
using Server.Items;
|
||||
using Xunit;
|
||||
|
||||
namespace UOContent.Tests;
|
||||
|
||||
[Collection("Sequential UOContent Tests")]
|
||||
public class BaseTalismanPropertiesTests
|
||||
{
|
||||
[Fact]
|
||||
public void GetProperties_EmitsAosAttributeLines()
|
||||
{
|
||||
var item = new RandomTalisman();
|
||||
try
|
||||
{
|
||||
item.Attributes.DefendChance = 10;
|
||||
item.Attributes.BonusStr = 5;
|
||||
item.Attributes.Luck = 50;
|
||||
item.Attributes.NightSight = 1;
|
||||
item.Attributes.SpellChanneling = 1;
|
||||
item.Attributes.IncreasedKarmaLoss = 2;
|
||||
|
||||
var lines = ItemOplTestHelper.DecodeAttributeLines(item);
|
||||
|
||||
Assert.True(lines.ContainsKey(1060408)); // DefendChance
|
||||
Assert.Equal("10", lines[1060408]);
|
||||
Assert.True(lines.ContainsKey(1060485)); // BonusStr
|
||||
Assert.Equal("5", lines[1060485]);
|
||||
Assert.True(lines.ContainsKey(1060436)); // Luck
|
||||
Assert.Equal("50", lines[1060436]);
|
||||
Assert.True(lines.ContainsKey(1060441)); // NightSight
|
||||
Assert.Equal("", lines[1060441]);
|
||||
Assert.True(lines.ContainsKey(1060482)); // SpellChanneling
|
||||
Assert.Equal("", lines[1060482]);
|
||||
Assert.True(lines.ContainsKey(1075210)); // IncreasedKarmaLoss
|
||||
Assert.Equal("2", lines[1075210]);
|
||||
}
|
||||
finally
|
||||
{
|
||||
item.Delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
using Server.Items;
|
||||
using Xunit;
|
||||
|
||||
namespace UOContent.Tests;
|
||||
|
||||
[Collection("Sequential UOContent Tests")]
|
||||
public class BaseWeaponPropertiesTests
|
||||
{
|
||||
[Fact]
|
||||
public void Weapon_AttributeLineSet_Preserved()
|
||||
{
|
||||
var weapon = new Longsword();
|
||||
try
|
||||
{
|
||||
weapon.Attributes.DefendChance = 5;
|
||||
weapon.Attributes.BonusInt = 6;
|
||||
weapon.Attributes.SpellChanneling = 1;
|
||||
weapon.WeaponAttributes.UseBestSkill = 1;
|
||||
weapon.WeaponAttributes.HitFireball = 12;
|
||||
weapon.WeaponAttributes.MageWeapon = 25;
|
||||
weapon.WeaponAttributes.SelfRepair = 3;
|
||||
|
||||
var map = ItemOplTestHelper.DecodeAttributeLines(weapon);
|
||||
|
||||
Assert.Equal("5", map[1060408]); // DefendChance
|
||||
Assert.Equal("6", map[1060432]); // BonusInt
|
||||
Assert.Equal("", map[1060482]); // SpellChanneling
|
||||
Assert.Equal("", map[1060400]); // UseBestSkill
|
||||
Assert.Equal("12", map[1060420]); // HitFireball
|
||||
Assert.Equal("5", map[1060438]); // MageWeapon (30 - 25)
|
||||
Assert.Equal("3", map[1060450]); // SelfRepair
|
||||
}
|
||||
finally
|
||||
{
|
||||
weapon.Delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
using System;
|
||||
using System.Buffers.Binary;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using Server;
|
||||
|
||||
namespace UOContent.Tests;
|
||||
|
||||
public static class ItemOplTestHelper
|
||||
{
|
||||
// Builds the item's OPL and returns attribute/property cliloc lines (>= 1060000),
|
||||
// ignoring base-item lines (name, weight, etc.) so tests isolate the attribute surface.
|
||||
public static Dictionary<int, string> DecodeAttributeLines(Item item)
|
||||
{
|
||||
var opl = new ObjectPropertyList(item);
|
||||
item.GetProperties(opl);
|
||||
opl.Terminate();
|
||||
|
||||
var buffer = opl.Buffer;
|
||||
var map = new Dictionary<int, string>();
|
||||
var pos = 15;
|
||||
while (true)
|
||||
{
|
||||
var cliloc = BinaryPrimitives.ReadInt32BigEndian(buffer.AsSpan(pos));
|
||||
pos += 4;
|
||||
if (cliloc == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
var byteLen = BinaryPrimitives.ReadUInt16BigEndian(buffer.AsSpan(pos));
|
||||
pos += 2;
|
||||
var arg = Encoding.Unicode.GetString(buffer, pos, byteLen);
|
||||
pos += byteLen;
|
||||
|
||||
if (cliloc is >= 1060000 and < 1080000)
|
||||
{
|
||||
map[cliloc] = arg;
|
||||
}
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,42 +0,0 @@
|
|||
using Server.Items;
|
||||
using Xunit;
|
||||
|
||||
namespace UOContent.Tests;
|
||||
|
||||
[Collection("Sequential UOContent Tests")]
|
||||
public class SpellbookPropertiesTests
|
||||
{
|
||||
[Fact]
|
||||
public void GetProperties_EmitsAosAttributeLines()
|
||||
{
|
||||
var item = new Spellbook();
|
||||
try
|
||||
{
|
||||
item.Attributes.CastRecovery = 3;
|
||||
item.Attributes.LowerManaCost = 8;
|
||||
item.Attributes.Luck = 75;
|
||||
item.Attributes.NightSight = 1;
|
||||
item.Attributes.SpellChanneling = 1;
|
||||
item.Attributes.IncreasedKarmaLoss = 2;
|
||||
|
||||
var lines = ItemOplTestHelper.DecodeAttributeLines(item);
|
||||
|
||||
Assert.True(lines.ContainsKey(1060412)); // CastRecovery
|
||||
Assert.Equal("3", lines[1060412]);
|
||||
Assert.True(lines.ContainsKey(1060433)); // LowerManaCost
|
||||
Assert.Equal("8", lines[1060433]);
|
||||
Assert.True(lines.ContainsKey(1060436)); // Luck
|
||||
Assert.Equal("75", lines[1060436]);
|
||||
Assert.True(lines.ContainsKey(1060441)); // NightSight
|
||||
Assert.Equal("", lines[1060441]);
|
||||
Assert.True(lines.ContainsKey(1060482)); // SpellChanneling
|
||||
Assert.Equal("", lines[1060482]);
|
||||
Assert.True(lines.ContainsKey(1075210)); // IncreasedKarmaLoss
|
||||
Assert.Equal("2", lines[1075210]);
|
||||
}
|
||||
finally
|
||||
{
|
||||
item.Delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue