diff options
Diffstat (limited to 'tests/fuzz/vector/pds.go')
-rw-r--r-- | tests/fuzz/vector/pds.go | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/tests/fuzz/vector/pds.go b/tests/fuzz/vector/pds.go index 2e193f2..d4dfea7 100644 --- a/tests/fuzz/vector/pds.go +++ b/tests/fuzz/vector/pds.go @@ -1,4 +1,140 @@ package pds +import ( + "os" + "testing" + "testing/internal/testdeps" +) + + + +type opType uint8 +const ( + opType_NewVectorEmpty opType = iota + opType_NewVector + opType_NewVectorOfEmpty + opType_NewVectorOf + opType_Len + opType_Get + opType_Set + opType_Append + opType_Prepend + opType_Slice +) + +var ( + opTable = []opType{ + opType_NewVectorEmpty, + opType_NewVector, + opType_NewVectorOfEmpty, + opType_NewVectorOf, + opType_Len, + opType_Get, + opType_Set, + opType_Append, + opType_Prepend, + opType_Slice, + } +) + + + +func asOp(n uint8) opType { + idx := n % uint8(len(opTable)) + return opTable[idx] +} + +func fn(f *testing.F) { + f.Fuzz(func( + t *testing.T, + operations []uint8, + i int, + j int, + a1 byte, + a2 []byte, + ) { + builtin := []byte{} + persistent := NewVector[byte]() + for _, operation := range operations { + switch asOp(operation) { + case opType_NewVectorEmpty: + builtin = []byte{} + persistent = NewVector[byte]() + case opType_NewVector: + builtin = []byte{} + builtin = append(builtin, a2...) + persistent = NewVector(a2...) + case opType_NewVectorOfEmpty: + builtin = []byte{} + persistent = NewVectorOf([]byte{}) + case opType_NewVectorOf: + builtin = []byte{} + builtin = append(builtin, a2...) + persistent = NewVectorOf(a2) + case opType_Len: + if len(builtin) != persistent.Len() { + t.Errorf( + "bad length: %v != %v", + len(builtin), + persistent.Len(), + ) + } + case opType_Get: + if i >= len(builtin) || i < 0 { + break + } + lhs := builtin[i] + rhs := persistent.Get(i) + if lhs != rhs { + t.Errorf( + "bad Get: %v != %v", + lhs, + rhs, + ) + } + case opType_Set: + if i >= len(builtin) || i < 0 { + break + } + builtin[i] = a1 + persistent = persistent.Set(i, a1) + case opType_Append: + builtin = append(builtin, a1) + persistent = persistent.Append(a1) + case opType_Prepend: + pre := []byte{a1} + builtin = append(pre, builtin...) + persistent = persistent.Prepend(a1) + case opType_Slice: + if i > j { + break + } + if i >= len(builtin) || i < 0 { + break + } + if j >= len(builtin) || j < 0 { + break + } + builtin = builtin[i:j] + persistent = persistent.Slice(i, j) + default: + panic("bad op") + } + } + }) +} + + + func MainTest() { + fuzzTargets := []testing.InternalFuzzTarget{ + { "vector model", fn }, + } + + deps := testdeps.TestDeps{} + tests := []testing.InternalTest {} + benchmarks := []testing.InternalBenchmark{} + examples := []testing.InternalExample {} + m := testing.MainStart(deps, tests, benchmarks, fuzzTargets, examples) + os.Exit(m.Run()) } |