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

- 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:
2026-03-25 01:26:56 +00:00
committed by Maxim Hutz
parent 41b09ae680
commit 36d76d4929
2 changed files with 48 additions and 7 deletions

View File

@@ -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{}