Files
ngzz-mc/internal/block/registry_test.go

74 lines
1.9 KiB
Go
Raw Normal View History

package block
import (
"path/filepath"
"testing"
)
// blocksPath 指向仓库 assets/config/blocks.json(测试运行目录为 internal/block)。
var blocksPath = filepath.Join("..", "..", "assets", "config", "blocks.json")
// TestLoad 验证注册表加载与 ID 解析。
func TestLoad(t *testing.T) {
r, err := Load(blocksPath)
if err != nil {
t.Fatalf("加载注册表失败: %v", err)
}
id, ok := r.ID("stone")
if !ok || id != 1 {
t.Fatalf("stone ID 期望 1,实际 %d (ok=%v)", id, ok)
}
if r.Name(1) != "stone" {
t.Fatalf("ID 1 名称期望 stone,实际 %q", r.Name(1))
}
}
// TestStates 验证状态打包/解包与判定表(单一来源)。
func TestStates(t *testing.T) {
r, err := Load(blocksPath)
if err != nil {
t.Fatalf("加载注册表失败: %v", err)
}
torch, _ := r.ID("torch")
water, _ := r.ID("water")
stone, _ := r.ID("stone")
s := NewState(torch, 3)
if s.ID() != torch || s.Meta() != 3 {
t.Fatalf("状态打包/解包异常: %+v", s)
}
if r.Light(s) != 14 {
t.Fatalf("火把亮度期望 14,实际 %d", r.Light(s))
}
if r.IsOpaque(s) {
t.Fatal("火把不应完全遮光")
}
if !r.IsOpaque(NewState(stone, 0)) {
t.Fatal("石头应完全遮光")
}
if r.IsSolid(NewState(water, 0)) {
t.Fatal("水不应为实体碰撞方块")
}
if !r.IsFluid(NewState(water, 0)) {
t.Fatal("水应为液体")
}
if Air.ID() != 0 {
t.Fatalf("空气 ID 期望 0")
}
}
// TestTexture 验证纹理键解析(all 面回退)。
func TestTexture(t *testing.T) {
r, err := Load(blocksPath)
if err != nil {
t.Fatalf("加载注册表失败: %v", err)
}
grass, _ := r.ID("grass_block")
if tex := r.Texture(NewState(grass, 0), "up"); tex != "block/grass_block_top" {
t.Fatalf("草方块顶面纹理期望 block/grass_block_top,实际 %q", tex)
}
if tex := r.Texture(NewState(grass, 0), "down"); tex != "block/dirt" {
t.Fatalf("草方块底面纹理期望 block/dirt,实际 %q", tex)
}
}