create_random_bugs.go

  1package random_bugs
  2
  3import (
  4	"math/rand"
  5	"strings"
  6	"time"
  7
  8	"github.com/MichaelMure/git-bug/bug"
  9	"github.com/MichaelMure/git-bug/identity"
 10	"github.com/MichaelMure/git-bug/repository"
 11	"github.com/icrowley/fake"
 12)
 13
 14type opsGenerator func(bug.Interface, identity.Interface)
 15
 16type Options struct {
 17	BugNumber    int
 18	PersonNumber int
 19	MinOp        int
 20	MaxOp        int
 21}
 22
 23func DefaultOptions() Options {
 24	return Options{
 25		BugNumber:    15,
 26		PersonNumber: 5,
 27		MinOp:        3,
 28		MaxOp:        20,
 29	}
 30}
 31
 32func CommitRandomBugs(repo repository.ClockedRepo, opts Options) {
 33	CommitRandomBugsWithSeed(repo, opts, time.Now().UnixNano())
 34}
 35
 36func CommitRandomBugsWithSeed(repo repository.ClockedRepo, opts Options, seed int64) {
 37	bugs := GenerateRandomBugsWithSeed(opts, seed)
 38
 39	for _, b := range bugs {
 40		err := b.Commit(repo)
 41		if err != nil {
 42			panic(err)
 43		}
 44	}
 45}
 46
 47func GenerateRandomBugs(opts Options) []*bug.Bug {
 48	return GenerateRandomBugsWithSeed(opts, time.Now().UnixNano())
 49}
 50
 51func GenerateRandomBugsWithSeed(opts Options, seed int64) []*bug.Bug {
 52	rand.Seed(seed)
 53	fake.Seed(seed)
 54
 55	opsGenerators := []opsGenerator{
 56		comment,
 57		comment,
 58		title,
 59		labels,
 60		open,
 61		close,
 62	}
 63
 64	result := make([]*bug.Bug, opts.BugNumber)
 65
 66	for i := 0; i < opts.BugNumber; i++ {
 67		addedLabels = []string{}
 68
 69		b, _, err := bug.Create(
 70			randomPerson(opts.PersonNumber),
 71			time.Now().Unix(),
 72			fake.Sentence(),
 73			paragraphs(),
 74		)
 75
 76		if err != nil {
 77			panic(err)
 78		}
 79
 80		nOps := opts.MinOp
 81
 82		if opts.MaxOp > opts.MinOp {
 83			nOps += rand.Intn(opts.MaxOp - opts.MinOp)
 84		}
 85
 86		for j := 0; j < nOps; j++ {
 87			index := rand.Intn(len(opsGenerators))
 88			opsGenerators[index](b, randomPerson(opts.PersonNumber))
 89		}
 90
 91		result[i] = b
 92	}
 93
 94	return result
 95}
 96
 97func GenerateRandomOperationPacks(packNumber int, opNumber int) []*bug.OperationPack {
 98	return GenerateRandomOperationPacksWithSeed(packNumber, opNumber, time.Now().UnixNano())
 99}
100
101func GenerateRandomOperationPacksWithSeed(packNumber int, opNumber int, seed int64) []*bug.OperationPack {
102	// Note: this is a bit crude, only generate a Create + Comments
103
104	rand.Seed(seed)
105	fake.Seed(seed)
106
107	result := make([]*bug.OperationPack, packNumber)
108
109	for i := 0; i < packNumber; i++ {
110		opp := &bug.OperationPack{}
111
112		var op bug.Operation
113
114		op = bug.NewCreateOp(
115			randomPerson(5),
116			time.Now().Unix(),
117			fake.Sentence(),
118			paragraphs(),
119			nil,
120		)
121
122		opp.Append(op)
123
124		for j := 0; j < opNumber-1; j++ {
125			op = bug.NewAddCommentOp(
126				randomPerson(5),
127				time.Now().Unix(),
128				paragraphs(),
129				nil,
130			)
131			opp.Append(op)
132		}
133
134		result[i] = opp
135	}
136
137	return result
138}
139
140func person() identity.Interface {
141	return identity.NewIdentity(fake.FullName(), fake.EmailAddress())
142}
143
144var persons []identity.Interface
145
146func randomPerson(personNumber int) identity.Interface {
147	if len(persons) == 0 {
148		persons = make([]identity.Interface, personNumber)
149		for i := range persons {
150			persons[i] = person()
151		}
152	}
153
154	index := rand.Intn(personNumber)
155	return persons[index]
156}
157
158func paragraphs() string {
159	p := fake.Paragraphs()
160	return strings.Replace(p, "\t", "\n\n", -1)
161}
162
163func comment(b bug.Interface, p identity.Interface) {
164	_, _ = bug.AddComment(b, p, time.Now().Unix(), paragraphs())
165}
166
167func title(b bug.Interface, p identity.Interface) {
168	_, _ = bug.SetTitle(b, p, time.Now().Unix(), fake.Sentence())
169}
170
171func open(b bug.Interface, p identity.Interface) {
172	_, _ = bug.Open(b, p, time.Now().Unix())
173}
174
175func close(b bug.Interface, p identity.Interface) {
176	_, _ = bug.Close(b, p, time.Now().Unix())
177}
178
179var addedLabels []string
180
181func labels(b bug.Interface, p identity.Interface) {
182	var removed []string
183	nbRemoved := rand.Intn(3)
184	for nbRemoved > 0 && len(addedLabels) > 0 {
185		index := rand.Intn(len(addedLabels))
186		removed = append(removed, addedLabels[index])
187		addedLabels[index] = addedLabels[len(addedLabels)-1]
188		addedLabels = addedLabels[:len(addedLabels)-1]
189		nbRemoved--
190	}
191
192	var added []string
193	nbAdded := rand.Intn(3)
194	for i := 0; i < nbAdded; i++ {
195		label := fake.Word()
196		added = append(added, label)
197		addedLabels = append(addedLabels, label)
198	}
199
200	// ignore error
201	// if the randomisation produce no changes, no op
202	// is added to the bug
203	_, _, _ = bug.ChangeLabels(b, p, time.Now().Unix(), added, removed)
204}