featurebase/shardwidth/helper_test.go
2022-09-06 09:39:22 -07:00

91 lines
2 KiB
Go

// Copyright 2022 Molecula Corp. (DBA FeatureBase).
// SPDX-License-Identifier: Apache-2.0
package shardwidth_test
import (
"math/rand"
"testing"
"github.com/featurebasedb/featurebase/v3/shardwidth"
)
type nextShardTestCase struct {
name string
haystack [][2]uint64 // stored as shard, offset pairs
shardIndexes []int
}
var nextShardTestCases = []nextShardTestCase{
{
name: "all-in-one",
haystack: [][2]uint64{
{0, 0},
{0, 1},
},
shardIndexes: []int{2},
},
{
name: "split",
haystack: [][2]uint64{
{0, 0},
{1, 1},
},
shardIndexes: []int{1, 2},
},
{
name: "two-and-one",
haystack: [][2]uint64{
{0, 0},
{0, 1},
{1, 1},
},
shardIndexes: []int{2, 3},
},
}
func TestFindShards(t *testing.T) {
for _, c := range nextShardTestCases {
haystack := make([]uint64, len(c.haystack))
for i, h := range c.haystack {
haystack[i] = (h[0] << shardwidth.Exponent) + h[1]
}
_, indexes := shardwidth.FindShards(haystack)
if len(indexes) != len(c.shardIndexes) {
t.Fatalf("%s: expected %d, got %d", c.name, c.shardIndexes, indexes)
}
for i, expected := range c.shardIndexes {
if indexes[i] != expected {
t.Fatalf("%s: expected index %d to be %d, got %d", c.name, i, expected, indexes[i])
}
}
}
// fake up some more test cases
for i := 0; i < 100; i++ {
haystack := make([]uint64, 100)
shard := uint64(0)
bit := uint64(0)
shardIndexes := []int{}
for j := range haystack {
if rand.Intn(30) == 0 {
if j > 0 {
shardIndexes = append(shardIndexes, j)
}
shard++
bit = 0
} else {
bit += uint64(rand.Intn(30))
}
haystack[j] = (shard << shardwidth.Exponent) + bit
}
shardIndexes = append(shardIndexes, len(haystack))
_, indexes := shardwidth.FindShards(haystack)
if len(indexes) != len(shardIndexes) {
t.Fatalf("trial %d: expected %d, got %d", i, shardIndexes, indexes)
}
for idx, expected := range shardIndexes {
if indexes[idx] != expected {
t.Fatalf("trial %d: expected index %d to be %d, got %d", i, idx, expected, indexes[idx])
}
}
}
}