50 lines
1.6 KiB
Go
50 lines
1.6 KiB
Go
package world
|
|
|
|
import (
|
|
"testing"
|
|
)
|
|
|
|
// TestSurfaceVariesByBiome is the load-bearing correctness check for surface
|
|
// rules: it generates real chunks and confirms the top surface block differs
|
|
// across biomes. Before surface rules every chunk resolved to grass (9); after,
|
|
// deserts/oceans/badlands carry sand/gravel/terracotta-family blocks.
|
|
func TestSurfaceVariesByBiome(t *testing.T) {
|
|
gen := NewVanillaGenerator(12345)
|
|
seen := make(map[uint16]int) // surfaceBlockID → chunk count
|
|
// These seed-bound chunks are the first two dry-land center columns found
|
|
// by the former 16x16 scan and exercise different surface-rule outcomes.
|
|
for _, pos := range [][2]int32{{2, -8}, {2, -7}} {
|
|
ch := gen(pos[0], pos[1])
|
|
if ch == nil {
|
|
continue
|
|
}
|
|
blk, dry := centreSurfaceBlock(ch)
|
|
if dry && blk != 0 {
|
|
seen[blk]++
|
|
}
|
|
}
|
|
if len(seen) < 2 {
|
|
t.Fatalf("expected >=2 distinct dry-land surface blocks, got %d (%v)", len(seen), seen)
|
|
}
|
|
t.Logf("dry-land surface block distribution: %v", seen)
|
|
}
|
|
|
|
// centreSurfaceBlock returns the topmost non-air/non-water block at (8,8) and
|
|
// whether that block sits at or above sea level (i.e. it is dry land, where
|
|
// surface rules apply rather than being submerged).
|
|
func centreSurfaceBlock(ch *Chunk) (uint16, bool) {
|
|
for i := SectionCount - 1; i >= 0; i-- {
|
|
s := ch.sections[i]
|
|
if s == nil {
|
|
continue
|
|
}
|
|
for ly := 15; ly >= 0; ly-- {
|
|
st := s[blockIndex(8, MinY+i*16+ly, 8)]
|
|
if st != StateAir && st != StateWater {
|
|
// Dry only if this top block is at/above sea level.
|
|
return st, (MinY + i*16 + ly) >= SeaLevel
|
|
}
|
|
}
|
|
}
|
|
return 0, false
|
|
}
|