summaryrefslogtreecommitdiff
path: root/distance_test.go
blob: 6fdd6d807131fbf419db269f592ad28154c487e4 (plain)
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
package lavenshtein

import "testing"

func TestDistance(t *testing.T) {
	testCases := []struct {
		a, b string
		dist int
	}{
		// empty strings
		{"", "", 0},
		{"a", "", 1},
		{"", "a", 1},
		{"abc", "", 3},
		{"", "abc", 3},

		// equal strings
		{"a", "a", 0},
		{"abc", "abc", 0},

		// only inserts
		{"a", "ab", 1},
		{"b", "ab", 1},
		{"ac", "abc", 1},
		{"abcdefg", "xabxcdxxefxgx", 6},

		// only deletes
		{"ab", "a", 1},
		{"ab", "b", 1},
		{"abc", "ac", 1},
		{"xabxcdxxefxgx", "abcdefg", 6},

		// only substitions
		{"a", "b", 1},
		{"ab", "ac", 1},
		{"abc", "axc", 1},
		{"xabxcdxxefxgx", "1ab2cd34ef5g6", 6},

		// many oprations
		{"example", "samples", 3},
		{"sturgeon", "urgently", 6},
		{"levenshtein", "frankenstein", 6},
		{"distance", "difference", 5},
		{"java was neat", "scala is great", 7},

		// utf-8
		{"тест", "Тест", 1},
		{"gross", "groß", 2},
	}

	for _, tc := range testCases {
		t.Run(tc.a+"·"+tc.b, func(t *testing.T) {
			dist := Distance(tc.a, tc.b)
			if dist != tc.dist {
				t.Errorf("got %v, want %v", dist, tc.dist)
			}
		})
	}
}