-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdiff.go
67 lines (55 loc) · 1.75 KB
/
diff.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
package main
import "github.com/sergi/go-diff/diffmatchpatch"
func responseChanged(baselineResponses []ResponseData, new ResponseData, equalCheck bool) bool {
for _, baseline := range baselineResponses {
if equalCheck && responsesAreEqual(baseline, new) {
return false
} else if !equalCheck && responsesAreSimilar(baseline, new) {
return false
}
}
return true // Response is different from all baselines; significant change detected
}
func responsesAreSimilar(a, b ResponseData) bool {
similarityThreshold := 0.9
similarity := 1.0
if len(a.Body) != len(b.Body) {
similarity = computeSimilarity(a.Body, b.Body)
}
return a.StatusCode == b.StatusCode &&
a.Reflections == b.Reflections &&
similarity >= similarityThreshold
}
func responsesAreEqual(a, b ResponseData) bool {
return a.StatusCode == b.StatusCode &&
a.Reflections == b.Reflections &&
len(a.Body) == len(b.Body)
}
func baselineResponsesAreConsistent(baselineResponses []ResponseData, compareFunc func(ResponseData, ResponseData) bool) bool {
for i := 0; i < len(baselineResponses); i++ {
for j := i + 1; j < len(baselineResponses); j++ {
if !compareFunc(baselineResponses[i], baselineResponses[j]) {
return false
}
}
}
return true
}
func computeSimilarity(aBody, bBody []byte) float64 {
aText := string(aBody)
bText := string(bBody)
dmp := diffmatchpatch.New()
diffs := dmp.DiffMain(aText, bText, false)
distance := dmp.DiffLevenshtein(diffs)
// Calculate the maximum possible distance
maxLen := len(aText)
if len(bText) > maxLen {
maxLen = len(bText)
}
if maxLen == 0 {
return 1.0 // Both strings are empty, so they are identical
}
// Compute similarity as (1 - (distance / maxLen))
similarity := 1 - float64(distance)/float64(maxLen)
return similarity
}