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/bug/operations"
10 "github.com/MichaelMure/git-bug/repository"
11 "github.com/icrowley/fake"
12)
13
14type opsGenerator func(bug.Interface, bug.Person)
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 GenerateRandomBugs(repo repository.Repo, opts Options) {
33 GenerateRandomBugsWithSeed(repo, opts, time.Now().UnixNano())
34}
35
36func GenerateRandomBugsWithSeed(repo repository.Repo, opts Options, seed int64) {
37 rand.Seed(seed)
38 fake.Seed(seed)
39
40 opsGenerators := []opsGenerator{
41 comment,
42 comment,
43 title,
44 labels,
45 operations.Open,
46 operations.Close,
47 }
48
49 for i := 0; i < opts.BugNumber; i++ {
50 addedLabels = []string{}
51
52 b, err := operations.Create(randomPerson(opts.PersonNumber), fake.Sentence(), paragraphs())
53
54 if err != nil {
55 panic(err)
56 }
57
58 nOps := opts.MinOp + rand.Intn(opts.MaxOp-opts.MinOp)
59 for j := 0; j < nOps; j++ {
60 index := rand.Intn(len(opsGenerators))
61 opsGenerators[index](b, randomPerson(opts.PersonNumber))
62 }
63
64 err = b.Commit(repo)
65 if err != nil {
66 panic(err)
67 }
68 }
69}
70
71func person() bug.Person {
72 return bug.Person{
73 Name: fake.FullName(),
74 Email: fake.EmailAddress(),
75 }
76}
77
78var persons []bug.Person
79
80func randomPerson(personNumber int) bug.Person {
81 if len(persons) == 0 {
82 persons = make([]bug.Person, personNumber)
83 for i := range persons {
84 persons[i] = person()
85 }
86 }
87
88 index := rand.Intn(personNumber)
89 return persons[index]
90}
91
92func paragraphs() string {
93 p := fake.Paragraphs()
94 return strings.Replace(p, "\t", "\n\n", -1)
95}
96
97func comment(b bug.Interface, p bug.Person) {
98 operations.Comment(b, p, paragraphs())
99}
100
101func title(b bug.Interface, p bug.Person) {
102 operations.SetTitle(b, p, fake.Sentence())
103}
104
105var addedLabels []string
106
107func labels(b bug.Interface, p bug.Person) {
108 var removed []string
109 nbRemoved := rand.Intn(3)
110 for nbRemoved > 0 && len(addedLabels) > 0 {
111 index := rand.Intn(len(addedLabels))
112 removed = append(removed, addedLabels[index])
113 addedLabels[index] = addedLabels[len(addedLabels)-1]
114 addedLabels = addedLabels[:len(addedLabels)-1]
115 }
116
117 var added []string
118 nbAdded := rand.Intn(3)
119 for i := 0; i < nbAdded; i++ {
120 label := fake.Word()
121 added = append(added, label)
122 addedLabels = append(addedLabels, label)
123 }
124
125 operations.ChangeLabels(nil, b, p, added, removed)
126}