This commit is contained in:
Rainer Leit
2026-09-25 17:02:24 +03:00
parent cc43ed8dc8
commit 9597629951
2149 changed files with 460234 additions and 1770 deletions
@@ -0,0 +1,74 @@
package fluvial
import (
"testing"
"salty/terrain/internal/world"
)
// The whole point of the move from an index hash to a position hash: a planet is solved one landmass at a
// time, so the same physical cell turns up in grids of different widths at different offsets. If the jitter
// disagreed between them, every place two frames met would show a line.
func TestJitterFollowsThePositionNotTheIndex(t *testing.T) {
p, err := world.New(512, 8, 100, 50, 2, 512)
if err != nil {
t.Fatal(err)
}
// Two frames of different widths, both covering planet column 5, row 7.
a := Grid{W: 16, H: 16}
a.SetSeed(11)
a.SetFrame(world.Frame{P: p, X0: 0, Y0: 0, W: 16, H: 16})
b := Grid{W: 9, H: 12}
b.SetSeed(11)
b.SetFrame(world.Frame{P: p, X0: 3, Y0: 4, W: 9, H: 12})
for k := int32(0); k < 9; k++ {
ja := hashXY(a.seed, a.worldX(5), a.worldY(7), k)
jb := hashXY(b.seed, b.worldX(2), b.worldY(3), k)
if ja != jb {
t.Fatalf("k=%d: frame a gives %v, frame b gives %v for the same planet cell", k, ja, jb)
}
}
// And it must still be a hash: the neighbouring cell gets an unrelated value.
if hashXY(a.seed, a.worldX(5), a.worldY(7), 0) == hashXY(a.seed, a.worldX(6), a.worldY(7), 0) {
t.Error("neighbouring cells hash the same")
}
}
// A frame that straddles the seam sees the same positions as one that does not.
func TestJitterWrapsAtTheSeam(t *testing.T) {
p, err := world.New(512, 8, 100, 50, 0, 512)
if err != nil {
t.Fatal(err)
}
at := Grid{W: 8, H: 8}
at.SetSeed(3)
at.SetFrame(world.Frame{P: p, X0: 60, Y0: 0, W: 8, H: 8})
origin := Grid{W: 8, H: 8}
origin.SetSeed(3)
origin.SetFrame(world.Frame{P: p, X0: 0, Y0: 0, W: 8, H: 8})
// The seam frame's column 4 is planet column 0, which is the origin frame's column 0.
if got, want := at.worldX(4), origin.worldX(0); got != want {
t.Fatalf("world column = %d, want %d", got, want)
}
if hashXY(at.seed, at.worldX(4), at.worldY(2), 0) != hashXY(origin.seed, origin.worldX(0), origin.worldY(2), 0) {
t.Error("the same planet cell jitters differently on either side of the seam")
}
}
// Without a frame a grid is its own world at the origin, which is what the square canvas is and what every
// existing test relies on.
func TestNoFrameMeansTheGridIsTheWorld(t *testing.T) {
g := Grid{W: 8, H: 8}
g.SetSeed(1)
if got := g.worldX(7); got != 7 {
t.Errorf("worldX(7) = %d, want 7", got)
}
if got := g.worldY(3); got != 3 {
t.Errorf("worldY(3) = %d, want 3", got)
}
}