KevinStephenson
Adding in weaviate code
b110593
raw
history blame
7.21 kB
// _ _
// __ _____ __ ___ ___ __ _| |_ ___
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \
// \ V V / __/ (_| |\ V /| | (_| | || __/
// \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___|
//
// Copyright © 2016 - 2024 Weaviate B.V. All rights reserved.
//
// CONTACT: [email protected]
//
package helpers
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/weaviate/weaviate/adapters/repos/db/lsmkv/roaringset"
)
func TestAllowList(t *testing.T) {
t.Run("allowlist created with no values", func(t *testing.T) {
al := NewAllowList()
assert.Equal(t, 0, al.Len())
assert.True(t, al.IsEmpty())
assert.Equal(t, uint64(0), al.Min())
assert.Equal(t, uint64(0), al.Max())
})
t.Run("allowlist created with initial values", func(t *testing.T) {
al := NewAllowList(1, 2, 3)
assert.Equal(t, 3, al.Len())
assert.False(t, al.IsEmpty())
assert.True(t, al.Contains(1))
assert.True(t, al.Contains(2))
assert.True(t, al.Contains(3))
assert.Equal(t, uint64(1), al.Min())
assert.Equal(t, uint64(3), al.Max())
})
t.Run("allowlist with inserted values", func(t *testing.T) {
al := NewAllowList(1, 2, 3)
al.Insert(4, 5)
assert.Equal(t, 5, al.Len())
assert.False(t, al.IsEmpty())
assert.True(t, al.Contains(1))
assert.True(t, al.Contains(2))
assert.True(t, al.Contains(3))
assert.True(t, al.Contains(4))
assert.True(t, al.Contains(5))
assert.Equal(t, uint64(1), al.Min())
assert.Equal(t, uint64(5), al.Max())
})
t.Run("allowlist exported to slice", func(t *testing.T) {
al := NewAllowList(1, 2, 3)
al.Insert(4, 5)
assert.ElementsMatch(t, []uint64{1, 2, 3, 4, 5}, al.Slice())
})
t.Run("allowlist deepcopy", func(t *testing.T) {
al := NewAllowList(1, 2, 3)
copy := al.DeepCopy()
al.Insert(4, 5)
assert.Equal(t, 5, al.Len())
assert.False(t, al.IsEmpty())
assert.True(t, al.Contains(1))
assert.True(t, al.Contains(2))
assert.True(t, al.Contains(3))
assert.True(t, al.Contains(4))
assert.True(t, al.Contains(5))
assert.Equal(t, uint64(1), al.Min())
assert.Equal(t, uint64(5), al.Max())
assert.Equal(t, 3, copy.Len())
assert.False(t, copy.IsEmpty())
assert.True(t, copy.Contains(1))
assert.True(t, copy.Contains(2))
assert.True(t, copy.Contains(3))
assert.Equal(t, uint64(1), copy.Min())
assert.Equal(t, uint64(3), copy.Max())
})
t.Run("allowlist created from bitmap", func(t *testing.T) {
bm := roaringset.NewBitmap(1, 2, 3)
al := NewAllowListFromBitmap(bm)
bm.SetMany([]uint64{4, 5})
assert.Equal(t, 5, al.Len())
assert.False(t, al.IsEmpty())
assert.True(t, al.Contains(1))
assert.True(t, al.Contains(2))
assert.True(t, al.Contains(3))
assert.True(t, al.Contains(4))
assert.True(t, al.Contains(5))
assert.Equal(t, uint64(1), al.Min())
assert.Equal(t, uint64(5), al.Max())
})
t.Run("allowlist created from bitmap deepcopy", func(t *testing.T) {
bm := roaringset.NewBitmap(1, 2, 3)
al := NewAllowListFromBitmapDeepCopy(bm)
bm.SetMany([]uint64{4, 5})
assert.Equal(t, 3, al.Len())
assert.False(t, al.IsEmpty())
assert.True(t, al.Contains(1))
assert.True(t, al.Contains(2))
assert.True(t, al.Contains(3))
assert.Equal(t, uint64(1), al.Min())
assert.Equal(t, uint64(3), al.Max())
})
}
func TestAllowList_Iterator(t *testing.T) {
t.Run("empty bitmap iterator", func(t *testing.T) {
it := NewAllowList().Iterator()
id1, ok1 := it.Next()
id2, ok2 := it.Next()
assert.Equal(t, 0, it.Len())
assert.False(t, ok1)
assert.Equal(t, uint64(0), id1)
assert.False(t, ok2)
assert.Equal(t, uint64(0), id2)
})
t.Run("iterating step by step", func(t *testing.T) {
it := NewAllowList(3, 2, 1).Iterator()
id1, ok1 := it.Next()
id2, ok2 := it.Next()
id3, ok3 := it.Next()
id4, ok4 := it.Next()
assert.Equal(t, 3, it.Len())
assert.True(t, ok1)
assert.Equal(t, uint64(1), id1)
assert.True(t, ok2)
assert.Equal(t, uint64(2), id2)
assert.True(t, ok3)
assert.Equal(t, uint64(3), id3)
assert.False(t, ok4)
assert.Equal(t, uint64(0), id4)
})
t.Run("iterating in loop", func(t *testing.T) {
it := NewAllowList(3, 2, 1).Iterator()
ids := []uint64{}
for id, ok := it.Next(); ok; id, ok = it.Next() {
ids = append(ids, id)
}
assert.Equal(t, 3, it.Len())
assert.Equal(t, []uint64{1, 2, 3}, ids)
})
}
func TestAllowList_LimitedIterator(t *testing.T) {
t.Run("empty bitmap iterator", func(t *testing.T) {
it := NewAllowList().LimitedIterator(2)
id1, ok1 := it.Next()
id2, ok2 := it.Next()
assert.Equal(t, 0, it.Len())
assert.False(t, ok1)
assert.Equal(t, uint64(0), id1)
assert.False(t, ok2)
assert.Equal(t, uint64(0), id2)
})
t.Run("iterating step by step (higher limit)", func(t *testing.T) {
it := NewAllowList(3, 2, 1).LimitedIterator(4)
id1, ok1 := it.Next()
id2, ok2 := it.Next()
id3, ok3 := it.Next()
id4, ok4 := it.Next()
assert.Equal(t, 3, it.Len())
assert.True(t, ok1)
assert.Equal(t, uint64(1), id1)
assert.True(t, ok2)
assert.Equal(t, uint64(2), id2)
assert.True(t, ok3)
assert.Equal(t, uint64(3), id3)
assert.False(t, ok4)
assert.Equal(t, uint64(0), id4)
})
t.Run("iterating step by step (equal limit)", func(t *testing.T) {
it := NewAllowList(3, 2, 1).LimitedIterator(3)
id1, ok1 := it.Next()
id2, ok2 := it.Next()
id3, ok3 := it.Next()
id4, ok4 := it.Next()
assert.Equal(t, 3, it.Len())
assert.True(t, ok1)
assert.Equal(t, uint64(1), id1)
assert.True(t, ok2)
assert.Equal(t, uint64(2), id2)
assert.True(t, ok3)
assert.Equal(t, uint64(3), id3)
assert.False(t, ok4)
assert.Equal(t, uint64(0), id4)
})
t.Run("iterating step by step (lower limit)", func(t *testing.T) {
it := NewAllowList(3, 2, 1).LimitedIterator(2)
id1, ok1 := it.Next()
id2, ok2 := it.Next()
id3, ok3 := it.Next()
assert.Equal(t, 2, it.Len())
assert.True(t, ok1)
assert.Equal(t, uint64(1), id1)
assert.True(t, ok2)
assert.Equal(t, uint64(2), id2)
assert.False(t, ok3)
assert.Equal(t, uint64(0), id3)
})
t.Run("iterating in loop (higher limit)", func(t *testing.T) {
it := NewAllowList(3, 2, 1).LimitedIterator(4)
ids := []uint64{}
for id, ok := it.Next(); ok; id, ok = it.Next() {
ids = append(ids, id)
}
assert.Equal(t, 3, it.Len())
assert.Equal(t, []uint64{1, 2, 3}, ids)
})
t.Run("iterating in loop (equal limit)", func(t *testing.T) {
it := NewAllowList(3, 2, 1).LimitedIterator(3)
ids := []uint64{}
for id, ok := it.Next(); ok; id, ok = it.Next() {
ids = append(ids, id)
}
assert.Equal(t, 3, it.Len())
assert.Equal(t, []uint64{1, 2, 3}, ids)
})
t.Run("iterating in loop (lower limit)", func(t *testing.T) {
it := NewAllowList(3, 2, 1).LimitedIterator(2)
ids := []uint64{}
for id, ok := it.Next(); ok; id, ok = it.Next() {
ids = append(ids, id)
}
assert.Equal(t, 2, it.Len())
assert.Equal(t, []uint64{1, 2}, ids)
})
}