io-ts-fuzzer - Fuzzing for io-ts codecs and types
io-ts-fuzzer
lets you generate examples of a given
io-ts
type.
Please note: API elements marked @experimental
may be changed in breaking ways
(including removal) without a major version release. Don't use such APIs if
that's not acceptable for you.
Quick Start
After yarn add fp-ts io-ts io-ts-fuzzer
...
import * as t from 'io-ts';
import * as fuzz from 'io-ts-fuzzer';
const r = fuzz.createCoreRegistry();
const target = t.union([t.string, t.type({ n: t.number, b: t.boolean })]);
const fuzzer = fuzz.exampleGenerator(r, target);
for (const n of new Array(10).keys()) {
console.log(JSON.stringify(fuzzer.encode([n, fuzz.fuzzContext()])));
}
See examples/quickstart/index.ts.
Types Supported
Currently supports (along with their closure under composition):
t.array
t.boolean
t.exact
t.Int
t.intersection
t.keyof
t.literal
t.null
t.number
t.partial
t.readonly
t.readonlyArray
t.record
t.recursive
t.string
t.tuple
t.type
(interface)t.undefined
t.union
t.unknown
t.UnknownArray
t.UnknownRecord
t.void
If you yarn add monocle-ts io-ts-types
and register the
io-ts-types
extra fuzzers via
r.register(...await loadIoTsTypesFuzzers())
, the following additional types
will be supported:
date
BooleanFromString
DateFromISOString
DateFromNumber
DateFromUnixTime
IntFromString
NonEmptyString
NumberFromString
UUID
regexp
The following io-ts-types
are composed of core types and you do not need to
loadIoTsTypesFuzzers
to fuzz them:
How To
Generate Conforming Examples and Verifying Decoder Behavior
Given a d = t.Decoder<I,A>
(aka a t.Type
), fuzz.exampleGenerator
will
build a t.Encoder<[number,FuzzContext],I>
that will give example instances of
I
. The example instances should all pass on d.decode
(which should return an
identical example in the case of basic types). No exceptions should be thrown.
Configure Core Fuzzers
The FluentRegistry
interface lets you easily configure certain core fuzzers,
currently:
- maximum array length (
array
, readonlyArray
, UnknownArray
) - extra properties inserted into
partial
and type
(interface) objects - type used to fuzz
unknown
types - maximum record count (
record
, UnknownRecord
)
Fuzz Recursive Types
When fuzzing recursive types, you can provide to the context a
maxRecursionHint
which specifies the requested maximum instantiations of any
recursive type in a single path. Note that this is the maximum depth of
recursive types, not all types. If the recursive depth has been reached,
fuzzers that have a choice of which child(ren) to instantiate (like unions,
partials, or arrays) will attempt to choose children that won't recurse.
Note this is only a hint -- sometimes the type definition won't allow the fuzzer
to choose such a non-recursive path (and you'll get a stack limit error when
attempting to generate the actual example from the generator).
Generate Variations of a Type
TODO
Piping Fuzzers
TODO
License
Read the LICENSE for details.
The entire NOTICE file serves as the NOTICE that must be included
under Section 4d of the License.
# io-ts-fuzzer
This product contains software originally developed by Holvonix LLC.
Original Repository: https://github.com/holvonix-open/io-ts-fuzzer
Copyright (c) 2019 Holvonix LLC. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this software except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Dependencies may have their own licenses.