1package arbitrary
2
3import (
4	"reflect"
5	"time"
6
7	"github.com/leanovate/gopter"
8	"github.com/leanovate/gopter/gen"
9)
10
11// Arbitraries defines a context to generate arbitrary values of any kind.
12// Values are generated by either providing a generator for a specific type
13// or by creating a generator on the fly using golang reflection.
14type Arbitraries struct {
15	generators map[reflect.Type]gopter.Gen
16}
17
18// DefaultArbitraries creates a default arbitrary context with the widest
19// possible ranges for all types.
20func DefaultArbitraries() *Arbitraries {
21	return &Arbitraries{
22		generators: map[reflect.Type]gopter.Gen{
23			reflect.TypeOf(time.Now()): gen.Time(),
24		},
25	}
26}
27
28// GenForType gets a generator for a generator for a type
29func (a *Arbitraries) GenForType(rt reflect.Type) gopter.Gen {
30	if gen, ok := a.generators[rt]; ok {
31		return gen
32	}
33	return a.genForKind(rt)
34}
35
36// RegisterGen registers a generator
37func (a *Arbitraries) RegisterGen(gen gopter.Gen) {
38	result := gen(gopter.MinGenParams)
39	rt := result.ResultType
40	a.generators[rt] = gen
41}
42