-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmutator.go
75 lines (71 loc) · 2.03 KB
/
mutator.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// Archivo: mutator.go
package mutator
type MutationAction int
const (
Replace MutationAction = iota
Insert
Delete
Bool
Swap
CaseChange
Duplicate
Reverse
VowelChange
Pick
RandomWord
FakeWord
HtmlElement
BoundaryValues
RandomJSON
)
func New(config *Config) *Mutator {
if config == nil {
config = &Config{}
}
if config.MutationProb == 0 {
config.MutationProb = 0.1
}
if len(config.MutationTypes) == 0 {
config.MutationTypes = []MutationType{
{Type: Replace, Any: true, MutationProb: config.MutationProb},
{Type: Insert, Any: true, MutationProb: config.MutationProb},
{Type: Delete, Any: true, MutationProb: config.MutationProb},
{Type: Swap, Any: true, MutationProb: config.MutationProb},
{Type: CaseChange, Any: true, MutationProb: config.MutationProb},
{Type: Duplicate, Any: true, MutationProb: config.MutationProb},
{Type: Reverse, Any: true, MutationProb: config.MutationProb},
}
} else {
for i := range config.MutationTypes {
mt := &config.MutationTypes[i]
if !mt.Letters && !mt.Numbers && !mt.Special {
mt.Any = true
}
}
}
if config.CharSet == "" {
config.CharSet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+-=[]{}|;:',.<>/?~ "
}
if config.CharProbabilities == nil {
config.CharProbabilities = buildCharProbabilities(config.CharSet)
}
return &Mutator{
InitialText: config.InitialText,
GlobalMutationProb: config.MutationProb,
MutationTypes: config.MutationTypes,
GlobalCharSet: config.CharSet,
GlobalCharProb: config.CharProbabilities,
Prefix: config.Prefix, // Inicializa el campo Prefix
Suffix: config.Suffix, // Inicializa el campo Suffix
StaticText: config.StaticText, // Inicializa el campo StaticText
}
}
func buildCharProbabilities(charSet string) map[rune]float64 {
probabilities := make(map[rune]float64)
characters := []rune(charSet)
count := len(characters)
for _, char := range characters {
probabilities[char] = 1.0 / float64(count)
}
return probabilities
}