forked from omicron/d2warehouse
142 lines
5.7 KiB
Python
142 lines
5.7 KiB
Python
import unittest
|
|
from d2warehouse.parser import parse_item
|
|
from d2warehouse.item import Quality, lookup_runeword
|
|
|
|
|
|
class ParseItemTest(unittest.TestCase):
|
|
def test_gem(self):
|
|
# chipped diamond
|
|
data = bytes.fromhex("1000a0000524740910")
|
|
data, item = parse_item(data)
|
|
self.assertEqual(data, b"")
|
|
self.assertEqual(item.code, "gcw")
|
|
self.assertEqual(item.pos_x, 9)
|
|
self.assertEqual(item.pos_y, 0)
|
|
self.assertTrue(item.is_simple)
|
|
|
|
def test_buckler(self):
|
|
# white buckler
|
|
data = bytes.fromhex("10008000050054a1083f57a9190c01041818fc07")
|
|
data, item = parse_item(data)
|
|
self.assertEqual(data, b"")
|
|
self.assertEqual(item.code, "buc")
|
|
self.assertEqual(item.pos_x, 0)
|
|
self.assertEqual(item.pos_y, 0)
|
|
self.assertEqual(item.quality, Quality.NORMAL)
|
|
self.assertFalse(item.is_simple)
|
|
self.assertEqual(item.lvl, 12)
|
|
|
|
def test_rune(self):
|
|
# tal rune
|
|
data = bytes.fromhex("1000a0000564f67cfb00")
|
|
data, item = parse_item(data)
|
|
self.assertEqual(data, b"")
|
|
self.assertEqual(item.code, "r07")
|
|
self.assertEqual(item.pos_x, 9)
|
|
self.assertEqual(item.pos_y, 9)
|
|
self.assertTrue(item.is_simple)
|
|
|
|
def test_rare_a(self):
|
|
# random rare armor
|
|
data = bytes.fromhex(
|
|
"10008000050014df17c64083c30b866d534c958c39d15b42c0c1e1c08815cd9c04f80dff01"
|
|
)
|
|
data, item = parse_item(data)
|
|
self.assertEqual(data, b"")
|
|
self.assertEqual(item.code, "hla")
|
|
self.assertEqual(item.pos_x, 0)
|
|
self.assertEqual(item.pos_y, 0)
|
|
self.assertEqual(item.quality, Quality.RARE)
|
|
self.assertFalse(item.is_simple)
|
|
self.assertEqual(item.lvl, 5)
|
|
self.assertEqual(len(item.stats), 4)
|
|
self.assertEqual(item.defense, 23)
|
|
self.assertEqual(item.durability, 28)
|
|
self.assertEqual(item.max_durability, 28)
|
|
|
|
def test_tp_tome(self):
|
|
data = bytes.fromhex("100080000500d4a814daf7275a180240e03f")
|
|
data, item = parse_item(data)
|
|
self.assertEqual(data, b"")
|
|
self.assertEqual(item.code, "tbk")
|
|
self.assertEqual(item.quantity, 4)
|
|
|
|
def test_superior_sockets(self):
|
|
# superior armor with empty sockets
|
|
data = bytes.fromhex("10088000050014df175043b1b90cc38d80e3834070b004f41f")
|
|
data, item = parse_item(data)
|
|
self.assertEqual(data, b"")
|
|
self.assertEqual(item.quality, Quality.HIGH)
|
|
self.assertEqual(len(item.stats), 2)
|
|
self.assertEqual(len(item.sockets), 2)
|
|
|
|
def test_ed_max(self):
|
|
# test bugfix for https://gitlab.com/omicron-oss/d2warehouse/-/issues/1
|
|
data = bytes.fromhex(
|
|
"10008000050094e6095cd89f590b23557340c2629612233cf09010a14183094260109c6866232080cc7f"
|
|
)
|
|
data, item = parse_item(data)
|
|
self.assertEqual(data, b"")
|
|
self.assertEqual(item.code, "spr")
|
|
self.assertEqual(str(item.stats[0]), "+13% Enhanced Damage")
|
|
self.assertEqual(str(item.stats[2]), "+2 to Maximum Damage")
|
|
|
|
def test_runeword_lore(self):
|
|
# Lore: Ort Sol
|
|
data = bytes.fromhex(
|
|
"1008800405c055c637f1073af4558697412981070881506049e87f005516fb134582ff1000a0003500e07cbb001000a0003504e07c9800"
|
|
)
|
|
data, item = parse_item(data)
|
|
self.assertEqual(data, b"")
|
|
self.assertTrue(item.is_runeword)
|
|
self.assertEqual(len(item.sockets), 2)
|
|
item.sockets[0].print()
|
|
item.sockets[1].print()
|
|
self.assertEqual(item.sockets[0].code, "r09")
|
|
self.assertEqual(item.sockets[1].code, "r12")
|
|
rw = lookup_runeword(item.runeword_id)
|
|
self.assertEqual(rw["name"], "Lore")
|
|
self.assertEqual(str(item.stats[4]), "+1 to All Skills") # runeword stat
|
|
self.assertEqual(str(item.stats[2]), "+10 to Energy") # runeword stat
|
|
# TODO: sol rune stat -- should it be in representation?
|
|
# self.assertEqual(str(item.sockets[1].stats[0]), "Lightning Resist 30%")
|
|
|
|
def test_item_with_implicit(self):
|
|
# A 3 socket heraldic shield with 13 all res
|
|
data = bytes.fromhex(
|
|
"10088000054074be6dd0113247e788182002141273a25a8a6a2baab5a8f61f"
|
|
)
|
|
data, item = parse_item(data)
|
|
self.assertEqual(data, b"")
|
|
self.assertEqual(item.implicit, 24) # Rainbow, 8-15 all res
|
|
self.assertEqual(str(item.stats[0]), "Fire Resist +13%")
|
|
self.assertEqual(str(item.stats[1]), "Lightning Resist +13%")
|
|
self.assertEqual(str(item.stats[2]), "Cold Resist +13%")
|
|
self.assertEqual(str(item.stats[3]), "Poison Resist +13%")
|
|
|
|
def test_stackable_weapon(self):
|
|
data = bytes.fromhex("10208000054814dddb852a79b4708640408096ff")
|
|
data, item = parse_item(data)
|
|
self.assertEqual(data, b"")
|
|
|
|
def test_token_of_absolution(self):
|
|
# this is one of the items that had stackable "0" instead of ""
|
|
data = bytes.fromhex("100080000524d4fc5f308dc1e10908fe03")
|
|
data, item = parse_item(data)
|
|
|
|
def test_stat_to_class_skills(self):
|
|
# Redeemer with +2 to Paladin skill levels
|
|
data = bytes.fromhex(
|
|
"1000800005c4d593081e37d107dfa330c868881031e29429cb6d415953466bf8eccd1c3aa13ce9fe03"
|
|
)
|
|
data, item = parse_item(data)
|
|
self.assertEqual(data, b"")
|
|
self.assertEqual(str(item.stats[1]), "+2 to Paladin Skill Levels")
|
|
# Jalal with +2 to Druid skills levels
|
|
data = bytes.fromhex(
|
|
"1000800005c4753c2f5c4c4e3d638f8fd0068a08006802d020ac3a612e85b915e65a989b528d91dd41a1a8c02b0540ff01"
|
|
)
|
|
data, item = parse_item(data)
|
|
self.assertEqual(data, b"")
|
|
self.assertEqual(str(item.stats[7]), "+2 to Druid Skill Levels")
|