package inventory import ( "path/filepath" "testing" "mc/internal/item" ) // loadItemReg 加载物品注册表。 func loadItemReg(t *testing.T) *item.Registry { t.Helper() r, err := item.Load(filepath.Join("..", "..", "assets", "config", "items.json")) if err != nil { t.Fatalf("加载物品注册表失败: %v", err) } return r } // TestMerge 验证合并规则(物品与背包.md §3 规则表)。 func TestMerge(t *testing.T) { reg := loadItemReg(t) inv := New(reg) // 放入 30 个木板 → 合并到 34 个 rem := inv.Add(item.Stack{Name: "oak_planks", Count: 30}) if !rem.Empty() { t.Fatal("30 个木板应全部放入") } rem = inv.Add(item.Stack{Name: "oak_planks", Count: 34}) if !rem.Empty() { t.Fatal("34 个木板应合并入同一槽") } // 64 上限:再放 10 应进入新槽(槽 0 已满 64) rem = inv.Add(item.Stack{Name: "oak_planks", Count: 10}) if !rem.Empty() { t.Fatalf("剩余期望空,实际 %d", rem.Count) } if inv.Slots[1].Name != "oak_planks" || inv.Slots[1].Count != 10 { t.Fatalf("槽 1 期望 10 个木板,实际 %+v", inv.Slots[1]) } } // TestRemove 验证取出物品。 func TestRemove(t *testing.T) { reg := loadItemReg(t) inv := New(reg) inv.Add(item.Stack{Name: "stick", Count: 16}) if !inv.Remove("stick", 5) { t.Fatal("应能取出 5 个") } if inv.Remove("stick", 20) { t.Fatal("不足 20 个不应成功") } if !inv.Remove("stick", 11) { t.Fatal("应能取出剩余 11 个") } } // TestSelected 验证选中槽。 func TestSelected(t *testing.T) { reg := loadItemReg(t) inv := New(reg) inv.Slots[3] = item.Stack{Name: "torch", Count: 8} inv.Selected = 3 if s := inv.SelectedStack(); s.Name != "torch" || s.Count != 8 { t.Fatalf("选中槽异常: %+v", s) } }