feat: wider fuzz tests, stronger options. (#9)
All checks were successful
CI / Go Lint (push) Successful in 38s
CI / Markdown Lint (push) Successful in 12s
CI / Makefile Lint (push) Successful in 30s
CI / Unit Tests (push) Successful in 28s
CI / Fuzz Tests (push) Successful in 1m1s
CI / Mutation Tests (push) Successful in 57s
All checks were successful
CI / Go Lint (push) Successful in 38s
CI / Markdown Lint (push) Successful in 12s
CI / Makefile Lint (push) Successful in 30s
CI / Unit Tests (push) Successful in 28s
CI / Fuzz Tests (push) Successful in 1m1s
CI / Mutation Tests (push) Successful in 57s
- Added all `Option`-s to the fuzz tests. - Minimum load is always <=20%. - Tested all options, and force a panic on all invalid options. - Capacity must now be non-negative. - Minimum load should be <=20%, but just put it as a recommendation. Reviewed-on: #9 Co-authored-by: M.V. Hutz <git@maximhutz.me> Co-committed-by: M.V. Hutz <git@maximhutz.me>
This commit was merged in pull request #9.
This commit is contained in:
@@ -1,7 +1,10 @@
|
||||
package cuckoo_test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"maps"
|
||||
"math"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
@@ -25,8 +28,10 @@ type fuzzStep struct {
|
||||
}
|
||||
|
||||
type fuzzScenario struct {
|
||||
seedA, seedB uint32
|
||||
steps []fuzzStep
|
||||
seedA, seedB uint32
|
||||
capacity, growthFactor uint8
|
||||
load float64
|
||||
steps []fuzzStep
|
||||
}
|
||||
|
||||
func FuzzInsertLookup(f *testing.F) {
|
||||
@@ -40,14 +45,33 @@ func FuzzInsertLookup(f *testing.F) {
|
||||
return
|
||||
}
|
||||
|
||||
if scenario.seedA == scenario.seedB {
|
||||
return
|
||||
seedA, seedB := scenario.seedA, scenario.seedB
|
||||
growthFactor := max(2, int(scenario.growthFactor))
|
||||
capacity := int(scenario.capacity)
|
||||
minimumLoad := math.Abs(math.Mod(scenario.load, 1.0))
|
||||
|
||||
// If they are the same number, the hashes will clash, always causing an
|
||||
// error.
|
||||
if seedA == seedB {
|
||||
t.Skip()
|
||||
}
|
||||
|
||||
// If the load is too high, the hashs will not be able to allocate
|
||||
// properly.
|
||||
if minimumLoad > 0.20 {
|
||||
t.Skip()
|
||||
}
|
||||
|
||||
fmt.Fprintf(os.Stderr, "seedA=%d seedB=%d capacity=%d growthFactor=%d minimumLoad=%f\n",
|
||||
seedA, seedB, capacity, growthFactor, minimumLoad)
|
||||
|
||||
actual := cuckoo.NewCustomTable[uint32, uint32](
|
||||
offsetHash(scenario.seedA),
|
||||
offsetHash(scenario.seedB),
|
||||
offsetHash(seedA),
|
||||
offsetHash(seedB),
|
||||
func(a, b uint32) bool { return a == b },
|
||||
cuckoo.Capacity(capacity),
|
||||
cuckoo.GrowthFactor(growthFactor),
|
||||
cuckoo.MinimumLoad(minimumLoad),
|
||||
)
|
||||
|
||||
expected := map[uint32]uint32{}
|
||||
|
||||
Reference in New Issue
Block a user