415 lines
8.3 KiB
Go
415 lines
8.3 KiB
Go
package level_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"git.anygate.cloud/anygatecloud/strom/mc/level"
|
|
)
|
|
|
|
func heightmapFormat() level.StorageFormat {
|
|
return level.StorageFormat{
|
|
AvailableBpes: []uint8{9},
|
|
BiggestDirect: true,
|
|
Len: 256,
|
|
}
|
|
}
|
|
|
|
func blockStorageFormat() level.StorageFormat {
|
|
return level.StorageFormat{
|
|
AvailableBpes: []uint8{0, 4, 5, 6, 7, 8, 15},
|
|
BiggestDirect: true,
|
|
Len: 4096,
|
|
}
|
|
}
|
|
|
|
func TestStorageImportDataDirect(t *testing.T) {
|
|
format := heightmapFormat()
|
|
data := make([]uint64, 256)
|
|
data[0] = 42
|
|
|
|
s, err := format.ImportDataDirect(data)
|
|
if err != nil {
|
|
t.Fatalf("ImportDataDirect failed: %v", err)
|
|
}
|
|
|
|
got, err := s.Get(0)
|
|
if err != nil {
|
|
t.Fatalf("Get failed: %v", err)
|
|
}
|
|
if got != 42 {
|
|
t.Errorf("Get(0) = %d, want 42", got)
|
|
}
|
|
}
|
|
|
|
func TestStorageImportDataDirectMultipleBpe(t *testing.T) {
|
|
format := level.StorageFormat{
|
|
AvailableBpes: []uint8{4, 8},
|
|
BiggestDirect: true,
|
|
Len: 256,
|
|
}
|
|
|
|
_, err := format.ImportDataDirect([]uint64{1})
|
|
if err != level.AvailableBpeMustBeLenOneErr {
|
|
t.Errorf("expected AvailableBpeMustBeLenOneErr, got %v", err)
|
|
}
|
|
}
|
|
|
|
func TestStorageImportUnsortedBpe(t *testing.T) {
|
|
format := level.StorageFormat{
|
|
AvailableBpes: []uint8{9, 4},
|
|
BiggestDirect: true,
|
|
Len: 256,
|
|
}
|
|
|
|
_, err := format.Import([]uint64{1}, 4, nil)
|
|
if err != level.AvailableBpeMustBeSortedErr {
|
|
t.Errorf("expected AvailableBpeMustBeSortedErr, got %v", err)
|
|
}
|
|
}
|
|
|
|
func TestStorageGetSet(t *testing.T) {
|
|
format := blockStorageFormat()
|
|
s, err := format.Import(nil, 4, []int32{0, 1, 2, 3})
|
|
if err != nil {
|
|
t.Fatalf("Import failed: %v", err)
|
|
}
|
|
|
|
s.Set(0, 1)
|
|
s.Set(1, 2)
|
|
s.Set(2, 3)
|
|
|
|
for i, want := range []int32{1, 2, 3} {
|
|
got, err := s.Get(int32(i))
|
|
if err != nil {
|
|
t.Fatalf("Get(%d) failed: %v", i, err)
|
|
}
|
|
if got != want {
|
|
t.Errorf("Get(%d) = %d, want %d", i, got, want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestStorageOutOfBounds(t *testing.T) {
|
|
format := blockStorageFormat()
|
|
s, err := format.Import(nil, 4, []int32{0, 1})
|
|
if err != nil {
|
|
t.Fatalf("Import failed: %v", err)
|
|
}
|
|
|
|
_, err = s.Get(4096)
|
|
if err != level.OutOfBoundsErr {
|
|
t.Errorf("expected OutOfBoundsErr, got %v", err)
|
|
}
|
|
|
|
_, err = s.Get(-1)
|
|
if err != level.OutOfBoundsErr {
|
|
t.Errorf("expected OutOfBoundsErr, got %v", err)
|
|
}
|
|
}
|
|
|
|
func TestStorageBpeZero(t *testing.T) {
|
|
format := level.StorageFormat{
|
|
AvailableBpes: []uint8{0, 4, 8},
|
|
BiggestDirect: true,
|
|
Len: 64,
|
|
}
|
|
|
|
s, err := format.Import(nil, 0, []int32{42})
|
|
if err != nil {
|
|
t.Fatalf("Import failed: %v", err)
|
|
}
|
|
|
|
for i := int32(0); i < 64; i++ {
|
|
got, err := s.Get(i)
|
|
if err != nil {
|
|
t.Fatalf("Get(%d) failed: %v", i, err)
|
|
}
|
|
if got != 42 {
|
|
t.Errorf("Get(%d) = %d, want 42", i, got)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestStorageBpeZeroPaletteLen(t *testing.T) {
|
|
format := level.StorageFormat{
|
|
AvailableBpes: []uint8{0, 4, 8},
|
|
BiggestDirect: true,
|
|
Len: 64,
|
|
}
|
|
|
|
_, err := format.Import(nil, 0, []int32{1, 2})
|
|
if err != level.Bpe0PalletMustBeLenOneErr {
|
|
t.Errorf("expected Bpe0PalletMustBeLenOneErr, got %v", err)
|
|
}
|
|
}
|
|
|
|
func TestStorageResize(t *testing.T) {
|
|
format := level.StorageFormat{
|
|
AvailableBpes: []uint8{4, 8},
|
|
BiggestDirect: false,
|
|
Len: 16,
|
|
}
|
|
|
|
s, err := format.Import(nil, 4, []int32{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15})
|
|
if err != nil {
|
|
t.Fatalf("Import failed: %v", err)
|
|
}
|
|
|
|
for i := int32(0); i < 16; i++ {
|
|
s.Set(i, i)
|
|
}
|
|
|
|
for i := int32(0); i < 16; i++ {
|
|
got, err := s.Get(i)
|
|
if err != nil {
|
|
t.Fatalf("Get(%d) failed: %v", i, err)
|
|
}
|
|
if got != i {
|
|
t.Errorf("Get(%d) = %d, want %d", i, got, i)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestStorageResizePreservesData(t *testing.T) {
|
|
format := level.StorageFormat{
|
|
AvailableBpes: []uint8{4, 5, 6, 8},
|
|
BiggestDirect: false,
|
|
Len: 8,
|
|
}
|
|
|
|
s, err := format.Import(nil, 4, []int32{0, 1})
|
|
if err != nil {
|
|
t.Fatalf("Import failed: %v", err)
|
|
}
|
|
|
|
s.Set(0, 10)
|
|
s.Set(1, 20)
|
|
s.Set(2, 30)
|
|
s.Set(3, 40)
|
|
|
|
for i, want := range []int32{10, 20, 30, 40} {
|
|
got, err := s.Get(int32(i))
|
|
if err != nil {
|
|
t.Fatalf("Get(%d) failed: %v", i, err)
|
|
}
|
|
if got != want {
|
|
t.Errorf("Get(%d) = %d, want %d", i, got, want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestStoragePaletteGrowth(t *testing.T) {
|
|
format := level.StorageFormat{
|
|
AvailableBpes: []uint8{4, 5, 6, 8},
|
|
BiggestDirect: false,
|
|
Len: 16,
|
|
}
|
|
|
|
s, err := format.Import(nil, 4, []int32{0})
|
|
if err != nil {
|
|
t.Fatalf("Import failed: %v", err)
|
|
}
|
|
|
|
s.Set(0, 10)
|
|
s.Set(1, 20)
|
|
|
|
got, err := s.Get(0)
|
|
if err != nil {
|
|
t.Fatalf("Get(0) failed: %v", err)
|
|
}
|
|
if got != 10 {
|
|
t.Errorf("Get(0) = %d, want 10", got)
|
|
}
|
|
|
|
got, err = s.Get(1)
|
|
if err != nil {
|
|
t.Fatalf("Get(1) failed: %v", err)
|
|
}
|
|
if got != 20 {
|
|
t.Errorf("Get(1) = %d, want 20", got)
|
|
}
|
|
}
|
|
|
|
func TestStorageNoAvailableBpe(t *testing.T) {
|
|
format := level.StorageFormat{
|
|
AvailableBpes: []uint8{4},
|
|
BiggestDirect: false,
|
|
Len: 16,
|
|
}
|
|
|
|
s, err := format.Import(nil, 4, []int32{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15})
|
|
if err != nil {
|
|
t.Fatalf("Import failed: %v", err)
|
|
}
|
|
|
|
err = s.Set(0, 16)
|
|
if err != level.NoAvailableBpeErr {
|
|
t.Errorf("expected NoAvailableBpeErr, got %v", err)
|
|
}
|
|
}
|
|
|
|
func TestStorageBiggestDirect(t *testing.T) {
|
|
format := level.StorageFormat{
|
|
AvailableBpes: []uint8{4, 8},
|
|
BiggestDirect: true,
|
|
Len: 64,
|
|
}
|
|
|
|
s, err := format.Import(nil, 8, nil)
|
|
if err != nil {
|
|
t.Fatalf("Import failed: %v", err)
|
|
}
|
|
|
|
for i := int32(0); i < 64; i++ {
|
|
s.Set(i, i)
|
|
}
|
|
|
|
for i := int32(0); i < 64; i++ {
|
|
got, err := s.Get(i)
|
|
if err != nil {
|
|
t.Fatalf("Get(%d) failed: %v", i, err)
|
|
}
|
|
if got != i {
|
|
t.Errorf("Get(%d) = %d, want %d", i, got, i)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestStorageDirectModeNoPalette(t *testing.T) {
|
|
format := level.StorageFormat{
|
|
AvailableBpes: []uint8{9},
|
|
BiggestDirect: true,
|
|
Len: 256,
|
|
}
|
|
|
|
data := make([]uint64, 36)
|
|
data[0] = 0x1FF
|
|
|
|
s, err := format.ImportDataDirect(data)
|
|
if err != nil {
|
|
t.Fatalf("ImportDataDirect failed: %v", err)
|
|
}
|
|
|
|
got, err := s.Get(0)
|
|
if err != nil {
|
|
t.Fatalf("Get(0) failed: %v", err)
|
|
}
|
|
if got != 0x1FF {
|
|
t.Errorf("Get(0) = %d, want %d", got, 0x1FF)
|
|
}
|
|
}
|
|
|
|
func TestStorageInvalidPaletteIndex(t *testing.T) {
|
|
format := level.StorageFormat{
|
|
AvailableBpes: []uint8{4, 8},
|
|
BiggestDirect: false,
|
|
Len: 16,
|
|
}
|
|
|
|
data := []uint64{0xFFFF}
|
|
s, err := format.Import(data, 4, []int32{0, 1})
|
|
if err != nil {
|
|
t.Fatalf("Import failed: %v", err)
|
|
}
|
|
|
|
_, err = s.Get(0)
|
|
if err != level.RealInvalidPaletteIndexErr {
|
|
t.Errorf("expected RealInvalidPaletteIndexErr, got %v", err)
|
|
}
|
|
}
|
|
|
|
func TestStorageOverwrite(t *testing.T) {
|
|
format := blockStorageFormat()
|
|
s, err := format.Import(nil, 4, []int32{0, 1, 2})
|
|
if err != nil {
|
|
t.Fatalf("Import failed: %v", err)
|
|
}
|
|
|
|
s.Set(0, 1)
|
|
s.Set(0, 2)
|
|
s.Set(0, 1)
|
|
|
|
got, err := s.Get(0)
|
|
if err != nil {
|
|
t.Fatalf("Get(0) failed: %v", err)
|
|
}
|
|
if got != 1 {
|
|
t.Errorf("Get(0) = %d, want 1", got)
|
|
}
|
|
}
|
|
|
|
func TestStorageSetOutOfBounds(t *testing.T) {
|
|
format := blockStorageFormat()
|
|
s, err := format.Import(nil, 4, []int32{0, 1})
|
|
if err != nil {
|
|
t.Fatalf("Import failed: %v", err)
|
|
}
|
|
|
|
err = s.Set(4096, 1)
|
|
if err != level.OutOfBoundsErr {
|
|
t.Errorf("expected OutOfBoundsErr, got %v", err)
|
|
}
|
|
|
|
err = s.Set(-1, 1)
|
|
if err != level.OutOfBoundsErr {
|
|
t.Errorf("expected OutOfBoundsErr, got %v", err)
|
|
}
|
|
}
|
|
|
|
func TestStorageGetAfterResize(t *testing.T) {
|
|
format := level.StorageFormat{
|
|
AvailableBpes: []uint8{4, 5, 6, 8},
|
|
BiggestDirect: false,
|
|
Len: 32,
|
|
}
|
|
|
|
s, err := format.Import(nil, 4, []int32{0})
|
|
if err != nil {
|
|
t.Fatalf("Import failed: %v", err)
|
|
}
|
|
|
|
for i := int32(0); i < 16; i++ {
|
|
s.Set(i, i)
|
|
}
|
|
|
|
for i := int32(0); i < 16; i++ {
|
|
got, err := s.Get(i)
|
|
if err != nil {
|
|
t.Fatalf("Get(%d) failed: %v", i, err)
|
|
}
|
|
if got != i {
|
|
t.Errorf("Get(%d) = %d, want %d", i, got, i)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestStorageResizeDirect(t *testing.T) {
|
|
format := level.StorageFormat{
|
|
AvailableBpes: []uint8{4, 8},
|
|
BiggestDirect: true,
|
|
Len: 64,
|
|
}
|
|
|
|
s, err := format.Import(nil, 4, []int32{})
|
|
if err != nil {
|
|
t.Fatalf("Import failed: %v", err)
|
|
}
|
|
|
|
for i := int32(0); i < 64; i++ {
|
|
err = s.Set(i, i)
|
|
if err != nil {
|
|
t.Fatalf("Set(%d) failed: %v", i, err)
|
|
}
|
|
}
|
|
|
|
for i := int32(0); i < 64; i++ {
|
|
got, err := s.Get(i)
|
|
if err != nil {
|
|
t.Fatalf("Get(%d) failed: %v", i, err)
|
|
}
|
|
if got != i {
|
|
t.Errorf("Get(%d) = %d, want %d", i, got, i)
|
|
}
|
|
}
|
|
}
|