236 lines
8.6 KiB
TypeScript
236 lines
8.6 KiB
TypeScript
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)
|
|
})
|
|
})
|