add unit test for directSection

This commit is contained in:
Tnze
2020-05-19 14:41:01 +08:00
parent 32527442ed
commit 39c9525525
2 changed files with 49 additions and 1 deletions

View File

@ -112,7 +112,7 @@ func (d *directSection) SetBlock(x, y, z int, s BlockStatus) {
padding := offset % 64
const maxUint64 = 1<<64 - 1
mask := uint64(maxUint64<<(padding+d.bpb) | (1<<padding - 1))
d.data[offset/64] = uint64(d.data[offset/64])&mask | uint64(s)<<padding
d.data[offset/64] = d.data[offset/64]&mask | uint64(s)<<padding
if padding > 64-d.bpb {
l := padding - (64 - d.bpb)
d.data[offset/64+1] = d.data[offset/64+1]&(maxUint64<<l) | uint64(s)>>(64-padding)

48
bot/world/chunk_test.go Normal file
View File

@ -0,0 +1,48 @@
package world
import (
"github.com/Tnze/go-mc/data"
"math/rand"
"testing"
)
func newDirectSection(bpb int) *directSection {
return &directSection{
bpb: bpb,
data: make([]uint64, 16*16*16*bpb/64),
}
}
func TestDirectSection(t *testing.T) {
for bpb := 3; bpb <= data.BitsPerBlock; bpb++ {
s := newDirectSection(bpb)
for _, dataset := range [][16 * 16 * 16]BlockStatus{secData(bpb), randData(bpb)} {
for i := 0; i < 16*16*16; i++ {
s.SetBlock(i%16, i/16%16, i/16/16, dataset[i])
}
for i := 0; i < 16*16*16; i++ {
if s := s.GetBlock(i%16, i/16%16, i/16/16); dataset[i] != s {
t.Fatalf("direct section error: want: %v, get %v", dataset[i], s)
}
}
}
}
}
func secData(bpb int) (data [16 * 16 * 16]BlockStatus) {
mask := 1<<bpb - 1
var v int
for i := range data {
data[i] = BlockStatus(v)
v = (v + 1) & mask
}
return
}
func randData(bpb int) (data [16 * 16 * 16]BlockStatus) {
data = secData(bpb)
rand.Shuffle(len(data), func(i, j int) {
data[i], data[j] = data[j], data[i]
})
return
}