RegionIO/internal/worldgen/structure_template_test.go

66 lines
2.1 KiB
Go

package worldgen
import (
"os"
"path/filepath"
"testing"
)
// TestLoadRuinedPortalTemplate loads a real vanilla template from the
// extracted datapack data and checks that every block resolves and that the
// transform keeps points inside the rotated bounding box.
func TestLoadRuinedPortalTemplate(t *testing.T) {
path := filepath.Join("data", "structure_template", "ruined_portal", "portal_1.nbt")
if _, err := os.Stat(path); err != nil {
t.Skipf("template data not installed: %v", err)
}
blocks, size, err := LoadResolvedTemplate(path, func(name string, props map[string]string) (uint16, bool) {
// The resolver is not under test here; accept every palette entry.
return 1, true
})
if err != nil {
t.Fatal(err)
}
if len(blocks) == 0 {
t.Fatal("template parsed to zero blocks")
}
if size[0] <= 0 || size[1] <= 0 || size[2] <= 0 {
t.Fatalf("implausible size %v", size)
}
for _, b := range blocks {
if b.Pos[0] < 0 || b.Pos[0] >= size[0] || b.Pos[1] < 0 || b.Pos[1] >= size[1] || b.Pos[2] < 0 || b.Pos[2] >= size[2] {
t.Fatalf("block %v outside size %v", b.Pos, size)
}
}
pivot := [3]int{size[0] / 2, 0, size[2] / 2}
for rotation := 0; rotation < 4; rotation++ {
for _, mirror := range []string{"none", "front_back"} {
for _, b := range blocks {
out := TransformBlockPos(b.Pos, mirror, rotation, pivot)
if out[1] != b.Pos[1] {
t.Fatalf("transform moved Y: %v -> %v", b.Pos, out)
}
}
}
}
// A clockwise quarter turn around the pivot maps (x,z) per the bytecode's
// target-172 formula: x' = px + pz - z, z' = pz - px + x.
got := TransformBlockPos([3]int{0, 5, 3}, "none", 1, pivot)
wantX := pivot[0] + pivot[2] - 3
wantZ := pivot[1]*0 + pivot[2] - pivot[0] + 0
if got[0] != wantX || got[2] != wantZ {
t.Fatalf("clockwise_90 of (0,5,3) = %v, want (%d,5,%d)", got, wantX, wantZ)
}
}
func TestMthGetSeedMatchesKnownShape(t *testing.T) {
// Sanity only: the seed is signed arithmetic; assert determinism plus the
// documented shift structure.
a := MthGetSeed(10, -40, 7)
b := MthGetSeed(10, -40, 7)
if a != b {
t.Fatalf("positional seed unstable: %d vs %d", a, b)
}
}