package clock //nolint:testpackage
import "testing"
// FuzzShard replays a decoded op stream against one shard,
// checking the value oracle and invariants after every op.
func FuzzShard(f *testing.F) {
f.Add([]byte{})
f.Add([]byte{0, 1, 10, 0, 2, 10, 0, 3, 10, 0, 4, 10, 1, 1, 0, 0, 5, 10})
f.Add([]byte{0, 7, 200, 0, 7, 5, 2, 7, 0, 3, 0, 0, 0, 8, 8})
f.Fuzz(func(t *testing.T, program []byte) {
const maxWeight = 32
shard := newShard[uint8, uint64](maxWeight)
shadow := make(map[uint8]uint64)
var nonce uint64
for i := 0; i+2 < len(program); i += 3 {
key := program[i+1]
weight := uint64(program[i+2])
switch program[i] % 4 {
case 0: // add
nonce++
value := nonce
admitted := shard.add(key, value, weight)
if admitted != (weight <= maxWeight) {
t.Fatalf("add(%d, w=%d) admitted=%v, want %v", key, weight, admitted, weight <= maxWeight)
}
if admitted {
shadow[key] = value
}
case 1: // get
if got, ok := shard.get(key); ok && got != shadow[key] {
t.Fatalf("get(%d) = %d, want %d", key, got, shadow[key])
}
case 2: // peek
if got, ok := shard.peek(key); ok && got != shadow[key] {
t.Fatalf("peek(%d) = %d, want %d", key, got, shadow[key])
}
case 3: // clear
shard.clear()
clear(shadow)
}
checkShard(t, shard)
}
})
}