Files
GoMinecraftBridge/sdk/flatbuffers_test.go

104 lines
3.8 KiB
Go

package sdk
import (
"testing"
flatbuffers "github.com/google/flatbuffers/go"
flat "github.com/yawaflua/GoMinecraftBridge/sdk/internal/fbs/gmb"
)
func TestDecodeTickSnapshot(t *testing.T) {
want := benchmarkSnapshot(3)
encoded := encodeBenchmarkFlatBuffer(want)
got, err := decodeTickSnapshot(encoded)
if err != nil {
t.Fatal(err)
}
if got.Tick != want.Tick || len(got.Entities) != 3 || got.Entities[2].UUID != want.Entities[2].UUID {
t.Fatalf("unexpected decoded snapshot: %#v", got)
}
}
func BenchmarkFlatBuffersSnapshot1000Entities(b *testing.B) {
encoded := encodeBenchmarkFlatBuffer(benchmarkSnapshot(1000))
b.ReportAllocs()
for b.Loop() {
if _, err := decodeTickSnapshot(encoded); err != nil {
b.Fatal(err)
}
}
b.ReportMetric(float64(len(encoded)), "bytes/snapshot")
}
func encodeBenchmarkFlatBuffer(snapshot ServerSnapshot) []byte {
builder := flatbuffers.NewBuilder(16 * 1024)
levels := make([]flatbuffers.UOffsetT, len(snapshot.Levels))
for index, level := range snapshot.Levels {
dimension := builder.CreateString(level.Dimension)
flat.LevelSnapshotStart(builder)
flat.LevelSnapshotAddDimension(builder, dimension)
flat.LevelSnapshotAddGameTime(builder, level.GameTime)
flat.LevelSnapshotAddDayTime(builder, level.DayTime)
flat.LevelSnapshotAddRaining(builder, level.Raining)
flat.LevelSnapshotAddThundering(builder, level.Thundering)
levels[index] = flat.LevelSnapshotEnd(builder)
}
entities := make([]flatbuffers.UOffsetT, len(snapshot.Entities))
for index, entity := range snapshot.Entities {
uuid := builder.CreateString(entity.UUID)
entityType := builder.CreateString(entity.Type)
name := builder.CreateString(entity.Name)
dimension := builder.CreateString(entity.Dimension)
hasHealth := entity.Health != nil && entity.MaxHealth != nil
var health, maxHealth float32
if hasHealth {
health = *entity.Health
maxHealth = *entity.MaxHealth
}
flat.EntitySnapshotStart(builder)
flat.EntitySnapshotAddRuntimeId(builder, int32(entity.RuntimeID))
flat.EntitySnapshotAddUuid(builder, uuid)
flat.EntitySnapshotAddType(builder, entityType)
flat.EntitySnapshotAddName(builder, name)
flat.EntitySnapshotAddDimension(builder, dimension)
flat.EntitySnapshotAddX(builder, entity.X)
flat.EntitySnapshotAddY(builder, entity.Y)
flat.EntitySnapshotAddZ(builder, entity.Z)
flat.EntitySnapshotAddYaw(builder, entity.Yaw)
flat.EntitySnapshotAddPitch(builder, entity.Pitch)
flat.EntitySnapshotAddVelocityX(builder, entity.VelocityX)
flat.EntitySnapshotAddVelocityY(builder, entity.VelocityY)
flat.EntitySnapshotAddVelocityZ(builder, entity.VelocityZ)
flat.EntitySnapshotAddAlive(builder, entity.Alive)
flat.EntitySnapshotAddPlayer(builder, entity.Player)
flat.EntitySnapshotAddHasHealth(builder, hasHealth)
flat.EntitySnapshotAddHealth(builder, health)
flat.EntitySnapshotAddMaxHealth(builder, maxHealth)
entities[index] = flat.EntitySnapshotEnd(builder)
}
flat.ServerSnapshotStartLevelsVector(builder, len(levels))
for index := len(levels) - 1; index >= 0; index-- {
builder.PrependUOffsetT(levels[index])
}
levelVector := builder.EndVector(len(levels))
flat.ServerSnapshotStartEntitiesVector(builder, len(entities))
for index := len(entities) - 1; index >= 0; index-- {
builder.PrependUOffsetT(entities[index])
}
entityVector := builder.EndVector(len(entities))
flat.ServerSnapshotStartBlocksVector(builder, 0)
blockVector := builder.EndVector(0)
flat.ServerSnapshotStart(builder)
flat.ServerSnapshotAddTick(builder, snapshot.Tick)
flat.ServerSnapshotAddTimestampUnixMilli(builder, snapshot.TimestampUnixMilli)
flat.ServerSnapshotAddLevels(builder, levelVector)
flat.ServerSnapshotAddEntities(builder, entityVector)
flat.ServerSnapshotAddBlocks(builder, blockVector)
root := flat.ServerSnapshotEnd(builder)
flat.FinishServerSnapshotBuffer(builder, root)
return builder.FinishedBytes()
}