package level_test import ( "testing" "github.com/admin-else/strom/level" ) var possibleBpe = []uint8{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} func FuzzStorage(f *testing.F) { f.Add([]byte{4, 0, 1}) f.Add([]byte{4, 0, 1, 0, 2, 0, 1}) f.Add([]byte{8, 0, 10, 1, 20, 2, 30, 3, 40, 4, 50}) f.Add([]byte{4, 0, 5, 1, 10, 2, 15, 3, 20, 0, 25}) f.Add([]byte{2, 0, 1, 1, 2, 0, 3, 1, 4}) f.Add([]byte{8, 0, 42, 1, 42, 2, 42, 3, 42}) f.Fuzz(func(t *testing.T, data []byte) { if len(data) < 1 { t.Skip() } length := int(data[0])%64 + 1 s := level.NewStorage[int32](length, possibleBpe) ref := make([]int32, length) refSet := make([]bool, length) for i := 1; i+1 < len(data); i += 2 { idx := int(data[i]) % length val := int32(data[i+1]) err := s.Set(idx, val) if err == level.CannotGrowPalletErr { continue } if err != nil { t.Fatalf("unexpected error: %v", err) } ref[idx] = val refSet[idx] = true } for i := range length { if !refSet[i] { continue } got := s.Get(i) if got != ref[i] { t.Errorf("Get(%d) = %d, want %d", i, got, ref[i]) } } }) } func TestSetOverwrite(t *testing.T) { s := level.NewStorage[int32](8, []uint8{2, 4}) s.Set(0, 1) s.Set(0, 2) s.Set(0, 1) got := s.Get(0) if got != 1 { t.Errorf("Get(0) = %d, want 1 (|= does not clear old bits)", got) } } func TestResizePreservesData(t *testing.T) { s := level.NewStorage[int32](8, []uint8{2, 4}) s.Set(0, 10) s.Set(1, 20) s.Set(2, 30) s.Set(3, 40) s.Set(4, 50) for i, want := range []int32{10, 20, 30, 40} { got := s.Get(i) if got != want { t.Errorf("Get(%d) = %d, want %d (Resize repacks with old BPE)", i, got, want) } } } func TestBpeZeroSingleValue(t *testing.T) { s := level.NewStorage[int32](64, possibleBpe) s.Palette = append(s.Palette, 42) for i := range 64 { if s.Get(i) != 42 { t.Errorf("Get(%d) = %d, want 42 (BPE 0 should always return first palette entry)", i, s.Get(i)) } } s.Set(30, 42) s.Set(0, 42) for i := range 64 { if s.Get(i) != 42 { t.Errorf("Get(%d) = %d, want 42 after Set same value", i, s.Get(i)) } } } func TestBpeZeroGrowPallet(t *testing.T) { s := level.NewStorage[int32](64, possibleBpe) s.Palette = append(s.Palette, 10) s.Set(0, 10) s.Set(1, 20) if s.Get(0) != 10 { t.Errorf("Get(0) = %d, want 10 after grow from BPE 0", s.Get(0)) } if s.Get(1) != 20 { t.Errorf("Get(1) = %d, want 20 after grow from BPE 0", s.Get(1)) } } func TestResizeElementsPerLong(t *testing.T) { s := level.NewStorage[int32](8, []uint8{2, 4}) s.Set(0, 10) s.Set(1, 20) s.Set(2, 30) s.Set(3, 40) s.Set(4, 50) if s.ElementsPerLong != 16 { t.Errorf("ElementsPerLong = %d, want 16 (Resize stores old ElementsPerLong)", s.ElementsPerLong) } }