70 lines
1.7 KiB
Go
70 lines
1.7 KiB
Go
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)
|
||
}
|
||
}
|