38 lines
1.0 KiB
Go
38 lines
1.0 KiB
Go
package assertions
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/smartystreets/assertions/internal/go-diff/diffmatchpatch"
|
|
)
|
|
|
|
func composePrettyDiff(expected, actual string) string {
|
|
diff := diffmatchpatch.New()
|
|
diffs := diff.DiffMain(expected, actual, false)
|
|
if prettyDiffIsLikelyToBeHelpful(diffs) {
|
|
return fmt.Sprintf("\nDiff: '%s'", diff.DiffPrettyText(diffs))
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// prettyDiffIsLikelyToBeHelpful returns true if the diff listing contains
|
|
// more 'equal' segments than 'deleted'/'inserted' segments.
|
|
func prettyDiffIsLikelyToBeHelpful(diffs []diffmatchpatch.Diff) bool {
|
|
equal, deleted, inserted := measureDiffTypeLengths(diffs)
|
|
return equal > deleted && equal > inserted
|
|
}
|
|
|
|
func measureDiffTypeLengths(diffs []diffmatchpatch.Diff) (equal, deleted, inserted int) {
|
|
for _, segment := range diffs {
|
|
switch segment.Type {
|
|
case diffmatchpatch.DiffEqual:
|
|
equal += len(segment.Text)
|
|
case diffmatchpatch.DiffDelete:
|
|
deleted += len(segment.Text)
|
|
case diffmatchpatch.DiffInsert:
|
|
inserted += len(segment.Text)
|
|
}
|
|
}
|
|
return equal, deleted, inserted
|
|
}
|