mirror of
https://github.com/schollz/cowyo.git
synced 2023-08-10 21:13:00 +03:00
175 lines
4.4 KiB
Go
175 lines
4.4 KiB
Go
|
// Copyright (c) 2012-2016 The go-diff authors. All rights reserved.
|
||
|
// https://github.com/sergi/go-diff
|
||
|
// See the included LICENSE file for license details.
|
||
|
//
|
||
|
// go-diff is a Go implementation of Google's Diff, Match, and Patch library
|
||
|
// Original library is Copyright (c) 2006 Google Inc.
|
||
|
// http://code.google.com/p/google-diff-match-patch/
|
||
|
|
||
|
package diffmatchpatch
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"testing"
|
||
|
|
||
|
"github.com/stretchr/testify/assert"
|
||
|
)
|
||
|
|
||
|
func TestMatchAlphabet(t *testing.T) {
|
||
|
type TestCase struct {
|
||
|
Pattern string
|
||
|
|
||
|
Expected map[byte]int
|
||
|
}
|
||
|
|
||
|
dmp := New()
|
||
|
|
||
|
for i, tc := range []TestCase{
|
||
|
{
|
||
|
Pattern: "abc",
|
||
|
|
||
|
Expected: map[byte]int{
|
||
|
'a': 4,
|
||
|
'b': 2,
|
||
|
'c': 1,
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
Pattern: "abcaba",
|
||
|
|
||
|
Expected: map[byte]int{
|
||
|
'a': 37,
|
||
|
'b': 18,
|
||
|
'c': 8,
|
||
|
},
|
||
|
},
|
||
|
} {
|
||
|
actual := dmp.MatchAlphabet(tc.Pattern)
|
||
|
assert.Equal(t, tc.Expected, actual, fmt.Sprintf("Test case #%d, %#v", i, tc))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestMatchBitap(t *testing.T) {
|
||
|
type TestCase struct {
|
||
|
Name string
|
||
|
|
||
|
Text string
|
||
|
Pattern string
|
||
|
Location int
|
||
|
|
||
|
Expected int
|
||
|
}
|
||
|
|
||
|
dmp := New()
|
||
|
dmp.MatchDistance = 100
|
||
|
dmp.MatchThreshold = 0.5
|
||
|
|
||
|
for i, tc := range []TestCase{
|
||
|
{"Exact match #1", "abcdefghijk", "fgh", 5, 5},
|
||
|
{"Exact match #2", "abcdefghijk", "fgh", 0, 5},
|
||
|
{"Fuzzy match #1", "abcdefghijk", "efxhi", 0, 4},
|
||
|
{"Fuzzy match #2", "abcdefghijk", "cdefxyhijk", 5, 2},
|
||
|
{"Fuzzy match #3", "abcdefghijk", "bxy", 1, -1},
|
||
|
{"Overflow", "123456789xx0", "3456789x0", 2, 2},
|
||
|
{"Before start match", "abcdef", "xxabc", 4, 0},
|
||
|
{"Beyond end match", "abcdef", "defyy", 4, 3},
|
||
|
{"Oversized pattern", "abcdef", "xabcdefy", 0, 0},
|
||
|
} {
|
||
|
actual := dmp.MatchBitap(tc.Text, tc.Pattern, tc.Location)
|
||
|
assert.Equal(t, tc.Expected, actual, fmt.Sprintf("Test case #%d, %s", i, tc.Name))
|
||
|
}
|
||
|
|
||
|
dmp.MatchThreshold = 0.4
|
||
|
|
||
|
for i, tc := range []TestCase{
|
||
|
{"Threshold #1", "abcdefghijk", "efxyhi", 1, 4},
|
||
|
} {
|
||
|
actual := dmp.MatchBitap(tc.Text, tc.Pattern, tc.Location)
|
||
|
assert.Equal(t, tc.Expected, actual, fmt.Sprintf("Test case #%d, %s", i, tc.Name))
|
||
|
}
|
||
|
|
||
|
dmp.MatchThreshold = 0.3
|
||
|
|
||
|
for i, tc := range []TestCase{
|
||
|
{"Threshold #2", "abcdefghijk", "efxyhi", 1, -1},
|
||
|
} {
|
||
|
actual := dmp.MatchBitap(tc.Text, tc.Pattern, tc.Location)
|
||
|
assert.Equal(t, tc.Expected, actual, fmt.Sprintf("Test case #%d, %s", i, tc.Name))
|
||
|
}
|
||
|
|
||
|
dmp.MatchThreshold = 0.0
|
||
|
|
||
|
for i, tc := range []TestCase{
|
||
|
{"Threshold #3", "abcdefghijk", "bcdef", 1, 1},
|
||
|
} {
|
||
|
actual := dmp.MatchBitap(tc.Text, tc.Pattern, tc.Location)
|
||
|
assert.Equal(t, tc.Expected, actual, fmt.Sprintf("Test case #%d, %s", i, tc.Name))
|
||
|
}
|
||
|
|
||
|
dmp.MatchThreshold = 0.5
|
||
|
|
||
|
for i, tc := range []TestCase{
|
||
|
{"Multiple select #1", "abcdexyzabcde", "abccde", 3, 0},
|
||
|
{"Multiple select #2", "abcdexyzabcde", "abccde", 5, 8},
|
||
|
} {
|
||
|
actual := dmp.MatchBitap(tc.Text, tc.Pattern, tc.Location)
|
||
|
assert.Equal(t, tc.Expected, actual, fmt.Sprintf("Test case #%d, %s", i, tc.Name))
|
||
|
}
|
||
|
|
||
|
// Strict location.
|
||
|
dmp.MatchDistance = 10
|
||
|
|
||
|
for i, tc := range []TestCase{
|
||
|
{"Distance test #1", "abcdefghijklmnopqrstuvwxyz", "abcdefg", 24, -1},
|
||
|
{"Distance test #2", "abcdefghijklmnopqrstuvwxyz", "abcdxxefg", 1, 0},
|
||
|
} {
|
||
|
actual := dmp.MatchBitap(tc.Text, tc.Pattern, tc.Location)
|
||
|
assert.Equal(t, tc.Expected, actual, fmt.Sprintf("Test case #%d, %s", i, tc.Name))
|
||
|
}
|
||
|
|
||
|
// Loose location.
|
||
|
dmp.MatchDistance = 1000
|
||
|
|
||
|
for i, tc := range []TestCase{
|
||
|
{"Distance test #3", "abcdefghijklmnopqrstuvwxyz", "abcdefg", 24, 0},
|
||
|
} {
|
||
|
actual := dmp.MatchBitap(tc.Text, tc.Pattern, tc.Location)
|
||
|
assert.Equal(t, tc.Expected, actual, fmt.Sprintf("Test case #%d, %s", i, tc.Name))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestMatchMain(t *testing.T) {
|
||
|
type TestCase struct {
|
||
|
Name string
|
||
|
|
||
|
Text1 string
|
||
|
Text2 string
|
||
|
Location int
|
||
|
|
||
|
Expected int
|
||
|
}
|
||
|
|
||
|
dmp := New()
|
||
|
|
||
|
for i, tc := range []TestCase{
|
||
|
{"Equality", "abcdef", "abcdef", 1000, 0},
|
||
|
{"Null text", "", "abcdef", 1, -1},
|
||
|
{"Null pattern", "abcdef", "", 3, 3},
|
||
|
{"Exact match", "abcdef", "de", 3, 3},
|
||
|
{"Beyond end match", "abcdef", "defy", 4, 3},
|
||
|
{"Oversized pattern", "abcdef", "abcdefy", 0, 0},
|
||
|
} {
|
||
|
actual := dmp.MatchMain(tc.Text1, tc.Text2, tc.Location)
|
||
|
assert.Equal(t, tc.Expected, actual, fmt.Sprintf("Test case #%d, %s", i, tc.Name))
|
||
|
}
|
||
|
|
||
|
dmp.MatchThreshold = 0.7
|
||
|
|
||
|
for i, tc := range []TestCase{
|
||
|
{"Complex match", "I am the very model of a modern major general.", " that berry ", 5, 4},
|
||
|
} {
|
||
|
actual := dmp.MatchMain(tc.Text1, tc.Text2, tc.Location)
|
||
|
assert.Equal(t, tc.Expected, actual, fmt.Sprintf("Test case #%d, %#v", i, tc))
|
||
|
}
|
||
|
}
|