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 = ' 25 Move Speed

' const stats = parseItemStats(description) expect(stats.moveSpeed).toBe(25) }) it('should parse Attack Damage', () => { // Long Sword (id: 1036) const description = ' 10 Attack Damage

' const stats = parseItemStats(description) expect(stats.attackDamage).toBe(10) }) it('should parse Ability Power', () => { // Amplifying Tome (id: 1052) const description = ' 20 Ability Power

' const stats = parseItemStats(description) expect(stats.abilityPower).toBe(20) }) it('should parse Health', () => { // Ruby Crystal (id: 1028) const description = ' 150 Health

' const stats = parseItemStats(description) expect(stats.health).toBe(150) }) it('should parse Armor', () => { // Cloth Armor (id: 1029) const description = ' 15 Armor

' const stats = parseItemStats(description) expect(stats.armor).toBe(15) }) it('should parse Magic Resist', () => { // Null-Magic Mantle (id: 1033) const description = ' 20 Magic Resist

' const stats = parseItemStats(description) expect(stats.magicResist).toBe(20) }) it('should parse Mana', () => { // Sapphire Crystal (id: 1027) const description = ' 300 Mana

' const stats = parseItemStats(description) expect(stats.mana).toBe(300) }) }) describe('percentage stats', () => { it('should parse Attack Speed percentage', () => { // Dagger (id: 1042) const description = ' 10% Attack Speed

' const stats = parseItemStats(description) expect(stats.attackSpeed).toBe(10) }) it('should parse Critical Strike Chance', () => { // Cloak of Agility (id: 1018) const description = ' 15% Critical Strike Chance

' const stats = parseItemStats(description) expect(stats.criticalStrikeChance).toBe(15) }) it('should parse Life Steal', () => { // Vampiric Scepter (id: 1053) const description = ' 15 Attack Damage
7% Life Steal


' 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 = ' 50% Base Mana Regen

' const stats = parseItemStats(description) expect(stats.baseManaRegen).toBe(50) }) it('should parse Base Health Regen percentage', () => { // Rejuvenation Bead (id: 1006) const description = ' 100% Base Health Regen

' 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 = ' 10 Attack Damage
80 Health
2.5% Omnivamp


' 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 = ' 18 Ability Power
90 Health


' 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 = ' 40 Ability Power
25 Armor


' 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 = ' 30 Attack Damage
550 Health


' 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 = ' 400 Health
50 Armor
15 Ability Haste


' 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 = ' 80 Ability Power
600 Mana
20 Ability Haste


' 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 = '

' const stats = parseItemStats(description) expect(stats).toEqual({}) }) it('should handle description with only passive text', () => { // Emberknife (id: 1035) - no stats, only passives const description = '

7% Omnivamp against jungle monsters
  • Sear: Damaging jungle monsters burns them for magic damage over 5 seconds.' const stats = parseItemStats(description) expect(stats).toEqual({}) }) it('should handle decimal values', () => { const description = ' 2.5% Omnivamp

    ' 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: ' 25 Move Speed

    ', 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: ' 25 Move Speed

    ', iconPath: '/path/to/boots.png' }, { id: 1036, name: 'Long Sword', description: ' 10 Attack Damage

    ', 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) }) })