aboutsummaryrefslogtreecommitdiff
path: root/levenshtein/generic_test.go
blob: 11c9611e6c18057c1849da59dc19314291660f31 (plain) (blame)
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
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
}