Validate battle save equipment state

This commit is contained in:
2026-07-05 11:46:17 +09:00
parent 1b6a8aea4c
commit 288fb839d1
3 changed files with 60 additions and 5 deletions

View File

@@ -17,7 +17,13 @@ try {
mapHeight: 8,
validUnitIds: new Set(['liu-bei', 'guan-yu', 'rebel-1']),
validUsableIds: new Set(['roar', 'fireTactic', 'aid', 'bean', 'salve', 'wine']),
validItemIds: new Set(['bean', 'salve', 'wine'])
validItemIds: new Set(['bean', 'salve', 'wine']),
validEquipmentItemIds: new Set(['training-sword', 'cloth-armor', 'grain-pouch']),
validEquipmentSlotItems: {
weapon: new Set(['training-sword']),
armor: new Set(['cloth-armor']),
accessory: new Set(['grain-pouch'])
}
};
const validState = createValidBattleSaveState();
const patchUnit = (index, patch) => validState.units.map((unit, unitIndex) => (unitIndex === index ? { ...unit, ...patch } : unit));
@@ -50,6 +56,12 @@ try {
['invalid unit hp', { units: patchUnit(0, { hp: 99, maxHp: 30 }) }],
['invalid unit x', { units: patchUnit(0, { x: 12 }) }],
['invalid unit direction', { units: patchUnit(0, { direction: 'down' }) }],
['missing equipment slot', { units: patchUnit(0, { equipment: { weapon: createEquipmentSet().weapon, armor: createEquipmentSet().armor } }) }],
['extra equipment slot', { units: patchUnit(0, { equipment: { ...createEquipmentSet(), charm: createEquipmentSet().accessory } }) }],
['unknown equipment item id', { units: patchUnit(0, { equipment: { ...createEquipmentSet(), weapon: { itemId: 'phantom-sword', level: 1, exp: 0 } } }) }],
['wrong equipment slot item id', { units: patchUnit(0, { equipment: { ...createEquipmentSet(), weapon: { itemId: 'cloth-armor', level: 1, exp: 0 } } }) }],
['invalid equipment level', { units: patchUnit(0, { equipment: { ...createEquipmentSet(), weapon: { itemId: 'training-sword', level: 0, exp: 0 } } }) }],
['invalid equipment exp', { units: patchUnit(0, { equipment: { ...createEquipmentSet(), weapon: { itemId: 'training-sword', level: 1, exp: -1 } } }) }],
['unknown unit id', { units: patchUnit(0, { id: 'ghost-unit' }) }],
['duplicate unit id', { units: [validState.units[0], { ...validState.units[0], x: 2 }, validState.units[2]] }],
['invalid bonds', { bonds: [{ ...validState.bonds[0], unitIds: ['liu-bei'] }] }],
@@ -113,7 +125,7 @@ function createValidBattleSaveState() {
x: 1,
y: 2,
direction: 'south',
equipment: {}
equipment: createEquipmentSet()
},
{
id: 'guan-yu',
@@ -126,7 +138,7 @@ function createValidBattleSaveState() {
x: 2,
y: 2,
direction: 'south',
equipment: {}
equipment: createEquipmentSet()
},
{
id: 'rebel-1',
@@ -139,7 +151,7 @@ function createValidBattleSaveState() {
x: 8,
y: 4,
direction: 'west',
equipment: {}
equipment: createEquipmentSet()
}
],
bonds: [
@@ -187,6 +199,14 @@ function createValidBattleSaveState() {
};
}
function createEquipmentSet() {
return {
weapon: { itemId: 'training-sword', level: 1, exp: 0 },
armor: { itemId: 'cloth-armor', level: 1, exp: 0 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
};
}
function assert(condition, message) {
if (!condition) {
throw new Error(message);