Commit exhaustive vanilla worldgen fixture

This commit is contained in:
Daniar Mannanov 2026-08-10 23:54:04 +03:00
parent 064f0f1cca
commit be8f030698
9 changed files with 223 additions and 14 deletions

View file

@ -6,6 +6,7 @@ import (
"io"
"math"
"os"
"sort"
"strconv"
"strings"
"testing"
@ -27,7 +28,7 @@ func TestVanillaBlockParity(t *testing.T) {
if _, err := io.ReadFull(f, header[:]); err != nil {
t.Fatal(err)
}
if string(header[:8]) != "RIOPAR01" {
if string(header[:8]) != "RIOPAR02" {
t.Fatalf("bad parity fixture magic %q", header[:8])
}
seed := int64(binary.BigEndian.Uint64(header[8:16]))
@ -36,6 +37,10 @@ func TestVanillaBlockParity(t *testing.T) {
t.Fatalf("fixture seed=%d chunks=%d", seed, count)
}
gen := NewVanillaGenerator(seed)
type statePair struct{ got, want uint16 }
pairs := make(map[statePair]int)
var blockTotal, blockExact, biomeTotal, biomeExact, heightTotal, heightExact int
var fluidMismatch, oreMismatch int
for chunkIndex := 0; chunkIndex < count; chunkIndex++ {
var coords [8]byte
if _, err := io.ReadFull(f, coords[:]); err != nil {
@ -52,8 +57,18 @@ func TestVanillaBlockParity(t *testing.T) {
t.Fatal(err)
}
want := binary.BigEndian.Uint16(state[:])
if got := chunk.GetBlock(x, y, z); got != want {
t.Fatalf("chunk (%d,%d) block (%d,%d,%d): got state %d want %d", cx, cz, x, y, z, got, want)
got := chunk.GetBlock(x, y, z)
blockTotal++
if got == want {
blockExact++
} else {
pairs[statePair{got, want}]++
if isFluidState(got) || isFluidState(want) {
fluidMismatch++
}
if isOreState(got) || isOreState(want) {
oreMismatch++
}
}
}
}
@ -65,17 +80,81 @@ func TestVanillaBlockParity(t *testing.T) {
t.Fatal(err)
}
want := binary.BigEndian.Uint16(state[:])
if got := chunk.GetBiome(x, y, z); got != want {
t.Fatalf("chunk (%d,%d) biome (%d,%d,%d): got %d want %d", cx, cz, x, y, z, got, want)
biomeTotal++
if got := chunk.GetBiome(x, y, z); got == want {
biomeExact++
}
}
}
}
heightmaps := chunk.ParityHeightmaps()
for kind := range heightmaps {
for idx, got := range heightmaps[kind] {
if _, err := io.ReadFull(f, state[:]); err != nil {
t.Fatal(err)
}
want := int16(binary.BigEndian.Uint16(state[:]))
heightTotal++
if got == want {
heightExact++
} else if os.Getenv("REGIONIO_REQUIRE_PARITY") == "1" && heightTotal < 4 {
t.Logf("heightmap %d chunk (%d,%d) column %d: got %d want %d", kind, cx, cz, idx, got, want)
}
}
}
}
var trailing [1]byte
if n, err := f.Read(trailing[:]); n != 0 || err != io.EOF {
t.Fatalf("fixture has trailing data or read error: n=%d err=%v", n, err)
}
type pairCount struct {
pair statePair
count int
}
top := make([]pairCount, 0, len(pairs))
for pair, n := range pairs {
top = append(top, pairCount{pair, n})
}
sort.Slice(top, func(i, j int) bool { return top[i].count > top[j].count })
if len(top) > 12 {
top = top[:12]
}
for _, mismatch := range top {
t.Logf("block mismatch %d: %s (%d) -> %s (%d)", mismatch.count,
stateLabel(mismatch.pair.got), mismatch.pair.got, stateLabel(mismatch.pair.want), mismatch.pair.want)
}
t.Logf("block exact %d/%d (%.3f%%), biome exact %d/%d (%.3f%%), heightmaps exact %d/%d (%.3f%%), fluid mismatches %d, ore mismatches %d",
blockExact, blockTotal, percent(blockExact, blockTotal), biomeExact, biomeTotal, percent(biomeExact, biomeTotal),
heightExact, heightTotal, percent(heightExact, heightTotal), fluidMismatch, oreMismatch)
// The ordinary CI profile is a regression floor while the port is still
// incomplete. REGIONIO_REQUIRE_PARITY upgrades the same exhaustive audit to
// exact equality; there is no sampled or summary-only comparison path.
if percent(blockExact, blockTotal) < 90 || biomeExact != biomeTotal || heightExact != heightTotal {
t.Fatalf("vanilla parity regressed below the committed baseline")
}
if os.Getenv("REGIONIO_REQUIRE_PARITY") == "1" && (blockExact != blockTotal || biomeExact != biomeTotal || heightExact != heightTotal) {
t.Fatalf("vanilla parity failed: %d block, %d biome, %d heightmap mismatches",
blockTotal-blockExact, biomeTotal-biomeExact, heightTotal-heightExact)
}
}
func percent(exact, total int) float64 {
if total == 0 {
return 100
}
return 100 * float64(exact) / float64(total)
}
func stateLabel(id uint16) string {
if state, ok := stateByID(id); ok {
return state.Name
}
return "unknown"
}
func isOreState(id uint16) bool {
state, ok := stateByID(id)
return ok && (strings.HasSuffix(state.Name, "_ore") || strings.HasPrefix(state.Name, "minecraft:raw_"))
}
// TestVanillaParity compares our generated surface heights against heights