115 lines
1.6 KiB
Go
115 lines
1.6 KiB
Go
package levenshtein
|
|
|
|
import (
|
|
"reflect"
|
|
"testing"
|
|
)
|
|
|
|
func TestLevenshtein2(t *testing.T) {
|
|
type args struct {
|
|
s1 []myType
|
|
s2 []myType
|
|
cost EditCost[myType]
|
|
}
|
|
tests := []struct {
|
|
name string
|
|
args args
|
|
want []Edit
|
|
}{
|
|
{
|
|
name: "test1",
|
|
args: args{
|
|
s1: []myType{
|
|
{
|
|
a: "a",
|
|
}, {
|
|
a: "b",
|
|
}, {
|
|
a: "c",
|
|
},
|
|
},
|
|
s2: []myType{
|
|
{
|
|
a: "a",
|
|
}, {
|
|
a: "d",
|
|
}, {
|
|
a: "c",
|
|
},
|
|
},
|
|
cost: EditCost[myType](func(t EditType, from, to *myType) int {
|
|
return 1
|
|
}),
|
|
},
|
|
want: []Edit{
|
|
{
|
|
Type: Replace,
|
|
Idx1: 1,
|
|
Idx2: 1,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "test2 - costly replace",
|
|
args: args{
|
|
s1: []myType{
|
|
{
|
|
a: "a",
|
|
}, {
|
|
a: "b",
|
|
}, {
|
|
a: "c",
|
|
},
|
|
},
|
|
s2: []myType{
|
|
{
|
|
a: "a",
|
|
}, {
|
|
a: "d",
|
|
}, {
|
|
a: "c",
|
|
},
|
|
},
|
|
cost: EditCost[myType](func(t EditType, from, to *myType) int {
|
|
if t == Replace {
|
|
return 100
|
|
}
|
|
return 1
|
|
}),
|
|
},
|
|
want: []Edit{
|
|
{
|
|
Type: Delete,
|
|
Idx1: 2,
|
|
Idx2: 0,
|
|
},
|
|
{
|
|
Type: Insert,
|
|
Idx1: 1,
|
|
Idx2: 2,
|
|
},
|
|
{
|
|
Type: Delete,
|
|
Idx1: 1,
|
|
Idx2: 0,
|
|
},
|
|
{
|
|
Type: Insert,
|
|
Idx1: 0,
|
|
Idx2: 1,
|
|
},
|
|
},
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
if got := Levenshtein(tt.args.s1, tt.args.s2, tt.args.cost); !reflect.DeepEqual(got, tt.want) {
|
|
t.Errorf("Levenshtein() = %v, want %v", got, tt.want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
type myType struct {
|
|
a string
|
|
}
|