dragon-item-parser: introduce item parser library
This commit is contained in:
235
dragon-item-parser/test/item.test.ts
Normal file
235
dragon-item-parser/test/item.test.ts
Normal file
@@ -0,0 +1,235 @@
|
||||
import { describe, it, expect } from 'vitest'
|
||||
import { parseItemStats, parseItem, parseItems } from '../src/item.js'
|
||||
|
||||
describe('parseItemStats', () => {
|
||||
describe('basic stats', () => {
|
||||
it('should parse Move Speed', () => {
|
||||
// Boots (id: 1001)
|
||||
const description =
|
||||
'<mainText><stats><attention> 25</attention> Move Speed</stats><br><br></mainText>'
|
||||
const stats = parseItemStats(description)
|
||||
expect(stats.moveSpeed).toBe(25)
|
||||
})
|
||||
|
||||
it('should parse Attack Damage', () => {
|
||||
// Long Sword (id: 1036)
|
||||
const description =
|
||||
'<mainText><stats><attention> 10</attention> Attack Damage</stats><br><br></mainText>'
|
||||
const stats = parseItemStats(description)
|
||||
expect(stats.attackDamage).toBe(10)
|
||||
})
|
||||
|
||||
it('should parse Ability Power', () => {
|
||||
// Amplifying Tome (id: 1052)
|
||||
const description =
|
||||
'<mainText><stats><attention> 20</attention> Ability Power</stats><br><br></mainText>'
|
||||
const stats = parseItemStats(description)
|
||||
expect(stats.abilityPower).toBe(20)
|
||||
})
|
||||
|
||||
it('should parse Health', () => {
|
||||
// Ruby Crystal (id: 1028)
|
||||
const description =
|
||||
'<mainText><stats><attention> 150</attention> Health</stats><br><br></mainText>'
|
||||
const stats = parseItemStats(description)
|
||||
expect(stats.health).toBe(150)
|
||||
})
|
||||
|
||||
it('should parse Armor', () => {
|
||||
// Cloth Armor (id: 1029)
|
||||
const description =
|
||||
'<mainText><stats><attention> 15</attention> Armor</stats><br><br></mainText>'
|
||||
const stats = parseItemStats(description)
|
||||
expect(stats.armor).toBe(15)
|
||||
})
|
||||
|
||||
it('should parse Magic Resist', () => {
|
||||
// Null-Magic Mantle (id: 1033)
|
||||
const description =
|
||||
'<mainText><stats><attention> 20</attention> Magic Resist</stats><br><br></mainText>'
|
||||
const stats = parseItemStats(description)
|
||||
expect(stats.magicResist).toBe(20)
|
||||
})
|
||||
|
||||
it('should parse Mana', () => {
|
||||
// Sapphire Crystal (id: 1027)
|
||||
const description =
|
||||
'<mainText><stats><attention> 300</attention> Mana</stats><br><br></mainText>'
|
||||
const stats = parseItemStats(description)
|
||||
expect(stats.mana).toBe(300)
|
||||
})
|
||||
})
|
||||
|
||||
describe('percentage stats', () => {
|
||||
it('should parse Attack Speed percentage', () => {
|
||||
// Dagger (id: 1042)
|
||||
const description =
|
||||
'<mainText><stats><attention> 10%</attention> Attack Speed</stats><br><br></mainText>'
|
||||
const stats = parseItemStats(description)
|
||||
expect(stats.attackSpeed).toBe(10)
|
||||
})
|
||||
|
||||
it('should parse Critical Strike Chance', () => {
|
||||
// Cloak of Agility (id: 1018)
|
||||
const description =
|
||||
'<mainText><stats><attention> 15%</attention> Critical Strike Chance</stats><br><br></mainText>'
|
||||
const stats = parseItemStats(description)
|
||||
expect(stats.criticalStrikeChance).toBe(15)
|
||||
})
|
||||
|
||||
it('should parse Life Steal', () => {
|
||||
// Vampiric Scepter (id: 1053)
|
||||
const description =
|
||||
'<mainText><stats><attention> 15</attention> Attack Damage<br><attention> 7%</attention> Life Steal</stats><br><br></mainText>'
|
||||
const stats = parseItemStats(description)
|
||||
expect(stats.attackDamage).toBe(15)
|
||||
expect(stats.lifeSteal).toBe(7)
|
||||
})
|
||||
|
||||
it('should parse Base Mana Regen percentage', () => {
|
||||
// Faerie Charm (id: 1004)
|
||||
const description =
|
||||
'<mainText><stats><attention> 50%</attention> Base Mana Regen</stats><br><br></mainText>'
|
||||
const stats = parseItemStats(description)
|
||||
expect(stats.baseManaRegen).toBe(50)
|
||||
})
|
||||
|
||||
it('should parse Base Health Regen percentage', () => {
|
||||
// Rejuvenation Bead (id: 1006)
|
||||
const description =
|
||||
'<mainText><stats><attention> 100%</attention> Base Health Regen</stats><br><br></mainText>'
|
||||
const stats = parseItemStats(description)
|
||||
expect(stats.baseHealthRegen).toBe(100)
|
||||
})
|
||||
})
|
||||
|
||||
describe('multiple stats', () => {
|
||||
it("should parse multiple stats from Doran's Blade", () => {
|
||||
// Doran's Blade (id: 1055)
|
||||
const description =
|
||||
'<mainText><stats><attention> 10</attention> Attack Damage<br><attention> 80</attention> Health<br><attention> 2.5%</attention> Omnivamp</stats><br><br></mainText>'
|
||||
const stats = parseItemStats(description)
|
||||
expect(stats.attackDamage).toBe(10)
|
||||
expect(stats.health).toBe(80)
|
||||
expect(stats.omnivamp).toBe(2.5)
|
||||
})
|
||||
|
||||
it("should parse multiple stats from Doran's Ring", () => {
|
||||
// Doran's Ring (id: 1056)
|
||||
const description =
|
||||
'<mainText><stats><attention> 18</attention> Ability Power<br><attention> 90</attention> Health</stats><br><br></mainText>'
|
||||
const stats = parseItemStats(description)
|
||||
expect(stats.abilityPower).toBe(18)
|
||||
expect(stats.health).toBe(90)
|
||||
})
|
||||
|
||||
it("should parse multiple stats from Seeker's Armguard", () => {
|
||||
// Seeker's Armguard (id: 2420)
|
||||
const description =
|
||||
'<mainText><stats><attention> 40</attention> Ability Power<br><attention> 25</attention> Armor</stats><br><br></mainText>'
|
||||
const stats = parseItemStats(description)
|
||||
expect(stats.abilityPower).toBe(40)
|
||||
expect(stats.armor).toBe(25)
|
||||
})
|
||||
|
||||
it('should parse complex item with many stats', () => {
|
||||
// Overlord's Bloodmail (id: 2501)
|
||||
const description =
|
||||
'<mainText><stats><attention> 30</attention> Attack Damage<br><attention> 550</attention> Health</stats><br><br></mainText>'
|
||||
const stats = parseItemStats(description)
|
||||
expect(stats.attackDamage).toBe(30)
|
||||
expect(stats.health).toBe(550)
|
||||
})
|
||||
|
||||
it('should parse item with Ability Haste', () => {
|
||||
// Unending Despair (id: 2502)
|
||||
const description =
|
||||
'<mainText><stats><attention> 400</attention> Health<br><attention> 50</attention> Armor<br><attention> 15</attention> Ability Haste</stats><br><br></mainText>'
|
||||
const stats = parseItemStats(description)
|
||||
expect(stats.health).toBe(400)
|
||||
expect(stats.armor).toBe(50)
|
||||
expect(stats.abilityHaste).toBe(15)
|
||||
})
|
||||
|
||||
it('should parse item with Mana and Ability Haste', () => {
|
||||
// Blackfire Torch (id: 2503)
|
||||
const description =
|
||||
'<mainText><stats><attention> 80</attention> Ability Power<br><attention> 600</attention> Mana<br><attention> 20</attention> Ability Haste</stats><br><br></mainText>'
|
||||
const stats = parseItemStats(description)
|
||||
expect(stats.abilityPower).toBe(80)
|
||||
expect(stats.mana).toBe(600)
|
||||
expect(stats.abilityHaste).toBe(20)
|
||||
})
|
||||
})
|
||||
|
||||
describe('edge cases', () => {
|
||||
it('should return empty object for empty description', () => {
|
||||
const stats = parseItemStats('')
|
||||
expect(stats).toEqual({})
|
||||
})
|
||||
|
||||
it('should return empty object for description without stats', () => {
|
||||
const description = '<mainText><stats></stats><br><br></mainText>'
|
||||
const stats = parseItemStats(description)
|
||||
expect(stats).toEqual({})
|
||||
})
|
||||
|
||||
it('should handle description with only passive text', () => {
|
||||
// Emberknife (id: 1035) - no stats, only passives
|
||||
const description =
|
||||
'<mainText><stats></stats><br><br> <passive>7%</passive> Omnivamp against jungle monsters<br><li><passive>Sear:</passive> Damaging jungle monsters burns them for <magicDamage> magic damage</magicDamage> over 5 seconds.</mainText>'
|
||||
const stats = parseItemStats(description)
|
||||
expect(stats).toEqual({})
|
||||
})
|
||||
|
||||
it('should handle decimal values', () => {
|
||||
const description =
|
||||
'<mainText><stats><attention> 2.5%</attention> Omnivamp</stats><br><br></mainText>'
|
||||
const stats = parseItemStats(description)
|
||||
expect(stats.omnivamp).toBe(2.5)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
describe('parseItem', () => {
|
||||
it('should parse item and add stats', () => {
|
||||
const item = {
|
||||
id: 1001,
|
||||
name: 'Boots',
|
||||
description:
|
||||
'<mainText><stats><attention> 25</attention> Move Speed</stats><br><br></mainText>',
|
||||
iconPath: '/path/to/icon.png'
|
||||
}
|
||||
|
||||
const result = parseItem(item)
|
||||
expect(result.id).toBe(1001)
|
||||
expect(result.name).toBe('Boots')
|
||||
expect(result.stats.moveSpeed).toBe(25)
|
||||
})
|
||||
})
|
||||
|
||||
describe('parseItems', () => {
|
||||
it('should parse multiple items', () => {
|
||||
const items = [
|
||||
{
|
||||
id: 1001,
|
||||
name: 'Boots',
|
||||
description:
|
||||
'<mainText><stats><attention> 25</attention> Move Speed</stats><br><br></mainText>',
|
||||
iconPath: '/path/to/boots.png'
|
||||
},
|
||||
{
|
||||
id: 1036,
|
||||
name: 'Long Sword',
|
||||
description:
|
||||
'<mainText><stats><attention> 10</attention> Attack Damage</stats><br><br></mainText>',
|
||||
iconPath: '/path/to/sword.png'
|
||||
}
|
||||
]
|
||||
|
||||
const results = parseItems(items)
|
||||
expect(results).toHaveLength(2)
|
||||
expect(results[0].stats.moveSpeed).toBe(25)
|
||||
expect(results[1].stats.attackDamage).toBe(10)
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user